chore: update ai-review findings [ai-review-bot][failure]
This commit is contained in:
@@ -1 +1,58 @@
|
|||||||
[]
|
[
|
||||||
|
{
|
||||||
|
"level": "critical",
|
||||||
|
"role": "Assassin",
|
||||||
|
"location": "app/usage.js:106",
|
||||||
|
"problem": "函數 `isOpenRouterBaseURL` 僅使用 `new URL(baseURL).hostname.endsWith('.openrouter.ai')` 來判斷,這極易受到偽造域名攻擊(如 `openrouter.ai.malicious.com`),導致惡意主機被信任為 OpenRouter,進而洩漏 API Key。",
|
||||||
|
"suggestion": "應修改為嚴格比對,例如 `hostname === 'openrouter.ai'`,且必須包含 protocol 檢查(如 `https`),並建議採用白名單機制而非簡單的 `endsWith`。",
|
||||||
|
"is_new": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"level": "critical",
|
||||||
|
"role": "Assassin",
|
||||||
|
"location": "app/usage.js:132",
|
||||||
|
"problem": "在 `QUOTA_STRATEGIES` 中,如果 `config.apiKeys` 是一個陣列,代碼只取 `[0]` 作為 API Key,但如果這個 key 是洩漏的或是環境配置錯誤,可能會導致敏感資訊在未經嚴格驗證的情況下被發送到 `baseURL` 指定的端點。",
|
||||||
|
"suggestion": "請務必確保所有的 API 請求都經過完整的信任邊界審核,不要僅憑環境變數就自動信任該 Key 具備查詢帳號額度的權限,並在傳輸前對 baseURL 進行嚴格的白名單檢查。",
|
||||||
|
"is_new": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"level": "critical",
|
||||||
|
"role": "Mage",
|
||||||
|
"location": "app/usage.js:17",
|
||||||
|
"problem": "在 `extractUsage` 中,對於 `data.usage` 的屬性存取直接使用 `num(...)`,這在 `data.usage` 如果是 `null` 或其他 falsy 值但被 `typeof` 判斷通過時(JS 的 `typeof null === 'object'`),會導致錯誤。",
|
||||||
|
"suggestion": "應明確檢查 `u` 是否為嚴格的 `object` 且非 `null`,例如 `if (u && typeof u === 'object' && !Array.isArray(u))`。",
|
||||||
|
"is_new": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"level": "critical",
|
||||||
|
"role": "Mage",
|
||||||
|
"location": "app/usage.js:176",
|
||||||
|
"problem": "在 `fetchAccountQuota` 中,呼叫 `strategy` 時傳入的 `config` 物件,如果在特定 `strategy` 中被意外修改,會影響到全域的 config 狀態,且傳入的 `get` 函數來源若未被嚴格隔離,可能存在潛在的請求偽造風險。",
|
||||||
|
"suggestion": "傳入 `strategy` 的 config 應進行淺拷貝(shallow copy),確保不可變性。",
|
||||||
|
"is_new": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"level": "warning",
|
||||||
|
"role": "Maya",
|
||||||
|
"location": "app/resolve.js:77",
|
||||||
|
"problem": "在 `codeWindow` 函數中,缺乏對輸入的邊界檢查,特別是當 `lineNum` 為 0 或負數,或是大於總行數時,可能導致行為不預期或 slice 產生錯誤。",
|
||||||
|
"suggestion": "建議在計算 `start` 和 `end` 時,增加明確的邊界檢核與處理,確保即使 `lineNum` 異常時也能安全返回或處理。",
|
||||||
|
"is_new": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"level": "warning",
|
||||||
|
"role": "Assassin",
|
||||||
|
"problem": "在 `fetchAccountQuota` 中,使用 `axios.get` 直接請求傳入的 `baseURL`。如果 `baseURL` 是由設定檔動態讀取,攻擊者可能會透過修改設定檔將其導向惡意伺服器(SSRF),進而竊取 API Key 或發送偽造請求。",
|
||||||
|
"suggestion": "應對 `baseURL` 進行嚴格的白名單校驗,確保其僅能連線至合法的 API 提供商域名。不要信任外部設定檔中的 URL。",
|
||||||
|
"location": "app/usage.js:166",
|
||||||
|
"is_new": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"level": "warning",
|
||||||
|
"role": "Mage",
|
||||||
|
"location": "app/usage.js:115",
|
||||||
|
"problem": "在 `recordRateLimit` 中,處理 Header 時將所有 Key 轉為小寫並存入物件 `h`,如果原始 Header 中存在多個相同名稱但不同大小寫的 Header(雖然 HTTP 標準規定 Key 不區分大小寫,但某些實作可能會有不一致),可能會造成覆蓋。",
|
||||||
|
"suggestion": "雖然 HTTP 規範不區分,但為了安全起見,應先確認環境使用的 axios 版本對 Header 的處理方式,或確保在轉換前沒有遺漏必要資訊。",
|
||||||
|
"is_new": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user