FR-187 · 需求索引 · 本頁由 build 掃資料夾生成
2026-11-01(FR-172 開案)到 11-09 之間,主專案與 jedi-remote-agent 新寫或大改的程式(長輪詢通道、設定下發、金鑰登記簿、Agent 授權照、更新中心 Agent 區、系統日誌查詢、設定檔加密、容器非 root、出版管線)做一輪 claude-security 掃描。只掃不修。
這是資安掃描系列的一支。跨 arc 的結論、修正卡狀態與覆蓋率地圖在
security-scan-consolidated/;作業手冊是.claude/skills/security-scan-lead/SKILL.md。
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 多,超過會撞上工具的看門狗誤殺);同一批四棒同時跑,每張卡只寫自己的報告與歸檔,進度表由首腦驗收時統一更新。
| 批 | 棒 | 卡 | 範圍 | 檔/行 | 狀態 |
|---|---|---|---|---|---|
| 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);報告 |
15 棒全部驗收完,22 條:2 高、7 中、13 低。總結見 SUMMARY;修正卡 SEC-1~9(CM-3748~3756)掛在 FR-188 母卡 CM-3728,出版管線三條(#259~261)決策者裁定先不做。
| 棒 | 面板 | 發現 | 總表項次 | 接縫待追 |
|---|---|---|---|---|
| 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 回報,首腦未自核 |
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/ 壓測腳本。拆棒後,跨棒的鏈沒有一個研究員一次看完,首腦驗收時自己串:
core/plugins/_agent_origins.py(前門 CSP 白名單,沒列進任何一棒):Agent 自報的位址會不會進 CSP。.claude/workshop-prompts/dispatch-<卡號>.md,開場兩行就是啟動指令,小弟不用等人打。reports/scan-<棒>-<名>.md;套件兩棒落套件 repo 卡工作區 docs/security-scan/FR-187/。docs/features/security-scan-consolidated/runs/be/;套件落套件 repo docs/security-scan/FR-187/runs/,驗收時首腦搬進總表的 runs/jedi/。沿革見 LOG 與 git log。
以下全部由 build 掃資料夾產生,新增檔案重 build 即自動出現。標題連結指向渲染後的 HTML,md 連向源檔。
證據與盤點
| 文件 | 類型 | 標題 | 最後更新 |
|---|---|---|---|
| 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 個檔)
卡片內容(決策紀錄、驗收條件)以 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 證據檔經長輪詢存取、自主執行報告、測試端點 | 驗收通過待確認 |
相關需求: