feat(ai-code-review): 建問題模式導向 issue,並整併流程調整、文件與 CI #6
@@ -1472,5 +1472,115 @@
|
|||||||
"endLine": 73,
|
"endLine": 73,
|
||||||
"problem": "新增的 `redactSecrets`/`agentFailureDetail` 會把 AI CLI 的 stderr/stdout 寫進 CI log,雖然有遮罩與限長,但沒有測試驗證常見機密格式、控制字元與長輸出邊界是否真的被處理。",
|
"problem": "新增的 `redactSecrets`/`agentFailureDetail` 會把 AI CLI 的 stderr/stdout 寫進 CI log,雖然有遮罩與限長,但沒有測試驗證常見機密格式、控制字元與長輸出邊界是否真的被處理。",
|
||||||
"reason": "Paladin:可排除(重複)。歷史 findings 已指出 redactSecrets/agentFailureDetail 對常見憑證格式、URL 帳密、控制字元、截斷與空輸出等邊界缺少測試。"
|
"reason": "Paladin:可排除(重複)。歷史 findings 已指出 redactSecrets/agentFailureDetail 對常見憑證格式、URL 帳密、控制字元、截斷與空輸出等邊界缺少測試。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"addedAt": "2026/07/20 18:45:35",
|
||||||
|
"prNumber": 6,
|
||||||
|
"reviewer": "Assassin",
|
||||||
|
"severity": "嚴重",
|
||||||
|
"file": "src/lib/review.js",
|
||||||
|
"startLine": 82,
|
||||||
|
"endLine": 85,
|
||||||
|
"problem": "攻擊者只要讓 AI CLI 失敗,就有機會把 CLI 的 stderr/stdout 片段寫進 CI log。這些輸出可能回顯送審 diff、prompt、環境診斷、token、JWT、雲端金鑰、私鑰片段或 PII;目前 `redactSecrets` 只是盡力遮罩,漏掉未列舉格式時,秘密會被長期保存在多人可讀的 workflow log。這違反「回應不得含 PII」的邊界,也把失敗路徑變成資料外洩通道。",
|
||||||
|
"reason": "Paladin:可排除(重複)。歷史 finding 已針對 AI CLI 失敗時將 stderr/stdout 片段寫入 CI log、黑名單式遮罩不足,以及機密或 PII 外洩風險提出相同問題。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"addedAt": "2026/07/20 18:45:35",
|
||||||
|
"prNumber": 6,
|
||||||
|
"reviewer": "Assassin",
|
||||||
|
"severity": "警告",
|
||||||
|
"file": "action.yml",
|
||||||
|
"startLine": 17,
|
||||||
|
"endLine": 23,
|
||||||
|
"problem": "這裡鼓勵呼叫端傳入「能觸發 CI 的 PAT」作為 action token。攻擊者若能提交 PR 並讓 workflow 在不可信程式碼上執行,就會盯上這個高權限 PAT:任何後續工具、腳本、AI CLI 或被 PR 影響的輸出路徑只要有一處外洩,就能拿到可 push、可留言、可觸發 CI 的長效憑證。自動 token 不重觸發 CI 是防遞迴與降權邊界,直接建議 PAT 等於要求使用者拆掉這道邊界。",
|
||||||
|
"reason": "Paladin:可排除(重複)。歷史 findings 已指出 action.yml 鼓勵使用可觸發 CI 的 PAT,會在不可信 PR 或受 PR 影響流程中擴大高權限憑證外洩與濫用風險。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"addedAt": "2026/07/20 18:45:35",
|
||||||
|
"prNumber": 6,
|
||||||
|
"reviewer": "Leo",
|
||||||
|
"severity": "警告",
|
||||||
|
"file": "src/index.js",
|
||||||
|
"startLine": 180,
|
||||||
|
"endLine": 397,
|
||||||
|
"problem": "`main()` 這次把留言路由、issue 暫存與建立、標籤挑選、PR 相依設定、舊留言清理、嚴重/非嚴重發布策略全部揉進同一個流程函式。六個月後要調整其中一個落地模式時,維護者必須同時理解 `ctx.createIssue`、`issueBuffer`、`issue`、`currentRunCommentIds` 與步驟順序的隱含關係,很容易在新增一個留言點時漏掉「一般模式要記 id、建問題模式要暫存或發 issue」這類規則。",
|
||||||
|
"reason": "Paladin:可排除(命中已知排除事項且重複)。既有紀錄已涵蓋 main() 內留言路由、issue 生命週期、緩衝佇列、發布策略與審查編排耦合,並提出抽離 publisher 類邊界的相同方向。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"addedAt": "2026/07/20 18:45:35",
|
||||||
|
"prNumber": 6,
|
||||||
|
"reviewer": "Leo",
|
||||||
|
"severity": "警告",
|
||||||
|
"file": "src/lib/review.js",
|
||||||
|
"startLine": 21,
|
||||||
|
"endLine": 78,
|
||||||
|
"problem": "`redactSecrets()` / `agentFailureDetail()` 新增了不少診斷輸出政策與遮罩規則,但目前是未匯出的私有函式。這段邏輯牽涉多種 token 格式、URL 帳密、控制字元與長度截斷,未來一改 regex 就可能讓 CI log 變得難除錯或遮罩失效;若只能透過攻擊方/防守方整段流程間接驗證,測試成本會很高。",
|
||||||
|
"reason": "Paladin:可排除(重複)。歷史 findings 已涵蓋 redactSecrets/agentFailureDetail 缺少直接測試、遮罩與截斷邊界難以驗證,以及診斷/遮罩職責放在 review.js 造成模組邊界不清的問題。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"addedAt": "2026/07/20 18:45:35",
|
||||||
|
"prNumber": 6,
|
||||||
|
"reviewer": "Maya",
|
||||||
|
"severity": "警告",
|
||||||
|
"file": "src/index.js",
|
||||||
|
"startLine": 184,
|
||||||
|
"endLine": 406,
|
||||||
|
"problem": "建問題模式這次新增了多個未驗證的流程分支:留言先暫存到 issueBuffer、確定 kept.length > 0 才建 issue、無保留問題/無可審查變更時靜默通過、嚴重問題才建立 PR 對 issue 的 dependency。這些都是會影響 PR 留言、issue 建立與合併阻擋的核心行為,但 diff 沒看到對應測試;目前如果某個分支漏發、誤發到 PR,或 issue 為 null 時仍呼叫 postSevereToIssue,都不會被試煉攔下來。",
|
||||||
|
"reason": "Paladin:可排除(重複)。歷史 findings 已涵蓋建問題模式的暫存留言、kept 為空靜默通過、有問題才建 issue、嚴重與非嚴重分流、dependency 與 PR 回貼等核心分支缺少測試。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"addedAt": "2026/07/20 18:45:35",
|
||||||
|
"prNumber": 6,
|
||||||
|
"reviewer": "Maya",
|
||||||
|
"severity": "警告",
|
||||||
|
"file": "src/lib/gitrepo.js",
|
||||||
|
"startLine": 102,
|
||||||
|
"endLine": 155,
|
||||||
|
"problem": "resolveMergeBase 新增了淺層 checkout 的多段 fetch fallback、每次成功 fetch 後重試 merge-base、以及最終診斷錯誤,但沒有看到測試覆蓋這些邊界與失敗路徑。這段行為依賴 git 指令順序;只要 deepen base 成功後沒有立刻回傳、HEAD 補抓用錯 ref、或全部失敗時沒有保留診斷,PR diff 基準就可能錯或完全中斷,現在沒有測試能驗證。",
|
||||||
|
"reason": "Paladin:可排除(重複)。歷史 findings 已針對 resolveMergeBase 的多階段 fetch、shallow/非 shallow 分支、成功停止條件、降級策略與最終診斷缺少測試提出相同問題。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"addedAt": "2026/07/20 18:45:35",
|
||||||
|
"prNumber": 6,
|
||||||
|
"reviewer": "Maya",
|
||||||
|
"severity": "警告",
|
||||||
|
"file": "src/lib/gitrepo.js",
|
||||||
|
"startLine": 270,
|
||||||
|
"endLine": 330,
|
||||||
|
"problem": "pushWithCredential 改成一律用 GIT_CONFIG_* 注入 Basic extraheader,並刻意清掉 checkout 持久化的自動 token;這是高風險失敗路徑與防洩漏行為,但 diff 沒有測試確認 token 不會出現在 argv、失敗錯誤不含遠端 URL/token、以及 extraheader 的兩筆設定順序正確。",
|
||||||
|
"reason": "Paladin:可排除(重複)。歷史 findings 已涵蓋 commitAndPushFindings/pushWithCredential 的認證推送策略、GIT_CONFIG 注入、token 遮蔽與失敗路徑缺少測試。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"addedAt": "2026/07/20 18:45:35",
|
||||||
|
"prNumber": 6,
|
||||||
|
"reviewer": "Maya",
|
||||||
|
"severity": "警告",
|
||||||
|
"file": "src/lib/review.js",
|
||||||
|
"startLine": 13,
|
||||||
|
"endLine": 75,
|
||||||
|
"problem": "agentFailureDetail/redactSecrets 新增了把 AI CLI stderr/stdout 寫入 CI log 的行為,且依賴遮罩、控制字元清理與長度截斷來避免外洩;但沒有看到測試驗證 token、Authorization、URL 內嵌帳密、長字串與換行控制字元都會被處理。這種失敗診斷若測試只看快樂路徑,很容易在某種輸出格式下把秘密寫進 log。",
|
||||||
|
"reason": "Paladin:可排除(重複)。歷史 findings 已逐項記錄 agentFailureDetail/redactSecrets 對 Authorization、token、URL 帳密、控制字元、截斷與 debug 開關缺少測試。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"addedAt": "2026/07/20 18:45:35",
|
||||||
|
"prNumber": 6,
|
||||||
|
"reviewer": "Maya",
|
||||||
|
"severity": "建議",
|
||||||
|
"file": "src/lib/gitea.js",
|
||||||
|
"startLine": 168,
|
||||||
|
"endLine": 194,
|
||||||
|
"problem": "addIssueDependency 新增了 Gitea endpoint 包裝,但沒有測試確認路徑與 body 的語義:URL 上的 issueNumber 是被阻擋的 PR/issue,body.index 才是 dependency。這個方向如果寫反,流程仍可能收到 2xx 或難以從單次手動測試看出錯誤。",
|
||||||
|
"reason": "Paladin:可排除(重複)。歷史 findings 已指出 addIssueDependency 缺少 endpoint、HTTP method、payload 與相依方向測試,與本條指控相同。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"addedAt": "2026/07/20 18:45:35",
|
||||||
|
"prNumber": 6,
|
||||||
|
"reviewer": "Rogue",
|
||||||
|
"severity": "警告",
|
||||||
|
"file": "src/index.js",
|
||||||
|
"startLine": 365,
|
||||||
|
"endLine": 370,
|
||||||
|
"problem": "建問題模式下把 `others` 交給 `review.postOthersToIssue` 逐條發 issue 留言,這是在拿遠端 API latency 燒時間。警告/建議通常可能比嚴重問題多很多,若有 50 條、每次 Gitea API 往返 200ms,光留言就可能多花 10 秒以上,還會增加 rate limit 壓力。",
|
||||||
|
"reason": "Paladin:可排除(重複)。歷史 finding 已指出建問題模式將警告/建議逐條發成 issue 留言,會造成 O(n) 遠端 POST、增加 CI 時間與 rate limit 壓力。"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user