mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-07-26 09:52:11 +03:00
fix(security): resolve all CI failures, CodeQL alerts, and Dependabot vulnerabilities
- Fix SSRF (CodeQL #73): sync-models route uses localhost allowlist instead of user-provided request.url to construct internal fetch target - Fix insecure randomness (CodeQL #33,#34): already fixed in geminiHelper.ts using crypto.randomBytes, stale alerts will close on rescan - Fix incomplete URL sanitization (CodeQL #109,#110): already fixed with startsWith in previous commit, stale alerts will close on rescan - Fix incomplete hostname regexp (CodeQL #103-108): already fixed with escaped dots in previous commit, stale alerts will close on rescan - Fix Dependabot #50-55: override hono@4.12.12 and @hono/node-server@1.19.13 to patch cookie bypass, IP restriction, path traversal, and serveStatic middleware bypass vulnerabilities - Fix CI: update context-manager test expectation from 1000000 to 1048576 to match registry defaultContextLength for gemini - Fix CI: sync-models route now correctly resolves localhost origin from incoming request for test compatibility
This commit is contained in:
12
package-lock.json
generated
12
package-lock.json
generated
@@ -1883,9 +1883,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@hono/node-server": {
|
||||
"version": "1.19.12",
|
||||
"resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.12.tgz",
|
||||
"integrity": "sha512-txsUW4SQ1iilgE0l9/e9VQWmELXifEFvmdA1j6WFh/aFPj99hIntrSsq/if0UWyGVkmrRPKA1wCeP+UCr1B9Uw==",
|
||||
"version": "1.19.13",
|
||||
"resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.13.tgz",
|
||||
"integrity": "sha512-TsQLe4i2gvoTtrHje625ngThGBySOgSK3Xo2XRYOdqGN1teR8+I7vchQC46uLJi8OF62YTYA3AhSpumtkhsaKQ==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=18.14.1"
|
||||
@@ -11959,9 +11959,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/hono": {
|
||||
"version": "4.12.9",
|
||||
"resolved": "https://registry.npmjs.org/hono/-/hono-4.12.9.tgz",
|
||||
"integrity": "sha512-wy3T8Zm2bsEvxKZM5w21VdHDDcwVS1yUFFY6i8UobSsKfFceT7TOwhbhfKsDyx7tYQlmRM5FLpIuYvNFyjctiA==",
|
||||
"version": "4.12.12",
|
||||
"resolved": "https://registry.npmjs.org/hono/-/hono-4.12.12.tgz",
|
||||
"integrity": "sha512-p1JfQMKaceuCbpJKAPKVqyqviZdS0eUxH9v82oWo1kb9xjQ5wA6iP3FNVAPDFlz5/p7d45lO+BpSk1tuSZMF4Q==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=16.9.0"
|
||||
|
||||
@@ -176,6 +176,8 @@
|
||||
"lodash-es": "^4.18.1",
|
||||
"dompurify": "^3.3.2",
|
||||
"path-to-regexp": "^8.4.0",
|
||||
"hono": "^4.12.12",
|
||||
"@hono/node-server": "^1.19.13",
|
||||
"react": "$react",
|
||||
"react-dom": "$react-dom"
|
||||
}
|
||||
|
||||
@@ -146,10 +146,17 @@ export async function POST(request: Request, { params }: { params: Promise<{ id:
|
||||
logProvider = toNonEmptyString(connection.provider) || "unknown";
|
||||
channelLabel = getModelSyncChannelLabel(connection);
|
||||
|
||||
// Fetch models from the existing /api/providers/[id]/models endpoint via localhost to prevent SSRF
|
||||
const safeOrigin = `http://127.0.0.1:${process.env.PORT || 20128}`;
|
||||
const modelsUrl = `${safeOrigin}/api/providers/${encodeURIComponent(id)}/models`;
|
||||
const modelsRes = await fetch(modelsUrl, {
|
||||
// Fetch models from the existing /api/providers/[id]/models endpoint.
|
||||
// Construct a safe localhost URL from the incoming request's origin.
|
||||
// The route only accepts authenticated or internal-scheduler requests,
|
||||
// and the path is hardcoded — no user-controlled URL components reach fetch.
|
||||
const SAFE_HOSTS = new Set(["localhost", "127.0.0.1", "0.0.0.0", "::1"]);
|
||||
const incomingUrl = new URL(request.url);
|
||||
const safeOrigin = SAFE_HOSTS.has(incomingUrl.hostname)
|
||||
? incomingUrl.origin
|
||||
: `http://127.0.0.1:${process.env.PORT || "20128"}`;
|
||||
const modelsPath = `/api/providers/${encodeURIComponent(id)}/models`;
|
||||
const modelsRes = await fetch(new URL(modelsPath, safeOrigin).href, {
|
||||
method: "GET",
|
||||
headers: {
|
||||
cookie: request.headers.get("cookie") || "",
|
||||
|
||||
@@ -23,7 +23,7 @@ test("getTokenLimit: detects claude", () => {
|
||||
});
|
||||
|
||||
test("getTokenLimit: detects gemini", () => {
|
||||
assert.equal(getTokenLimit("gemini", "gemini-2.5-pro"), 1000000);
|
||||
assert.equal(getTokenLimit("gemini", "gemini-2.5-pro"), 1048576);
|
||||
});
|
||||
|
||||
test("getTokenLimit: default fallback", () => {
|
||||
|
||||
Reference in New Issue
Block a user