FR-187 · 需求索引 · 本頁由 build 掃資料夾生成

FR-187 FR-172 之後主專案異動資安掃描

2026-11-01(FR-172 開案)到 11-09 之間,主專案與 jedi-remote-agent 新寫或大改的程式(長輪詢通道、設定下發、金鑰登記簿、Agent 授權照、更新中心 Agent 區、系統日誌查詢、設定檔加密、容器非 root、出版管線)做一輪 claude-security 掃描。只掃不修。

狀態:詳見下方 文件 14 份

FR-187 FR-172 之後主專案異動資安掃描

這是資安掃描系列的一支。跨 arc 的結論、修正卡狀態與覆蓋率地圖在 security-scan-consolidated/;作業手冊是 .claude/skills/security-scan-lead/SKILL.md。

§1

這一輪掃什麼、為什麼

11/01 到 11/09 這九天,主專案扣掉文件、測試與鎖檔,有 265 支程式檔改過,八成是 FR-171(主系統與 Agent 通訊重整)、FR-172(Agent 獨立更新)、FR-178(系統日誌線上查詢)、FR-179(設定檔密碼加密存放)、FR-180(容器非 root)、FR-181(Agent 只出站通道)、FR-182(Agent 授權照)新寫的。這些程式沒進過任何一輪掃描:FR-177 與 FR-186 掃的是 Agent 本體,主系統這一側的新通道、更新中心 Agent 區、日誌查詢、加密腳本都沒人看過。

長輪詢通道一半在主專案、一半在 jedi-remote-agent 套件(端點與持有證明檢查),兩邊一起掃(J1、J2 兩棒在套件 repo)。

每棒約 1,000 行(這批程式中文 docstring 多,超過會撞上工具的看門狗誤殺);同一批四棒同時跑,每張卡只寫自己的報告與歸檔,進度表由首腦驗收時統一更新。

§2

十五棒

