FR-187 總結報告:FR-172 之後主專案異動資安掃描

FR-187 總結報告:FR-172 之後主專案異動資安掃描

掃描範圍是 2026-11-01(FR-172 開案)到 11-09 之間,主系統與 jedi-remote-agent 套件新寫或大改的程式:長輪詢通道、設定下發、金鑰登記簿、Agent 授權照、更新中心 Agent 區、系統日誌查詢、設定檔加密、容器非 root、出版管線。工具是 Claude Code 官方 claude-security plugin,每棒一位研究員讀全範圍、三位獨立檢查員對每條候選投票。首腦對每條通過的發現都開檔核對過行號,中以上的追到呼叫端。

每條的檔名、行號、修法在跨案總表 security-scan-consolidated/ §3.1 第 241~262 項;每棒的白話報告在本資料夾 reports/,套件兩棒在 jedi-packages repo docs/security-scan/FR-187/。

§1

結論

15 棒全部完成,檢查員投票每棒都跑完,沒有一棒中斷、沒有一棒缺交。找到 22 條:2 高、7 中、13 低。

最要緊的四件,都是落地版第一版就打得到的:

問題 嚴重度 總表 修正卡
正式發版的簽章步驟會執行建置機共用資料夾裡可被偷改的腳本;蓋章程式與證據分類映像都追分支最新版、沒有固定版本。改的人能用正式章對所有客戶發惡意更新 高 2、中 1 #259~261 決策者裁定先不做,未開卡
Agent 的憑證中心被加進主系統所有對外 HTTPS 的信任清單,而它會照 Agent 註冊時自填的網址簽任意網域的憑證。拿到註冊碼的人能取得 api.anthropic.com 的合法憑證,攔截網路就能偷 AI 金鑰、郵件密碼、物件儲存密鑰。預設設定就打得到 中 #254 SEC-4
主系統認 Agent 憑證只看「是自家 CA 簽的、名字是那台的指紋」,指紋又是註冊時自報的。拿兩個租戶的註冊碼就能接管另一個租戶已核准的 Agent;同一個 CA 也替未核准者簽伺服器憑證 中 2 #245、#249 SEC-3(套件);已註冊舊 Agent 升級後立刻換一次證(jedi-remote-agent 1.18.3)
落地版的出廠系統管理員角色擁有全部權限,子公司管理員自動拿到更新中心與支援頁權限,可以下載含所有公司紀錄的整機診斷包、讓整台機器升級。根因是程式假設「落地版一台機器只有一個客戶」 中 2、低 1 #252、#253、#255 SEC-1
管理員設給 Agent 的檢測工具密碼以明文永久存在 agent_requests 表,沒有任何程式會刪 中 #241 SEC-2

其餘 13 條低風險都要先控制一台 Agent、先攻破容器,或者先有主機帳號,詳見總表。

§2

各棒結果

批 棒 發現 總表
1 A1 長輪詢通道(主系統端) 中 1 #241
1 J1 長輪詢通道(套件端) 中 1 #245
1 A2 設定下發與工具帳密 中 1(與 A1 同條) #241
1 B Agent 回報事件 低 3 #242~244
2 C 金鑰登記簿、授權照開通、註冊碼 低 2 #250、#251
2 J2 Agent 註冊與通行證(套件端) 中 2(一條與 J1 同條) #245、#249
2 D1 Agent 新版下載與驗章 低 1 #246
2 D2 推送 Agent 升級與紀錄 低 3(一條與 D1 同條) #246~248
3 D3 更新中心主系統端 中 1、低 1 #252、#253
3 E 系統日誌查詢與分租戶 中 1 #255
3 F1 設定檔加密:維運指令、舊機轉換 0(工具 0 候選,人工 7 項不成立) —
3 F2 加密金鑰遷移與容器啟動 中 1 #254
4 G 容器非 root 與 compose 低 3 #256~258
4 H 出版管線與發布簽章 高 2、中 1 #259~261
4 I 證據檔、自主執行報告、測試端點 低 1(人工,未經投票) #262
§3

