Guidant AI 資安檢視總報告 · 連線清單
代理程式連客戶自己架的掃描工具伺服器——叫 OpenVAS 建掃描、叫 ZAP 掃網站、把 sonar-scanner 的結果推給 SonarQube。位址與帳密全是客戶在設定頁填的。掃描六頁沒有一條落在這條線上;但它連的是客戶內網裡權限最高的幾台機器之一(弱點掃描器知道全網的洞)。這一頁回答:這條線怎麼連、哪些功能走它、依特性可能有什麼威脅、我們要怎麼防、目前做到哪。
這一頁怎麼來的:DFD Level 0 把產品運作時的連線編成 C01~C25;STRIDE 六頁每一條問題都標了發生在哪幾條線。這條線零命中——agent 的 connector 層不在掃描範圍。第四段寫的是依這條線的特性可能的手法,沒有掃描實例。
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#E2F0F1','primaryTextColor':'#14201F','primaryBorderColor':'#0E7C86','secondaryColor':'#EEF2F3','secondaryTextColor':'#14201F','tertiaryColor':'#FBFCFC','tertiaryTextColor':'#14201F','lineColor':'#4A5A5C','textColor':'#14201F','mainBkg':'#E2F0F1','nodeBorder':'#0E7C86','nodeTextColor':'#14201F','edgeLabelBackground':'#FBFCFC','titleColor':'#14201F','clusterBkg':'#FBFCFC','clusterBorder':'#E4EAEB'}}}%%
flowchart LR
API["guidant-api<br/>派工時解密工具帳密"]
subgraph AGENTBOX["🏢 客戶機房"]
direction LR
AG["evidence-agent<br/>connector:openvas/zap/sonarqube"]
OV(["OpenVAS/GVM<br/>GMP over TLS :9390<br/>(不驗憑證)"])
ZAP(["ZAP daemon<br/>HTTP API :8080<br/>(當 proxy・API key)"])
SQ(["SonarQube Server<br/>HTTP(S) · Bearer token"])
MITM(["🕵 同網段的人<br/>假冒工具伺服器"])
AG == "GMP · 帳密" ==> OV
AG == "HTTP · API key<br/>目標網址由任務指定" ==> ZAP
AG == "HTTPS/HTTP · token<br/>sonar-scanner 推結果" ==> SQ
MITM -. "回應 TLS 握手或攔明文" .-> AG
end
API -- "C20 · 心跳回應帶明文帳密" --> AG
classDef ext fill:#FBFCFC,stroke:#9AA8AA,stroke-dasharray:3 2
classDef open fill:#FDECEC,stroke:#C0392B
class OV,ZAP,SQ,MITM ext
class MITM open
| 項目 | 現況 |
|---|---|
| 誰 → 誰 | 客戶機房的 evidence-agent → 客戶自己架的工具伺服器。三種工具三條子線,都在客戶內網;雲端連不到也不碰 |
| OpenVAS | GMP over TLS :9390,用 python-gvm 的 TLSConnection。不帶憑證時 python-gvm 預設 verify_mode = CERT_NONE、check_hostname = False——有加密、但不驗對方是誰。帳密是 OpenVAS 管理員帳號(username/password)。位址填 base_url,程式只取 hostname |
| ZAP | HTTP API :8080(ZAPv2),ZAP 當 proxy 用——agent 所有 API 呼叫經 proxy 轉;位址無 scheme 時補 http://。帳密是 ZAP 的 API key。要掃的目標網址(target_url)由任務參數指定 |
| SonarQube | agent 本機跑 sonar-scanner 後推結果到 SonarQube Server(Server 沒有觸發掃描的 API);另有 HTTP 呼叫查專案狀態、拉快照。httpx.get 用預設設定(有 TLS 就驗系統 CA);位址無 scheme 時補 http://。帳密是 user token(squ_ 前綴),走 Authorization: Bearer、scanner 走環境變數 SONAR_TOKEN 不進命令列 |
| 怎麼驗身分 | agent 對伺服器:客戶填的帳密/API key/token,雲端加密存 tenant_detection_tool_configs、派工時解密經 C20 下發,agent 只在記憶體用、log 不記。伺服器對 agent:OpenVAS 不驗憑證;ZAP、SonarQube 明文 http 時無從驗,https 時 SonarQube 驗系統 CA |
| 位址誰填 | 客戶管理員在「檢測工具設定」頁填。雲端側對位址沒有內網/外網限制(DFD 寫「總表 #4/#79 已擋內網」——#4 是加權限門、#79 是限量+收斂回應,都不是擋內網位址;位址仍由客戶自由填,已回寫母卡) |
| 何時存在 | 客戶設了對應工具且派該工具的掃描時 |
依據:agent repo core/task_executor_connectors/openvas.py:59-85(TLSConnection(hostname, port, timeout) 不帶 cafile)、python-gvm gvm/connections/_tls.py:80-84(無憑證時 CERT_NONE)、zap.py:131-160(http:// 補 scheme、proxies 設定)、sonarqube.py:319-354/1024-1049(httpx 預設、SONAR_TOKEN 環境變數);套件 jedi_detection/app/service/detection_tool_service.py:35-36,238(限量不限位址)。
| 群 | 功能 | 對威脅的意義 |
|---|---|---|
| ① 建掃描、拉報告 | OpenVAS:建 target、建 task、等完成、拉 PDF 報告;ZAP:建 context、跑 spider 與 active scan、拉 HTML 報告 | agent 以管理員身分操作工具——工具伺服器知道全網的弱點,它的帳密比一般主機帳密更值錢 |
| ② 推源碼分析結果 | SonarQube:sonar-scanner 分析完 agent 本機的源碼(C23b)後推到 Server;Server 不存在的專案會自動建立(寫入) |
推的內容是客戶源碼的分析結果(檔名、問題行號、程式片段)——走明文就是源碼結構外流 |
| ③ 測試連線 | 「測試連線」對工具伺服器驗一次帳密(OpenVAS authenticate、ZAP 問版本、SonarQube api/authentication/validate) |
位址由按的人填(C21 T3);帳密會被送到那個位址 |
這條線零命中。依特性——位址客戶填、帳密是工具管理員級、三條子線預設都不驗對方身分——可能的手法有三種。風險欄寫「—(無掃描實例)」。
| # | 風險 | 威脅 | 駭客怎麼打 | 得手什麼 | STRIDE | 實例 |
|---|---|---|---|---|---|---|
| T1 | —(無掃描實例) | 假冒工具伺服器,接走管理員帳密 | ① 站在 agent 與工具伺服器之間(同網段、改 DNS、或工具伺服器的 IP 被重新分配);② 架一個假的 :9390 回應 TLS 握手——agent 的 python-gvm 不驗憑證,直接接受;③ agent 送 GMP authenticate,OpenVAS 管理員帳密到手;④ ZAP/SonarQube 若是明文 http,連握手都不用,攔下來就讀 |
弱點掃描器的管理員帳密——登進去能看客戶全網的弱點報告、改掃描設定 | S 冒充身分、I 資料外洩 | — |
| T2 | —(無掃描實例) | 假冒工具伺服器,回假報告 | ① 同 T1 的位置;② 不只接帳密,還照 GMP/ZAP API 格式回「掃描完成、零弱點」與一份乾淨的 PDF/HTML;③ agent 當真報告上傳,進入證據鏈;④ 稽核人員看到的是假的乾淨報告 | 偽造弱點掃描的稽核證據 | T 竄改資料 | — |
| T3 | —(無掃描實例) | 把 agent 當跳板,叫工具去打不該打的地方 | ① 有權設定任務的人(或 C02 守門漏掉時任何人);② ZAP 任務的 target_url 填客戶內網另一套系統、或填外部第三方網站;③ agent 叫 ZAP 對它跑 active scan——那是真實的攻擊流量(注入測試、暴力路徑);④ 被掃的系統若脆弱會真的受損;若是外部網站,客戶變成攻擊來源 |
對內網或外部目標發動實質攻擊流量;客戶 IP 被列黑名單 | E 權限提升、D 讓服務停擺 | — |
三種手法的共同點:T1、T2 都利用「agent 不確認對方是不是真的那台工具伺服器」——這和 C23 的 SSH 不驗指紋是同一種病,只是這裡的帳密是弱點掃描器的管理員。T3 利用「掃描目標由使用者填,而掃描本身就是攻擊」——這是 DAST 工具的本質,產品能做的是確認填目標的人有權、並留下紀錄。
零命中的線沒有「直接對應掃描手法」的防線,五條全部是依連線特性補的標準防線,全標 ◇。「目前」欄寫程式裡實際有的機制;⚠️ 表示沒有機制。
| # | 防線 | 擋哪種威脅 | 目前做到哪 |
|---|---|---|---|
| D1 ◇ | OpenVAS 的 TLS 要驗憑證:讓客戶在設定頁上傳 OpenVAS 伺服器憑證或 CA,agent 用它驗;或至少釘指紋 | T1、T2 | ⚠️ 沒有。TLSConnection(hostname, port, timeout) 不帶 cafile,python-gvm 退回 CERT_NONE。設定頁沒有憑證欄位 |
| D2 ◇ | ZAP/SonarQube 預設走 https、明文要明示;SonarQube 的 https 驗系統 CA(已有)或客戶上傳的 CA | T1、T2 | ⚠️ 兩者位址無 scheme 時都補 http://——預設是明文那一邊。SonarQube 填 https:// 時 httpx 會驗系統 CA(內網自簽會失敗、沒有「上傳 CA」選項,實務上客戶會退回 http)。ZAP daemon 本身多半只開 http,這條有實務理由,但至少畫面要警告 |
| D3 ◇ | 工具帳密不落地、不進命令列、不進日誌 | T1 的暴露面 | ✅ 三支 connector 都只在記憶體用、log 不記帳密;✅ SonarQube token 走環境變數 SONAR_TOKEN 不進 argv;✅ 設定頁回應遮密鑰(雲端側) |
| D4 ◇ | 誰能設定掃描目標要守住,且目標要留紀錄:ZAP 的 target_url、OpenVAS 的 hosts 都是攻擊目標,誰填的、填了什麼要進稽核日誌 |
T3 | ✅ 派工只放行被指派人與 manager(C02 D1);✅ 掃描目標數上限 256(DETECTION_SCAN_TARGET_MAX_HOSTS)。⚠️ 刻意不設目標白名單(裁定:哪台算合法由客戶管);掃描目標有沒有逐筆進稽核日誌沒查 |
| D5 ◇ | 從工具伺服器拉回的報告是外部輸入:大小上限、格式驗證、進證據前消毒 | T2 的後果縮小 | ✅ 報告檔名進雲端前過 sanitize_report_filename()(C20 D3);✅ 預覽端白名單+驗檔頭(C01 D4)。⚠️ 報告內容真偽無法技術驗證——假報告長得跟真的一樣 |
最該補的一步:D1。OpenVAS 是三者中帳密最值錢的(弱點掃描器管理員=全網弱點地圖),而它的 TLS 連線目前等於沒有 TLS——設定頁加一個「伺服器憑證/CA」上傳欄位、TLSConnection 帶 cafile,是一支 connector 幾行的事。
CERT_NONE(D1):是第三方套件的預設行為,不是我們寫的——但我們沒覆寫。依據:agent repo core/task_executor_connectors/openvas.py/zap.py/sonarqube.py、python-gvm gvm/connections/_tls.py、套件 jedi_detection/app/service/detection_tool_service.py、主專案 config/config.py、DFD Level 0 §2.4/§2.6。