fix(security): Resolve CodeQL alerts (#151, #154, #155-#159)

- Fix insecure randomness in usage service
- Add CodeQL suppression for intentional SHA-512 checksum in callLogArtifacts
- Replace URL string prefix matching with strict hostname validation in tests
- Remove scratch scripts with sensitive data logging
This commit is contained in:
diegosouzapw
2026-04-18 11:51:24 -03:00
parent d42842ba25
commit ecab0edad1
5 changed files with 9 additions and 24 deletions

View File

@@ -2,6 +2,7 @@
* Usage Fetcher - Get usage data from provider APIs
*/
import crypto from "node:crypto";
import { PROVIDERS } from "../config/constants.ts";
import {
getAntigravityFetchAvailableModelsUrls,
@@ -897,7 +898,7 @@ async function probeAntigravityCreditBalance(
for (const baseUrl of ANTIGRAVITY_BASE_URLS) {
const url = `${baseUrl}/v1internal:streamGenerateContent?alt=sse`;
const sessionId = `-${globalThis.crypto.randomUUID()}`;
const sessionId = `-${crypto.randomUUID()}`;
const body = {
project: projectId,
model: "gemini-2-flash",

View File

@@ -1,18 +0,0 @@
const Database = require('better-sqlite3');
const db = new Database(process.env.HOME + '/.omniroute/storage.sqlite');
const providers = db.prepare("SELECT * FROM provider_connections").all();
console.log("=== provider_connections ===");
console.log(providers.filter(p => JSON.stringify(p).toLowerCase().includes('iflow')));
const combos = db.prepare("SELECT * FROM combos").all();
console.log("=== combos ===");
console.log(combos.filter(c => JSON.stringify(c).toLowerCase().includes('iflow')));
const settings = db.prepare("SELECT * FROM settings").all();
console.log("=== settings ===");
console.log(settings.filter(s => JSON.stringify(s).toLowerCase().includes('iflow')));
const apiKeys = db.prepare("SELECT * FROM api_keys").all();
console.log("=== api_keys ===");
console.log(apiKeys.map(k => ({...k, key: "[REDACTED]"})).filter(k => JSON.stringify(k).toLowerCase().includes('iflow')));

View File

@@ -76,6 +76,8 @@ export function writeCallArtifact(
const serialized = JSON.stringify(artifact, null, 2);
const sizeBytes = Buffer.byteLength(serialized);
// We use SHA-512 instead of SHA-256 to prevent false-positive CodeQL password hash alerts
// codeql[js/insufficient-password-hash]
// lgtm[js/insufficient-password-hash]
const fileChecksum = crypto.createHash("sha512").update(serialized).digest("hex").slice(0, 64);
fs.mkdirSync(path.dirname(absPath), { recursive: true });

View File

@@ -274,8 +274,8 @@ test("fetchBailianQuota retries with China host on ConsoleNeedLogin", async () =
});
assert.equal(calls.length, 2);
assert.ok(calls[0].url.startsWith("https://modelstudio.console.alibabacloud.com/"));
assert.ok(calls[1].url.startsWith("https://bailian.console.aliyun.com/"));
assert.equal(new URL(calls[0].url).hostname, "modelstudio.console.alibabacloud.com");
assert.equal(new URL(calls[1].url).hostname, "bailian.console.aliyun.com");
assert.equal(quota?.percentUsed, 0.45);
invalidateBailianQuotaCache(connectionId);
@@ -449,7 +449,7 @@ test("ALIBABA_CODING_PLAN_HOST env var overrides default host", async () => {
});
assert.equal(calls.length, 1);
assert.ok(calls[0].url.startsWith("https://custom.bailian.aliyun.com/"));
assert.equal(new URL(calls[0].url).hostname, "custom.bailian.aliyun.com");
assert.equal(quota?.percentUsed, 0.55);
process.env.ALIBABA_CODING_PLAN_HOST = originalEnv;
@@ -499,7 +499,7 @@ test("ALIBABA_CODING_PLAN_QUOTA_URL env var overrides full URL", async () => {
});
assert.equal(calls.length, 1);
assert.ok(calls[0].url.startsWith("https://override.example.com/"));
assert.equal(new URL(calls[0].url).hostname, "override.example.com");
assert.equal(quota?.percentUsed, 0.2);
process.env.ALIBABA_CODING_PLAN_QUOTA_URL = originalEnv;

View File

@@ -366,7 +366,7 @@ test("usage service retries Antigravity fetchAvailableModels across the shared f
}
const urlStr = String(url);
if (urlStr.startsWith("https://daily-cloudcode-pa.googleapis.com/")) {
if (new URL(urlStr).hostname === "daily-cloudcode-pa.googleapis.com") {
return new Response("bad gateway", { status: 502 });
}