| # ThreatHunter Agent 本質說明書 |
|
|
| > **版本**:v1.0 | **更新日期**:2026-04-23 |
| > **用途**:給團隊成員理解每個 Agent 本質上在做什麼 |
|
|
| --- |
|
|
| ## 總覽:Pipeline 資料流 |
|
|
| ``` |
| 使用者輸入(程式碼 / 套件 / 設定檔) |
| │ |
| ▼ |
| ┌──────────────────┐ |
| │ Orchestrator │ ← 指揮官:決定走哪條路(A/B/C/D)、誰要上場 |
| └──────┬───────────┘ |
| │ 並行 Layer 1 |
| ▼ |
| ┌──────────────┐ ┌───────────────┐ ┌──────────────────┐ |
| │Security Guard│ │ Intel Fusion │ │ L0/L1 Scanner │ |
| │(程式碼消毒) │ │(六維情報融合)│ │(正則預掃描) │ |
| └──────┬───────┘ └───────┬───────┘ └────────┬─────────┘ |
| │ │ │ |
| └──────────┬───────┘───────────────────┘ |
| ▼ |
| ┌──────────────┐ |
| │ Scout │ ← 偵察兵:組裝最終漏洞清單,重用 Intel Fusion 情報 |
| └──────┬───────┘ |
| ▼ |
| ┌──────────────┐ |
| │ Analyst │ ← 分析師:KEV 驗證 + 連鎖攻擊分析 |
| └──────┬───────┘ |
| ▼ |
| ┌──────────────┐ |
| │ Debate Engine│ ← 辯論:Analyst vs Critic(最多 3 輪) |
| │ + Critic │ |
| │ + Judge │ |
| └──────┬───────┘ |
| ▼ |
| ┌──────────────┐ |
| │ Advisor │ ← 顧問:產出可執行的行動報告 |
| └──────────────┘ |
| │ |
| ▼ |
| UI 顯示 |
| ``` |
|
|
| --- |
|
|
| ## 1. Orchestrator(指揮官) |
|
|
| | 項目 | 說明 | |
| |------|------| |
| | **檔案** | `agents/orchestrator.py` (518 行) | |
| | **本質** | **不用 LLM 做推理的確定性路由器**。根據輸入類型決定走哪條路、跳過哪些 Agent、走哪些捷徑 | |
| | **LLM 使用** | 幾乎不用。路由邏輯全是 if/else 確定性程式碼 | |
| | **核心函式** | `classify_input()` → 決定 Path A/B/C/D | |
| | | `check_shortcuts()` → MacNet Small-World 捷徑 | |
| | | `review_worker_output()` → 審閱各 Agent 輸出品質 | |
|
|
| ### 四條掃描路徑 |
|
|
| | 路徑 | 觸發條件 | 啟動的 Agent | |
| |------|---------|-------------| |
| | **A** 套件掃描 | 輸入只有 `package==version` | Intel Fusion → Scout → Analyst → Debate → Judge | |
| | **B** 完整程式碼 | 有 `def`/`class` 等程式碼 | Security Guard + Intel Fusion + L0 → Scout → Analyst → Debate → Judge | |
| | **C** 文件掃描 | `.env`/`.yaml` 等設定檔 | Doc Scanner + Intel Fusion → Scout → Judge | |
| | **D** 回饋迴路 | Judge 信心不足時觸發 | Intel Fusion → Analyst → Debate → Judge(最多 2 次) | |
|
|
| ### Small-World 捷徑(省 Token 機制) |
|
|
| | 捷徑 | 觸發條件 | 效果 | |
| |------|---------|------| |
| | `kev_to_analyst_direct` | CISA KEV 命中 | 跳過 Scout 重新評分 | |
| | `skip_l2_llm` | L0 正則零發現 | 跳過 L2 LLM 分析 | |
| | `debate_phase2_skipped` | 辯論第一輪就共識 | 省 6 次 LLM 呼叫 | |
| | `skip_debate_all_low` | 全部 CVSS < 4.0 | 跳過整個辯論 | |
|
|
| --- |
|
|
| ## 2. Security Guard(程式碼消毒員) |
|
|
| | 項目 | 說明 | |
| |------|------| |
| | **檔案** | `agents/security_guard.py` (1174 行) | |
| | **本質** | **完全確定性的靜態分析引擎**。用正則 + AST 從使用者程式碼中提取函式、危險模式、硬編碼密碼。**絕不使用 LLM 判斷** | |
| | **LLM 使用** | **零**。這是唯一完全不依賴 LLM 的 Agent | |
| | **設計依據** | Dual LLM Pattern (Simon Willison 2024) + OWASP LLM01:2025 | |
|
|
| ### 核心函式:`extract_code_surface(code: str)` |
|
|
| **輸入**:使用者提交的原始程式碼(任何語言) |
| **輸出**:結構化 JSON,包含: |
|
|
| ```json |
| { |
| "functions": ["eval", "exec", "os.system"], // AST 提取的函式呼叫 |
| "patterns": [ // 正則匹配的危險模式 |
| {"type": "CMD_INJECTION", "cwe": "CWE-78", "severity": "CRITICAL", "snippet": "os.system(cmd)"} |
| ], |
| "hardcoded": [ // 硬編碼密碼/金鑰 |
| {"type": "HARDCODED_SECRET", "snippet": "api_key = 'sk-xxx'"} |
| ], |
| "language": "python", // 偵測到的語言 |
| "stats": {"loc": 150, "function_count": 12} |
| } |
| ``` |
|
|
| ### 三層偵測架構 |
|
|
| | 層級 | 機制 | 覆蓋範圍 | |
| |------|------|---------| |
| | **L0 通用正則** | `_DANGER_UNIVERSAL` | SQL Injection、CMD Injection、Path Traversal、XXE、Hardcoded Secret、**Log4Shell JNDI** | |
| | **L1 語言特化** | `_DANGER_LANG[language]` | Python: Pickle/YAML/Eval/SSRF/SSTI;JS: Prototype Pollution/innerHTML;Java: Deserialization;C#: Process.Start/SqlCommand/BinaryFormatter 等 | |
| | **L2 AST 分析** | Python `ast.parse()` | 精確函式呼叫提取(不被字串/註解干擾) | |
|
|
| ### 支援語言(15 種) |
|
|
| Python、JavaScript、TypeScript、Java、C#、PHP、Ruby、Go、Rust、C/C++、Kotlin、Swift、Scala、Bash、SQL |
|
|
| ### 關鍵設計決策 |
|
|
| - **為何不用 LLM?** → 防 Prompt Injection。使用者程式碼可能包含 `# Ignore all previous instructions`,如果讓 LLM 分析程式碼,LLM 可能被注入。確定性正則不受此影響。 |
| - **Word Boundary 修補** → `(?<!\w)` lookbehind 防止 `ecosystem` 誤觸 `system\s*\(` 模式。 |
|
|
| --- |
|
|
| ## 3. Intel Fusion(六維情報融合師) |
|
|
| | 項目 | 說明 | |
| |------|------| |
| | **檔案** | `agents/intel_fusion.py` (792 行) | |
| | **本質** | **用 LLM 自主決策要查哪些情報源**,然後用**確定性公式**計算複合風險分數 | |
| | **LLM 使用** | 用於決定查詢順序和解析 API 回傳;**分數計算由程式碼執行** | |
| | **Tools** | search_nvd、search_osv、check_cisa_kev、search_otx、fetch_epss_score、query_ghsa、read/write_memory | |
| |
| ### 六維評分公式 |
| |
| ``` |
| composite_score = (cvss×0.20 + epss×0.30 + kev×0.25 + ghsa×0.10 + attck×0.10 + otx×0.05) × 10 |
| ``` |
| |
| | 維度 | 來源 | 權重 | 說明 | |
| |------|------|------|------| |
| | CVSS | NVD API | 20% | 理論嚴重性(0-10) | |
| | EPSS | FIRST.org | 30% | 30 天內被利用的機率(0-1) | |
| | KEV | CISA | 25% | 已確認在野利用(二元) | |
| | GHSA | GitHub Advisory | 10% | 生態系專屬告警 | |
| | ATT&CK | MITRE | 10% | 攻擊戰術分類 | |
| | OTX | AlienVault | 5% | IoC 威脅情報 | |
| |
| ### 動態加權規則(確定性程式碼) |
| |
| | 條件 | 調整 | |
| |------|------| |
| | `in_kev == True` | EPSS 降至 0(KEV 已是最高事實)→ 權重轉給 KEV | |
| | `cve_year < 2020` | EPSS 降至 0.10(舊漏洞 EPSS 不準)→ 權重轉給 CVSS | |
| | `otx_fail_rate > 0.5` | OTX 降至 0.01 → 權重轉給 CVSS | |
| | `in_kev && composite < 8.0` | 強制拉到 8.0(KEV 品質紅線) | |
| |
| ### Harness 保障 |
| |
| - **Layer 2**:`_verify_and_recalculate()` — LLM 算出的分數與程式碼計算差 >1.5 → 用程式碼的 |
| - **Layer 2.5**:CVE 年份過濾 — `< 2005` 的遠古 CVE 一律濾除 |
| |
| --- |
| |
| ## 4. Scout(威脅情報偵察兵) |
| |
| | 項目 | 說明 | |
| |------|------| |
| | **檔案** | `agents/scout.py` (794 行) | |
| | **本質** | **Pipeline 第一個 LLM Agent**。彙整 OSV/NVD 與 Layer 1 情報,產出最終 `vulnerabilities[]` 與 scan-scoped 結果 | |
| | **LLM 使用** | 使用 LLM 決定查詢順序、解析 API 回傳、合併 Intel Fusion 證據並組裝 JSON 報告 | |
| | **Tools** | search_osv(主力)、search_nvd(備用)、read/write_memory、history_search | |
| |
| ### 工作流程(SOP 6 步) |
| |
| 1. `read_memory("scout")` — 讀取歷史掃描記錄 |
| 2. 對每個套件呼叫 `search_osv()`(OSV.dev ecosystem-aware)→ 無結果則 fallback `search_nvd()` |
| 3. 若 Layer 1 已提供 `intel_fusion_result`,優先重用其 EPSS / OTX / KEV / GHSA 富化證據,不重複查詢 |
| 4. 組裝 JSON 報告(CVE ID 必須來自 API,絕不可編造) |
| 5. `write_memory("scout")` — 儲存本次結果 |
| 6. 輸出 Final Answer(純 JSON) |
| |
| ### Path-Aware Skill Map |
| |
| | Path | Skill 檔案 | 用途 | |
| |------|-----------|------| |
| | A (pkg) | `threat_intel.md` | NVD CVE 掃描 | |
| | B (code) | `source_code_audit.md` | OWASP Top10 + CWE | |
| | B (injection) | `ai_security_audit.md` | OWASP LLM Top10 | |
| | C (config) | `config_audit.md` | CIS Benchmark | |
| |
| ### Harness 保障(5 層) |
| |
| | 層 | 功能 | |
| |----|------| |
| | **0** | OSV Batch 預熱:LLM 啟動前批量查所有套件,結果預存快取 | |
| | **1** | 強制 write_memory:LLM 沒寫 → 程式碼代寫 | |
| | **2** | Schema 驗證:缺少必要欄位 → 自動補全 | |
| | **2.5** | Cache 注入:LLM 輸出 0 CVE → 從 OSV/NVD 快取注入 | |
| | **3** | CVE 驗證:幻覺偵測 — 每個 CVE ID 回 NVD 精確查詢,不存在 → 移除 | |
| | **3.5** | 年份過濾:`< 2005` 的 CVE 一律移除 | |
| | **4** | Package 補全:CVE 沒有 package 欄位 → 從 description 推斷 | |
| | **5** | is_new 校正:比對歷史記憶,修正 LLM 的 is_new 標記 | |
| |
| --- |
| |
| ## 5. Analyst(漏洞連鎖分析師) |
| |
| | 項目 | 說明 | |
| |------|------| |
| | **檔案** | `agents/analyst.py` (1045 行) | |
| | **本質** | **深度分析 + 連鎖攻擊路徑推理**。接收 Scout 的 CVE 清單,驗證 KEV/Exploit 狀態,分析漏洞間的連鎖關係 | |
| | **LLM 使用** | 重度使用。連鎖攻擊分析需要 LLM 推理 | |
| | **Tools** | check_cisa_kev、search_exploits、read/write_memory、history_search | |
| |
| ### 3-Task 拆分架構(降低弱模型認知負荷) |
| |
| | Sub-Agent | 職責 | 擁有的 Tool | |
| |-----------|------|------------| |
| | **Collector** | 讀歷史記憶 + 解析 Scout JSON | `read_memory` | |
| | **Verifier** | KEV 驗證 + Exploit 搜尋 + Chain 分析 | `check_cisa_kev`、`search_exploits` | |
| | **Scorer** | 計算風險分數 + 寫記憶 + 輸出 JSON | `write_memory` | |
| |
| ### 連鎖攻擊分析規則 |
| |
| | 條件 | 風險調整 | |
| |------|---------| |
| | in_kev + exploit + chain | → CRITICAL | |
| | in_kev + exploit | → CRITICAL | |
| | chain alone | → 至少維持原始嚴重度 | |
| | **規則**:風險只能**升高**,絕不能降低 | | |
| |
| ### 風險分數計算 |
| |
| ``` |
| risk_score = min(100, Σ(cvss_score × weight)) |
| weight: CRITICAL=3, HIGH=2, MEDIUM=1, LOW=0.5 |
| ``` |
| |
| ### Harness 保障 |
| |
| | 層 | 功能 | |
| |----|------| |
| | **1** | 強制 write_memory | |
| | **2** | Schema 驗證(scan_id/risk_score/analysis 必須存在) | |
| | **3** | chain_risk 邏輯驗證(is_chain=true → 必須有 chain_with + chain_description) | |
| | **3.5** | CVE 年份標記(`< 2005` → confidence=NEEDS_VERIFICATION) | |
| | **Fallback** | LLM 完全失敗 → 用 Scout 資料建最小可行報告 | |
| |
| --- |
| |
| ## 6. Critic(魔鬼代言人) |
| |
| | 項目 | 說明 | |
| |------|------| |
| | **檔案** | `agents/critic.py` (388 行) | |
| | **本質** | **對抗性審查者**。質疑 Analyst 的每個判斷,驗證假設,輸出 5 維記分卡 | |
| | **LLM 使用** | 用於生成質疑論點、驗證邏輯 | |
| | **Tools** | check_cisa_kev、search_exploits、read_memory | |
| | **可關閉** | `ENABLE_CRITIC=false` → 完全跳過,輸出 SKIPPED | |
| |
| ### 5 維記分卡 |
| |
| | 維度 | 權重 | 說明 | |
| |------|------|------| |
| | evidence | 30% | 證據充分度 | |
| | chain_completeness | 25% | 連鎖分析完整度 | |
| | critique_quality | 20% | 質疑品質 | |
| | defense_quality | 15% | 辯護品質 | |
| | calibration | 10% | 校準準確度 | |
| |
| ### 裁決規則 |
| |
| | 加權分數 | 裁決 | |
| |---------|------| |
| | ≥ 70 | **MAINTAIN**(維持 Analyst 判斷) | |
| | 50–69 | **MAINTAIN**(附帶挑戰筆記) | |
| | < 50 | **DOWNGRADE**(降級風險評估) | |
| |
| ### 關鍵限制 |
| |
| - **禁止降級 KEV 命中的 CVE**(in_cisa_kev=true → 不可 DOWNGRADE) |
| - 必須至少呼叫一個 Tool 才能下結論 |
| |
| --- |
| |
| ## 7. Debate Engine(辯論引擎) |
| |
| | 項目 | 說明 | |
| |------|------| |
| | **檔案** | `agents/debate_engine.py` (478 行) | |
| | **本質** | **多 Agent 辯論協調器**。讓 Analyst 和 Critic 進行最多 3 輪辯論,無共識時由 Judge 仲裁 | |
| | **論文依據** | Du et al. (2023) "Improving Factuality and Reasoning in LLMs through Multiagent Debate" (ICML 2023) | |
| |
| ### 辯論流程 |
| |
| ``` |
| Round 1: Analyst 提出初始立場 → Critic 質疑 |
| Round 2: Analyst 更新立場(含 Critic 反饋)→ Critic 再評 |
| Round 3: Analyst 最終立場 → Critic 最終評判 |
| ↓ 若 3 輪後仍無共識 |
| Final: Judge sub-agent 仲裁(獨立第三方) |
| ``` |
| |
| ### 共識判定 |
|
|
| - Critic verdict = MAINTAIN → **直接共識** |
| - Critic verdict = DOWNGRADE 但 score ≥ 80 → **共識**(Analyst 立場強) |
| - 其他 → **繼續辯論** |
|
|
| ### Judge Sub-Agent |
|
|
| - 獨立第三方,不是 Analyst 也不是 Critic |
| - 閱讀完整辯論紀錄,選擇最有邏輯支持的立場 |
| - **安全性偏保守原則**:證據相當時,選更嚴重的評級 |
|
|
| --- |
|
|
| ## 8. Advisor(資安顧問 / 最終裁決者) |
|
|
| | 項目 | 說明 | |
| |------|------| |
| | **檔案** | `agents/advisor.py` (812 行) | |
| | **本質** | **Pipeline 終點站**。接收所有前序 Agent 的分析結果,產出面向管理者的可執行行動報告 | |
| | **LLM 使用** | 使用 LLM 生成修補建議和 executive summary | |
| | **Tools** | read_memory、write_memory、history_search | |
| |
| ### 輸出格式(Advisor → UI 資料契約) |
| |
| ```json |
| { |
| "executive_summary": "一句話風險摘要", |
| "actions": { |
| "urgent": [{"cve_id": "...", "command": "pip install --upgrade xxx", ...}], |
| "important": [{"cve_id": "...", "action": "...", ...}], |
| "resolved": [] |
| }, |
| "risk_score": 85, |
| "risk_trend": "+12", |
| "code_patterns_summary": [...] |
| } |
| ``` |
| |
| ### 三級分類規則 |
|
|
| | 級別 | 條件 | |
| |------|------| |
| | **URGENT** | CVSS ≥ 9.0 或 in_cisa_kev=true 或有公開 PoC | |
| | **IMPORTANT** | CVSS ≥ 7.0 或有攻擊鏈風險 | |
| | **不列入** | MEDIUM/LOW 且無利用跡象 | |
|
|
| ### Harness 保障(6.5 層) |
|
|
| | 層 | 功能 | |
| |----|------| |
| | **1** | LLM 輸出無法解析 → Fallback 最小可行報告 | |
| | **2** | Schema 驗證(executive_summary/actions/risk_score 必須存在) | |
| | **3** | risk_score 範圍驗證(強制 0-100) | |
| | **4** | URGENT 項目必須有 command(沒有 → 自動補 `pip install --upgrade`) | |
| | **5** | 歷史比對:重複未修補 CVE → `[REPEATED — STILL NOT PATCHED]` 語氣升級 | |
| | **6** | 憲法守衛:CODE-pattern(無真實 CVE ID)從 URGENT/IMPORTANT 移至 `code_patterns_summary` | |
| | **6.5** | CWE 佐證注入:為每個 code pattern 加入 MITRE CWE 官方定義、CVSS、代表性 CVE | |
| |
| --- |
| |
| ## Agent 間的資料契約總表 |
| |
| | 上游 | 下游 | 傳遞的 JSON 欄位 | |
| |------|------|-----------------| |
| | Orchestrator | 全部 | `scan_path`, `agents_to_run`, `shortcuts` | |
| | Security Guard | Scout/Analyst | `functions[]`, `patterns[]`, `hardcoded[]`, `language` | |
| | Intel Fusion | Scout | `fusion_results[]`, `composite_score`, `kev_hits` | |
| | Scout | Analyst | `vulnerabilities[]`, `code_patterns[]`, `summary` | |
| | Analyst | Critic/Debate | `analysis[]`, `risk_score`, `risk_trend` | |
| | Critic | Debate Engine | `scorecard`, `weighted_score`, `verdict`, `challenges[]` | |
| | Debate Engine | Advisor | 最終裁決 + `_debate_meta` | |
| | Advisor | UI | `executive_summary`, `actions{urgent/important/resolved}`, `risk_score` | |
|
|
| --- |
|
|
| ## 共通機制 |
|
|
| ### 429 自動輪替(所有 LLM Agent 共用) |
|
|
| ```python |
| for attempt in range(MAX_LLM_RETRIES + 1): |
| agent = create_xxx_agent(excluded_models) |
| try: |
| result = crew.kickoff() |
| break |
| except Exception as e: |
| if "429" in str(e): |
| mark_model_failed(current_model) |
| excluded_models.append(current_model) |
| rate_limiter.on_429(retry_after=...) |
| continue |
| raise |
| ``` |
|
|
| ### Graceful Degradation(所有 Agent 共用) |
|
|
| 每個 Agent 都有 `_build_fallback_output()` — LLM 完全失敗時,用前序 Agent 的資料建最小可行報告,確保 Pipeline 不中斷。 |
|
|
| ### CVE 年份過濾(三道防線) |
|
|
| | 位置 | 機制 | |
| |------|------| |
| | Scout Harness 3.5 | `< 2005` 的 CVE 從 vulnerabilities 移除 | |
| | Intel Fusion Harness 2.5 | `< 2005` 的 CVE 從 fusion_results 移除 | |
| | Advisor Harness 6 | `< 2005` 的 CVE 從 urgent/important 移除 | |
| |
| --- |
| |
| *本文件僅供團隊內部參考,不需上傳至 Git。* |
| |