跨棒接縫

拆棒後沒有一個研究員一次看完整條鏈的地方,首腦驗收時串過:

  • 長輪詢的回答與回傳檔案大小:由主系統全站 110MB 上限在讀進來之前擋住。沒問題。
  • 撤銷一把金鑰後舊通行證是否失效:撤銷會寫進登記簿,驗票時每次直查、沒有快取,下一個請求就失效。沒問題。
  • 推給 Agent 的檔案雜湊:取自驗過簽章的清單,不是主系統本機重算。沒問題。
  • Agent 自報的位址會不會進前端安全白名單:埠號只收整數、主機位址不能自報、組好還會再驗格式。沒問題。
  • 落地版子公司被授權後能做多少整機的事:更新中心與支援頁兩個入口都打得到,就是 #252、#253、#255。
§4

可信度與沒查到的地方

  • 「這些存在嗎」:每條通過的發現都經三票投票,首腦也開檔核對過。
  • 「只有這些嗎」:每棒只用 low 強度跑一輪,不能保證沒有漏網的。F1 那一棒工具沒有提出任何候選,那是「沒東西可投」,不是「乾淨」。
  • 一般分支能不能拿到正式簽章的 Vault 身分,取決於 Vault 端設定,不在 repo,查不到。
  • STG 是否開著除錯模式(#262 的前提):2026-11-09 唯讀查 188 是 DEBUG=false,小弟回報有誤;#262 已由 SEC-6 修掉,掛載條件只認專用開關。
  • 系統日誌的網址欄是否可能帶 token,要追到日誌套件的寫入端,沒追。
  • 錯誤追蹤、沙箱兩顆容器實際以什麼身分執行,沒驗。
§5

修正

22 條裡有 19 條已經修完並合回主線,修正卡是 FR-188 母卡 CM-3728 底下的 SEC-1~10(CM-3748~3756、CM-3760),改到套件的部分都已發版、主系統改回釘版。出版管線三條(#259~261)決策者裁定先不做;這三條只在正式發版那一刻能被利用,建議發下一個正式版前排入。

卡 修了什麼 總表
SEC-1 落地版子公司管理員不能再碰整機的診斷包、升級紀錄與升級操作,只有總部能做;子公司仍看得到自己的系統日誌 #252、#253、#255
SEC-2 Agent 信箱裡的工具帳密改成加密落庫、用完清空 #241
SEC-3 Agent 憑證只認「簽給這台的那張」;待核准的 Agent 拿不到伺服器憑證;直推讀連線上真正出示的憑證 #245、#249
SEC-3 補 已註冊的舊 Agent 沒有釘公鑰,升級後主系統會叫它立刻換一次證,不必等到期前 90 天自動換證(一年證最長要等約 9 個月)(jedi-remote-agent 1.18.3,migration 022) #245
SEC-4 內部服務改用只簽內部名稱的專用 CA,不再把 Agent CA 放進主系統對外信任清單;Redis 密碼不上指令列;Agent 金鑰目錄真唯讀 #254、#257、#258
SEC-5 Agent 回報收緊:日誌截斷、去重鍵限長、稽核操作者核對主系統簽過的票、升級分批分租戶、升級紀錄只收真的派過的工單 #242、#243、#244、#247、#248
SEC-6 檢查更新只回必要欄位、線上開通加限流、壓測端點只認專用開關 #246、#250、#262
SEC-7、SEC-10 升級進度檔不寫管理員帳號;拆成內部檔與維護頁公開檔,公開檔升級結束 15 分鐘後自刪 #256
SEC-8 前門 nginx 只在升級期間給讀進度檔 #256
SEC-9 日誌與錯誤追蹤遮罩加上 Agent 線上開通碼 #251

每棒的驗收紀錄在 Notion 母卡 CM-3711 與各子卡「首腦復核」段,沿革見 git log。