批 棒 卡 範圍 檔/行 狀態
1 A1 長輪詢通道(主系統端) CM-3712 主系統:core/plugins/_agent_channel.py、core/plugins/_agent_commands.py、app/remote_agent/service/agent_request_service.py、infra/remote_agent/redis_command_waiter.py等 8/1000 ✅ 驗收通過(1 中:工具帳密明文存 agent_requests,總表 #241);報告
1 J1 長輪詢通道(套件端) CM-3713 套件 jedi-remote-agent:api/routes/agent_commands_route.py、app/service/agent_command_channel_service.py、app/ports/command_channel.py、common/agent_auth/possession.py等 7/1173 ✅ 驗收通過(1 中:跨租戶冒充接管 Agent,總表 #245);報告在套件 repo docs/security-scan/FR-187/scan-J1-longpoll-package.md
1 A2 設定下發與工具帳密 CM-3714 主系統:core/plugins/_agent_config_notify.py、core/plugins/_agent_config_sections.py、app/remote_agent/service/agent_config_service.py、app/remote_agent/service/agent_command_service.py等 9/984 ✅ 驗收通過(1 中=A1 同條 #241);報告
1 B Agent 回報事件(狀態、日誌、升級進度、主控台稽核) CM-3715 主系統:core/plugins/_agent_events.py、app/remote_agent/service/agent_event_dispatcher.py、api/remote_agent/routes/agent_events_route.py、core/plugins/_agent_status.py等 10/870 ✅ 驗收通過(3 低,總表 #242~244);報告
2 C 金鑰登記簿、Agent 授權照開通、註冊碼管理 CM-3716 主系統:core/plugins/_agent_keys.py、app/remote_agent/service/trust_anchor_service.py、api/remote_agent/routes/trust_anchor_route.py、domain/remote_agent/trust_anchor_domain_service.py等 9/822 ✅ 驗收通過(2 低:總表 #250、#251);報告
2 J2 Agent 註冊、通行證與控制授權(套件端) CM-3717 套件 jedi-remote-agent:app/service/agent_enrollment_service.py、app/service/agent_enroll_token_service.py、app/service/agent_control_auth_service.py、common/agent_auth/trust_keys.py等 5/1079 ✅ 驗收通過(2 中:#245 同條、#249 CA 照自填網址簽伺服器憑證);報告在套件 repo docs/security-scan/FR-187/scan-J2-enrollment-package.md
2 D1 Agent 新版的下載與驗章 CM-3718 主系統:app/product_update/service/agent_release_service.py、app/product_update/service/package_verifier.py、app/product_update/service/same_version.py、app/product_update/service/update_site_client.py 4/1096 ✅ 驗收通過(1 低:Agent 檢查更新拿得到上次操作者帳號,總表 #246);報告
2 D2 推送 Agent 升級與升級紀錄 CM-3719 主系統:app/product_update/service/agent_rollout_service.py、app/product_update/service/agent_rollout_views.py、core/plugins/_agent_console_update.py、core/plugins/_agent_update.py等 7/1181 ✅ 驗收通過(3 低:總表 #247、#248,另一條=#246);報告
3 D3 更新中心主系統端(頁面 API、離線上傳、診斷包) CM-3720 主系統:api/product_update/routes/product_update_route.py、api/product_update/serializers/product_update.py、app/product_update/service/product_update_app_service.py、app/product_update/service/package_downloader.py 4/1135 ✅ 驗收通過(1 中 1 低:總表 #252、#253);報告
3 E 系統日誌線上查詢與日誌分租戶 CM-3721 主系統:api/support/routes/system_log_route.py、api/support/serializers/system_log.py、app/support/service/system_log_query_app_service.py、api/support/routes/agent_log_route.py等 12/1110 ✅ 驗收通過(1 中:支援頁診斷包把整機日誌交給落地版子公司,總表 #255);報告
3 F1 設定檔加密的主系統專屬部分:維運指令、舊機轉換、初始密碼、改網址 CM-3722 主系統:scripts/installer/lib/guidantai_secrets_cmds.sh、scripts/installer/lib/upgrade_convert_secrets.sh、scripts/installer/lib/root_admin_password.sh、scripts/installer/systemd/guidant-secrets.service等 7/578 ✅ 驗收通過(0 候選,淨新增 0);報告
3 F2 加密金鑰遷移與容器啟動讀設定 CM-3723 主系統:scripts/migrate_encryption_keys.py、infra/system_config/config_secret_crypto.py、config/config_loader.py、docker/production/entrypoint.sh 4/753 ✅ 驗收通過(1 中:Agent CA 被當成全程式信任根,總表 #254);報告
4 G 容器非 root 與 compose 設定 CM-3724 主系統:docker/production/docker-compose.yml、docker/init/entrypoint.sh、docker/init/Dockerfile 3/1046 ✅ 驗收通過(3 低:總表 #256~258);報告
4 H 出版管線與發布簽章 CM-3725 主系統:.gitlab/ci/common.yml、.gitlab/ci/deploy.yml、.gitlab/ci/release.yml、.gitlab/ci/test-release.yml等 10/1055 ✅ 驗收通過(2 高 1 中:總表 #259~261);報告
4 I 證據檔經長輪詢存取、自主執行報告、測試端點 CM-3726 主系統:api/common/file_protect.py、core/plugins/_file_ownership.py、infra/upload_file/remote_agent_adapter.py、core/plugins/_agent_local_runs.py等 5/1241 ✅ 驗收通過(0 條經投票成立;人工低 1:總表 #262);報告
§3

結論

15 棒全部驗收完,22 條:2 高、7 中、13 低。總結見 SUMMARY;修正卡 SEC-1~9(CM-3748~3756)掛在 FR-188 母卡 CM-3728,出版管線三條(#259~261)決策者裁定先不做。

§4

驗收結果

棒 面板 發現 總表項次 接縫待追
A1 長輪詢通道(主系統端) ✅ verified,2 候選 6 票全投,研究員 2/2 中 1:檢測工具帳密明文寫進 agent_requests.payload、永不清除(agent_request_service.py:205) #241 J1:Agent 回答 body 與回傳檔案的大小上限在哪一層擋(主系統端無;全站 MAX_CONTENT_LENGTH 110MB 是否涵蓋套件端點待 J1 確認)。A2:同一條帳密鏈的上游,修正卡等 A2 驗收後一起定
A2 設定下發與工具帳密 ✅ verified,1 候選 3 票全投,研究員 2/2 中 1:同 A1 F1,從上游 _agent_tool_credentials.py:75 進入 #241(同條) J1/J2:直推 8443 開啟後套件 AgentDataPlaneClient 有沒有驗 Agent 憑證。LDAP 全站一份的疑慮首腦已核不成立(僅落地版+synced 才下發)
B Agent 回報事件 ✅ verified,3 候選 9 票全投,研究員 2/2 低 3:日誌非文字訊息不截斷、事件去重鍵長度無上限、主控台稽核操作者由 Agent 自報 #242~244 B↔︎_agent_origins.py(CSP)首腦已核不成立:browser_port 限整數、base_url 不可自報、組好再過正規式。事件端點每台頻率上限待 J1 看套件端
J1 長輪詢通道(套件端) ✅ verified,1 候選 3 票全投,研究員 1/1 中 1:憑證只認「CA 簽+CN=自報指紋」,兩個租戶的註冊碼就能接管另一租戶已核准的 Agent(possession.py:66-74) #245 A1 接縫收尾:回答與檔案大小由全站 MAX_CONTENT_LENGTH 110MB 擋;回應日誌經 mark_password 遮。J2 接縫:#245 的修法落在註冊與發證(J2 範圍),J2 驗收時確認有沒有別的路拿到冒名憑證。C↔︎J2 撤鑰接縫照排
D1 Agent 新版的下載與驗章 ✅ verified,1 候選 3 票全投,研究員 2/2 低 1:public_check 黑名單只拿掉清單原文,回給 Agent 的有上次操作者帳號與全機版號 #246 D1↔︎D2 前半:bundle() 的 sha256 來自驗過章的清單、不是本機重算;後半(推送時帶的是不是這個值)D2 驗收時串
D2 推送 Agent 升級與升級紀錄 ✅ verified,3 候選 9 票全投,研究員 2/2 低 3:跨租戶批次號互撞、升級紀錄不限份數、立即檢查回全機紀錄(=#246) #247、#248、#246(同條) D1↔︎D2 閉合:推給 Agent 的 bundle_sha256 取驗過章的清單值(agent_rollout_service.py:325)
J2 Agent 註冊、通行證與控制授權(套件端) ✅ verified,2 候選 6 票全投,研究員 2/2 中 2:跨租戶冒名憑證(=#245);CA 照自填網址幫 pending 簽伺服器憑證,直推時可冒充 Agent(直推預設關) #245(同條)、#249 C↔︎J2 套件端閉合:驗票每次直查登記簿、無快取,revoked 不在可驗狀態內,撤銷即失效;撤銷寫入端 C 驗收時看。J1 留的「直推驗不驗 Agent 憑證」=#249
C 金鑰登記簿、Agent 授權照開通、註冊碼管理 ✅ verified,3 候選 9 票全投,研究員 2/2 低 2:線上開通無頻率限制、LC 依來源位址鎖,一人亂打鎖住所有客戶;開通碼明文進日誌 #250、#251 C↔︎J2 閉合:revoke 不准撤現行鑰、其餘寫 revoked,驗票每次直查無快取,撤銷即失效
F1 設定檔加密主系統專屬部分 ✅ verified,0 候選 0 票(沒東西可投,不等於乾淨),研究員 1/1 0;人工 7 項不成立。很低備註:config edit 被中斷時明碼副本留在 /run/guidant 到重開機(無清理 trap) — —
D3 更新中心主系統端 ✅ verified,2 候選 6 票全投,研究員 2/2 中 1 低 1:落地版子公司管理員(*.*.* 自動拿到更新中心能力點)可下載整機診斷包與升級紀錄、可讓整台升級 #252、#253 E↔︎D3 的 D3 半邊成立:_assert_may_write 落地版不檢查總部。E 半邊(日誌查詢能力點)待 E 驗收
F2 加密金鑰遷移與容器啟動讀設定 ✅ verified,1 候選 3 票全投,研究員 2/2 中 1:容器把 Agent CA 併進全程式 SSL_CERT_FILE,Agent CA 又照自填網址簽任意網域,註冊碼就能拿到 Anthropic 等網域的合法憑證 #254 與 J2 #249 同根源,但不依賴直推開關,預設就打得到;修正卡一起規劃
E 系統日誌線上查詢與日誌分租戶 ✅ verified,2 候選 6 票全投,研究員 2/2 中 1:日誌能力點改成租戶可授予、落地版守門只看能力點,子公司管理員從支援頁下載得到整機診斷包 #255 E↔︎D3 閉合:兩邊都成立,同一個「落地版一機一客戶」錯誤前提(#252、#253、#255 併一張卡)。日誌查詢頁本身走 RLS 沒問題
G 容器非 root 與 compose 設定 ✅ verified,3 候選 9 票全投,研究員 1/1 低 3:升級進度檔免登入公開含管理員帳號、Redis 密碼在指令列、Agent 金鑰目錄唯讀形同虛設 #256~258 bugsink/sandbox 沒寫 user:,執行身分看 image,未驗
H 出版管線與發布簽章 ✅ verified,4 候選 12 票全投,研究員 1/1 高 2 中 1:發版 job 跑 188 共用工作樹可被偷改的腳本(只比 HEAD 不比乾淨、PATH 先找共用 venv);蓋章 CLI 追 update-center 分支頭;證據分類映像追 jedi 分支頭 #259~261 一般分支能否拿 release-ci Vault 角色全靠 Vault 端綁受保護 tag,repo 端無法查證
I 證據檔、自主執行報告、測試端點 ✅ verified,2 候選 6 票全投、皆 0:3 否決,研究員 2/2 0 經投票;人工低 1:DEBUG 開著就掛出免登入、會佔執行緒的壓測端點 #262 STG 現況 DEBUG=true 為 runner 回報,首腦未自核
§5

不掃的與跟其他掃描的重複

  • FR-186(Agent 本體第二輪,母卡 CM-3675) 只掃 Agent repo,與本案 15 棒沒有共同的檔。
  • 主系統 scripts/installer/lib/secrets.sh、tpm.sh:Agent 的同名檔是從這兩支複製的,差異只有路徑常數與單檔處理,FR-186 H3(CM-3706)已排掃。本案不重掃,H3 的發現兩邊一起修;F1 只掃主系統獨有的周邊。
  • infra/cloud_integration/crypto/fernet_crypto.py:09-25 掃過,之後只改一行。
  • 其餘舊輪掃過的檔(diag_db_reader.py、config_loader.py、remote_agent_adapter.py、套件的 assembly.py/routing.py/agent_enrollment_service.py/agent_enroll_token_service.py/jwt_util.py),之後都改了 66~312 行,或在舊輪時還不存在(possession.py、trust_keys.py、agent_commands_route.py、agent_control_auth_service.py),照排。
  • 整份不掃:出貨基線 scripts/init/02-schema.sql(自動產生)與 seed SQL、poetry.lock、建置演練腳本與 bats 測試、文件站工具、scripts/dev/ 壓測腳本。
§6

驗收時要串的接縫

拆棒後,跨棒的鏈沒有一個研究員一次看完,首腦驗收時自己串:

  • A1(主系統敲鈴、收回答)↔︎ J1(套件端點、持有證明):回答歸屬與暫存檔大小上限到底在哪一層擋。
  • C(金鑰登記簿)↔︎ J2(套件驗票按 kid 找鑰):撤銷一把鑰匙後,舊票是不是兩邊都立刻失效。
  • D1(下載驗章)↔︎ D2(推送):推給 Agent 的 sha256 是簽過的那個、不是本機重算的。
  • B(Agent 自報狀態)↔︎ core/plugins/_agent_origins.py(前門 CSP 白名單,沒列進任何一棒):Agent 自報的位址會不會進 CSP。
  • E(日誌分租戶)↔︎ D3(更新中心能力點):落地版子公司被授予能力點後,看得到、做得到多少整機的事。
§7

座標

  • 啟動檔:本 repo .claude/workshop-prompts/dispatch-<卡號>.md,開場兩行就是啟動指令,小弟不用等人打。
  • 報告:主系統各棒落本資料夾 reports/scan-<棒>-<名>.md;套件兩棒落套件 repo 卡工作區 docs/security-scan/FR-187/。
  • run 歸檔:主系統落 docs/features/security-scan-consolidated/runs/be/;套件落套件 repo docs/security-scan/FR-187/runs/,驗收時首腦搬進總表的 runs/jedi/。

沿革見 LOG 與 git log。

§8

文件

以下全部由 build 掃資料夾產生,新增檔案重 build 即自動出現。標題連結指向渲染後的 HTML,md 連向源檔。

交付與收口

文件 類型 標題 最後更新
SUMMARY / md 收口總結 FR-187 總結報告:FR-172 之後主專案異動資安掃描 2026-11-09

reports/(13 份)

證據與盤點

文件 類型 標題 最後更新
scan-A1-longpoll-host / md 盤點證據 A1 長輪詢通道(主系統端)資安掃描報告 2026-11-09
scan-A2-config-credentials / md 盤點證據 FR-187.A2 掃描報告:設定下發與工具帳密 2026-11-09
scan-B-agent-events / md 盤點證據 FR-187.B 掃描報告:Agent 回報事件(狀態、日誌、升級進度、主控台稽核) 2026-11-09
scan-C-trust-keys-license / md 盤點證據 FR-187.C 掃描報告:金鑰登記簿、Agent 授權照開通、註冊碼管理 2026-11-09
scan-D1-agent-release-download / md 盤點證據 FR-187 D1 掃描報告:Agent 新版的下載與驗章 2026-11-09
scan-D2-agent-rollout / md 盤點證據 FR-187.D2 資安掃描:主系統「推送 Agent 升級與升級紀錄」 2026-11-09
scan-D3-product-update-host / md 盤點證據 FR-187 D3 掃描報告:更新中心主系統端(頁面 API、離線上傳、診斷包) 2026-11-09
scan-E-system-log-viewer / md 盤點證據 FR-187 E 掃描報告:系統日誌線上查詢與日誌分租戶 2026-11-09
scan-F1-secrets-cli-site / md 盤點證據 FR-187 F1 掃描報告:設定檔加密的主系統專屬部分(維運指令、舊機轉換、初始密碼、改網址) 2026-11-09
scan-F2-key-migration-startup / md 盤點證據 FR-187.F2 掃描報告:加密金鑰遷移與容器啟動讀設定 2026-11-09
scan-G-compose-nonroot / md 盤點證據 FR-187 G 掃描報告:容器非 root 與 compose 設定 2026-11-09
scan-H-ci-release-signing / md 盤點證據 FR-187.H 掃描報告:出版管線與發布簽章 2026-11-09
scan-I-file-download-local-runs / md 盤點證據 FR-187.I 掃描報告:證據檔經長輪詢存取、自主執行報告、測試端點 2026-11-09

資產子資料夾(無文件,不建頁):reports/(1 個檔)

§9

Notion 卡

卡片內容(決策紀錄、驗收條件)以 Notion 為準,本頁只記座標。

關係 卡號 標題 狀態
母案 CM-3711 FR-187 FR-172 之後主專案異動資安掃描(15 棒 4 批,含 jedi-remote-agent,只掃不修,Opus 1M effort low) —
子卡 CM-3712 A1 長輪詢通道(主系統端) 驗收通過待確認
子卡 CM-3713 J1 長輪詢通道(套件端) 驗收通過待確認
子卡 CM-3714 A2 設定下發與工具帳密 驗收通過待確認
子卡 CM-3715 B Agent 回報事件(狀態、日誌、升級進度、主控台稽核) 驗收通過待確認
子卡 CM-3716 C 金鑰登記簿、Agent 授權照開通、註冊碼管理 驗收通過待確認
子卡 CM-3717 J2 Agent 註冊、通行證與控制授權(套件端) 驗收通過待確認
子卡 CM-3718 D1 Agent 新版的下載與驗章 驗收通過待確認
子卡 CM-3719 D2 推送 Agent 升級與升級紀錄 驗收通過待確認
子卡 CM-3720 D3 更新中心主系統端(頁面 API、離線上傳、診斷包) 驗收通過待確認
子卡 CM-3721 E 系統日誌線上查詢與日誌分租戶 驗收通過待確認
子卡 CM-3722 F1 設定檔加密的主系統專屬部分:維運指令、舊機轉換、初始密碼、改網址 驗收通過待確認
子卡 CM-3723 F2 加密金鑰遷移與容器啟動讀設定 驗收通過待確認
子卡 CM-3724 G 容器非 root 與 compose 設定 驗收通過待確認
子卡 CM-3725 H 出版管線與發布簽章 驗收通過待確認
子卡 CM-3726 I 證據檔經長輪詢存取、自主執行報告、測試端點 驗收通過待確認