本卡屬 FR-187(母卡 CM-3711),第 3 批 D3:更新中心主系統端(頁面 API、離線上傳、診斷包)(主系統 repo
compliance-manager-be,4 檔/約 1135 行)。只掃不修。工作坊會用.claude/workshop-prompts/dispatch-<本卡號>.md當開場 prompt 直接啟動掃描,小弟不必自己打指令。
用 Claude Code 官方 claude-security plugin 掃「更新中心主系統端(頁面 API、離線上傳、診斷包)」這一塊,找出資安問題,寫成 PM 與新手工程師都看得懂的報告。只找問題、不修問題,修是另外開卡的事。
更新中心頁面背後的 API:查狀態、下載新版、排程更新、離線分塊上傳更新包、下載診斷包與升級紀錄,以及這次新加的 Agent 區(查新版、下載、推送)。
這些動作的範圍是整台機器,不是某個客戶。落地版也有子租戶(子公司),子公司的管理員如果拿得到這些權限,就能升級或降級整台主系統、下載整機的診斷資料。
背景:這一輪掃的是 2026-11-01(FR-172 開案)到 11-09 之間主專案與 jedi-remote-agent 新寫或大改的程式(FR-171/172/178/179/180/181/182),這些程式都沒掃過。
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 行。驗檔數:git -C <工作目錄> ls-files -- 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 | wc -l 應為 4。scope 外的檔不要讀,除非下面「重點看什麼」明寫「只追這幾行」;越界的發現首腦驗收時會挑掉。
首腦讀過程式碼後認為最容易出事的地方,是思考起點不是檢查清單,行號以 2026-11-09 的主線為準,對不上就以內容為準。工具不會照這份走,掃完後你要自己逐條對一遍:工具沒報的,開檔看一眼,寫「人工查過:成立/不成立/為什麼」。
require_capability,但 product_update_app_service.py:104-107 _assert_may_write 只在 SaaS 才另外要求平台管理員。落地版有子租戶時,子公司管理員被授予 system.product-update.update 能不能升級整台;確認這顆能力點是不是只能授予第一層租戶(看 core/host_capabilities.py:214-215 的宣告,只追這兩行)。ProductUpdateUploadChunkRoute(product_update_route.py:121-131)離線上傳:upload_id、index 進路徑;每塊大小、總大小、同時上傳數的上限;完成時驗章是不是在解壓前。diag_file/upgrade_log_file(走 upgrade_order.py:424-463,只追這段):job_id 形狀檢查、跳過符號連結;診斷包是整機資訊,upgrade_log_file 只要讀取能力點——落地版子公司被授予讀取就能拿到整機升級紀錄。ProductUpdateNoticeRoute 只驗登入:回的真的只有時間與版號。package_downloader.py 新增的 Agent 包路徑(:93-100):version 進檔案路徑,有沒有形狀檢查。product_update_app_service.py 新增的 Agent 相關方法:@transaction 與守門有沒有漏。FR-077(2026-09)掃過 jedi-remote-agent 與主系統接線的舊版,FR-086 掃過檔案上傳下載,FR-177(2026-11-05~07)掃過 Agent 本體;結論在主系統 repo docs/features/security-scan-consolidated/README.md,只是參照,沒有經過本棒的三人投票。