---
title: FR-187 總結報告：FR-172 之後主專案異動資安掃描
status: 🏁 15 棒 2026-11-09 全部驗收完；19 條已修完（FR-188 SEC-1～10），出版管線 3 條決策者裁定先不做
---

# 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/`](../security-scan-consolidated/index.html) §3.1 第 241～262 項；每棒的白話報告在本資料夾 `reports/`，套件兩棒在 jedi-packages repo `docs/security-scan/FR-187/`。

## 結論

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、先攻破容器，或者先有主機帳號，詳見總表。

## 各棒結果

| 批 | 棒 | 發現 | 總表 |
|---|---|---|---|
| 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 |

## 跨棒接縫

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

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

## 可信度與沒查到的地方

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

## 修正

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。
