本卡屬 FR-186(Agent 本體資安掃描第二輪),第 3 批 C1:SonarQube connector(單檔)(Agent repo,1 檔/約 1711 行)。只掃不修。工作坊用
.claude/workshop-prompts/dispatch-<本卡號>.md當開場 prompt 直接啟動掃描。
用 Claude Code 官方 claude-security plugin 掃 Guidant AI Agent(repo evidence-agent)的「SonarQube connector(單檔)」,找出資安問題,寫成 PM 與新手工程師都看得懂的報告。只找問題、不修問題。
FR-177 掃過(舊卡 CM-3525),之後有改動;這次重掃要回答兩件事:上次修的有沒有守住、新改的程式有沒有新洞。 範圍按業務模組垂直切(入口→流程→資料),權限漏洞常在層與層的接縫上。
guidant_agent/scan/adapters/connectors/sonarqube.py
檔數 1、約 1711 行。驗檔數:git ls-files -- guidant_agent/scan/adapters/connectors/sonarqube.py | grep -v /tests/ | wc -l 應為 1。scope 外的檔不要當發現報;為核對呼叫端翻範圍外的檔可以,報告標「只為查證」。
首腦標的思考起點,不是檢查清單。掃完後 runner 逐條對一遍:工具沒報的,開檔看一眼寫「人工查過:成立/不成立/為什麼」。FR-177 的人工補查抓到的問題不比工具少。(以下沿用 FR-177 舊卡的重點,行號是舊版、以檔名與函式名為準。)
:836-842 git -c credential.helper= clone --depth 1 --quiet <repo_url> <source_dir>:repo_url 是 argv 一個元素(不會 shell 注入),但 git 本身會把 repo_url 當 URL 解析——ext:: transport、file://、-u 開頭被當選項(git 在 URL 位置會不會吃 --upload-pack=<cmd>?-- 分隔有沒有加);:435-443 只驗 scheme,ssh:///git@ 形式會不會走 SSH 並觸發 known_hosts 提示或帶出 Agent 的 SSH 金鑰;GIT_TERMINAL_PROMPT=0 之外 GIT_SSH_COMMAND/GIT_CONFIG_* 等 env 有沒有清。:1054-1064 sonar-scanner -Dsonar.host.url=<base_url> -Dsonar.projectKey=<project_key> -Dsonar.projectBaseDir=<source_dir>:project_key(:424)與 project_key_suffix(:452)、branch(:524)進了 -D 參數——sonar-scanner 的 -D 值會不會被當 Java properties 解析(\u 跳脫、換行開新 property);project_key 有沒有字元白名單。源碼包模式:上傳的 zip 解到 source_dir 後 sonar-scanner 會讀目錄裡的 sonar-project.properties——攻擊者在源碼包裡放一支 sonar-project.properties 就能覆寫 sonar.host.url 把 token 送到自己的伺服器、或設 sonar.scanner.javaOpts/外掛路徑;有沒有擋或用 -Dproject.settings= 指到自己的檔。:1064 env = {**os.environ, "SONAR_TOKEN": token}:整個 os.environ 繼承給子行程——Agent 的 env 裡有什麼(AGENT_* 設定、DB 路徑、其他祕密);stderr/stdout 落檔 :1179 之後報告上傳前有沒有遮 token(sonar-scanner 出錯時會印 sonar.host.url 與部分 header)。:348-355 httpx.get(...) 抓結果:verify= 有沒有設、吃的是 base_url(工具帳密裡的位址)——配合 #232(改位址沿用舊 token)就是 token 外送;重導向開不開;_error_message :385 把 server 回的錯誤原文回給使用者會不會帶出 token 或內網資訊。:475-492 源碼包 _SOURCE_FILE_KEY:解壓走 archive_safety 嗎(#226 tar 計數 DoS 這裡也吃到)、解壓目錄會不會被 symlink 指到 Agent 的 secrets/;workspace 用完有沒有刪(源碼是客戶的)。:1162-1221 _run_with_cancel:Popen(command, env=env) 無 shell,好;逾時 _terminate 先 SIGTERM 再 SIGKILL——子行程若 fork(sonar-scanner 會開 JVM)殺得到整個 process group 嗎(start_new_session/killpg;memory 記過 killpg 打不到容器 PID 1)。scan_mode(:410)的分支:「只讀既有專案結果」模式用的 project_key 是使用者給的——能不能讀到客戶 SonarQube 上其他專案的結果(token 權限範圍決定,但 Agent 有沒有限制只能讀自己建的 key)。repo_url 只能掃清冊內——確認修法還在、沒被後來的 commit 弄回去、也沒有旁路。FR-177 25 棒報告在 Agent repo docs/security-scan/FR-177/scan-*.md,已登記的 22 條在主系統 repo docs/features/security-scan-consolidated/README.md §3.1 第 219~240 項(全部已修)。已修而且修法成立的不重報;修法不完整、或同一族換個欄位又出現,才報並註明對應項次。