本卡屬 FR-187(母卡 CM-3711),第 2 批 D1:Agent 新版的下載與驗章(主系統 repo
compliance-manager-be,4 檔/約 1096 行)。只掃不修。工作坊會用.claude/workshop-prompts/dispatch-<本卡號>.md當開場 prompt 直接啟動掃描,小弟不必自己打指令。
用 Claude Code 官方 claude-security plugin 掃「Agent 新版的下載與驗章」這一塊,找出資安問題,寫成 PM 與新手工程師都看得懂的報告。只找問題、不修問題,修是另外開卡的事。
FR-172 讓主系統可以單獨向原廠更新站查 Agent 新版、下載 Agent 包,再推給各台。這一棒看下載那一段:問更新站、拿下載網址、驗發布清單的簽章、核 sha256、落檔。
下載鏈被騙一次,惡意的 Agent 包就會被主系統推到客戶所有機器上以高權限執行。主系統的更新包也走同一套驗章(package_verifier.py),這裡有洞兩邊一起破。
背景:這一輪掃的是 2026-11-01(FR-172 開案)到 11-09 之間主專案與 jedi-remote-agent 新寫或大改的程式(FR-171/172/178/179/180/181/182),這些程式都沒掃過。
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 行。驗檔數:git -C <工作目錄> ls-files -- 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 | wc -l 應為 4。scope 外的檔不要讀,除非下面「重點看什麼」明寫「只追這幾行」;越界的發現首腦驗收時會挑掉。
首腦讀過程式碼後認為最容易出事的地方,是思考起點不是檢查清單,行號以 2026-11-09 的主線為準,對不上就以內容為準。工具不會照這份走,掃完後你要自己逐條對一遍:工具沒報的,開檔看一眼,寫「人工查過:成立/不成立/為什麼」。
package_verifier.py:116-170:kid 形狀檢查、只信本機印樣目錄;expected_payload_type 擋「拿主系統的清單頂替 Agent 清單」;compare_versions 對預發版號(beta)的比較能不能被拿來降版。agent_release_service.py:127-146 bundle() 不重算整包 sha256、只比大小:落地後被換成同大小的檔,推給 Agent 時帶的 sha256 是簽過的清單裡那個,還是讀本機檔重算的。:243-260 download:續傳的 .part 檔是誰寫的、能不能被預先放一份讓它接著寫;核 sha256 在落檔前。update_site_client.py:59-80:限 https、follow_redirects=False、下載網址主機白名單;_dev_loopback 靠 ENV_LABEL 放行 http 本機——正式機的 ENV_LABEL 會不會被設成開發值。same_version.py:PRODUCT_UPDATE_ALLOW_SAME_VERSION=1 開了以後同版重套還驗不驗章;這個鍵出貨範本沒有,客戶自己加了會怎樣。FR-077(2026-09)掃過 jedi-remote-agent 與主系統接線的舊版,FR-086 掃過檔案上傳下載,FR-177(2026-11-05~07)掃過 Agent 本體;結論在主系統 repo docs/features/security-scan-consolidated/README.md,只是參照,沒有經過本棒的三人投票。