本卡屬 FR-186(Agent 本體資安掃描第二輪),第 2 批 K3:主控台聚合層:總覽、心跳欄位、更新頁(Agent repo,4 檔/約 754 行)。只掃不修。工作坊用
.claude/workshop-prompts/dispatch-<本卡號>.md當開場 prompt 直接啟動掃描。
用 Claude Code 官方 claude-security plugin 掃 Guidant AI Agent(repo evidence-agent)的「主控台聚合層:總覽、心跳欄位、更新頁」,找出資安問題,寫成 PM 與新手工程師都看得懂的報告。只找問題、不修問題。
FR-177 掃過(舊卡 CM-3518, CM-3510),之後有改動;這次重掃要回答兩件事:上次修的有沒有守住、新改的程式有沒有新洞。 範圍按業務模組垂直切(入口→流程→資料),權限漏洞常在層與層的接縫上。
guidant_agent/console/app/overview.py
guidant_agent/console/app/heartbeat.py
guidant_agent/console/app/targets.py
guidant_agent/console/app/update_console.py
檔數 4、約 754 行。驗檔數:git ls-files -- guidant_agent/console/app/overview.py guidant_agent/console/app/heartbeat.py guidant_agent/console/app/targets.py guidant_agent/console/app/update_console.py | grep -v /tests/ | wc -l 應為 4。scope 外的檔不要當發現報;為核對呼叫端翻範圍外的檔可以,報告標「只為查證」。
首腦標的思考起點,不是檢查清單。掃完後 runner 逐條對一遍:工具沒報的,開檔看一眼寫「人工查過:成立/不成立/為什麼」。FR-177 的人工補查抓到的問題不比工具少。(以下沿用 FR-177 舊卡的重點,行號是舊版、以檔名與函式名為準。)
inline_policy.py:69-104 decide/html_preview/apply_headers:HTML 只在「檔名 .html 且內容真是 HTML」時 inline 並帶 CSP sandbox(:86)——SVG 呢(SVG 可帶 script,image/svg+xml inline 等於 XSS);_magic_mime 用什麼判檔頭、只讀前幾 KB 會不會被「前面塞 PDF 檔頭、後面是 HTML」繞過;CSP sandbox 字串有沒有 allow-same-origin(有就讀得到 cookie);apply_headers 有沒有 X-Content-Type-Options: nosniff。body_limit.py:23-31 read_limited:先看 content_length 再 stream.read(max+1)——chunked 傳輸沒有 content_length 時走哪條;guard 掛在哪些 blueprint、有沒有漏掛的(直傳 8444 的 blob 上傳走別條,確認 files 模組自己有上限)。heartbeat.py:98 _local_admin_password() 與 :130-132 fields():心跳送回主系統的欄位有哪些——「本機管理員有沒有設密碼」這種狀態要不要出去;console_allow_cidr.get().status_fields() 會不會把安裝時的網段基線(內網拓撲)送到主系統(對照 memory「新增資料出口先查同一份資料在既有端點的守門」)。overview.py:37 build_overview(include_tools, include_targets):include_targets=True 時回目標清冊——呼叫端是哪個 scope;總覽裡有沒有把工具帳密的 configured_by、儲存 endpoint 位址原樣回。view_audit.py 看頁稽核去重 audit_once:去重 key 是什麼、記憶體會不會無限長(每個 session 每頁一筆)。targets.py(12 行)與 update_console.py(A3 已掃)只為接縫,不重報 A3 結論。update_sync.py:121-129 解更新命令:target_version、bundle_sha256、size 來自主系統——但主系統送來的 sha256 本身有沒有經過簽章?若命令只靠 8443 的 JWT 保護,拿到 JWT 的人就能指定任意 sha 配任意包。對照 A5 的 verify_payload(Ed25519 信封)有沒有用在這裡。update_sync.py:234 下載完驗 size 與 sha256 的時機:是驗完才改名成正式檔,還是先落正式檔名再驗(中間那段時間主機腳本會不會撿走)。.part 續傳時 Range 拼接後有沒有重新整檔驗。update_sync.py:137 allow_same_version() 與 :174-178 降級判定:能不能更新到比現在舊的版本(降級攻擊:把有洞的舊版裝回去)。compatible/requires_host 誰驗。cloud_tls_verify 嗎。