| <!DOCTYPE html> |
| <html lang="zh-TW"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>ThreatHunter v5.1 — 全域 Pipeline 流程圖</title> |
| <style> |
| @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&family=Inter:wght@300;400;600;700;800&display=swap'); |
| |
| :root { |
| --bg: #06090f; |
| --surface: #0d1117; |
| --surface2: #161b22; |
| --surface3: #1c2333; |
| --border: rgba(255,255,255,0.06); |
| --border2: rgba(255,255,255,0.10); |
| --text: #e6edf3; |
| --text2: #8b949e; |
| --text3: #484f58; |
| --accent: #58a6ff; |
| --green: #3fb950; |
| --red: #f85149; |
| --orange: #d29922; |
| --purple: #bc8cff; |
| --cyan: #39d2c0; |
| --pink: #f778ba; |
| --blue: #58a6ff; |
| --yellow: #e3b341; |
| } |
| |
| * { margin:0; padding:0; box-sizing:border-box; } |
| |
| body { |
| background: var(--bg); |
| font-family: 'Inter', -apple-system, sans-serif; |
| color: var(--text); |
| min-height: 100vh; |
| overflow-x: hidden; |
| } |
| |
| |
| .header { |
| text-align: center; |
| padding: 40px 24px 20px; |
| position: relative; |
| } |
| .header::after { |
| content: ''; |
| position: absolute; |
| bottom: 0; left: 50%; |
| transform: translateX(-50%); |
| width: 200px; height: 1px; |
| background: linear-gradient(90deg, transparent, var(--accent), transparent); |
| } |
| .header h1 { |
| font-size: 28px; |
| font-weight: 800; |
| letter-spacing: -0.5px; |
| background: linear-gradient(135deg, #58a6ff 0%, #bc8cff 40%, #3fb950 70%, #39d2c0 100%); |
| -webkit-background-clip: text; |
| -webkit-text-fill-color: transparent; |
| margin-bottom: 8px; |
| } |
| .header .sub { |
| font-size: 12px; |
| color: var(--text2); |
| font-family: 'JetBrains Mono', monospace; |
| } |
| |
| |
| .stats { |
| display: flex; gap: 12px; justify-content: center; |
| padding: 16px 24px; flex-wrap: wrap; |
| } |
| .stat { |
| background: var(--surface); |
| border: 1px solid var(--border); |
| border-radius: 10px; |
| padding: 10px 20px; |
| text-align: center; |
| min-width: 90px; |
| } |
| .stat-n { font-size: 22px; font-weight: 800; } |
| .stat-l { font-size: 9px; color: var(--text2); text-transform: uppercase; letter-spacing: 1.5px; margin-top: 2px; } |
| |
| |
| .pipeline { |
| max-width: 1000px; |
| margin: 0 auto; |
| padding: 0 24px 40px; |
| position: relative; |
| } |
| |
| |
| .pipeline::before { |
| content: ''; |
| position: absolute; |
| left: 50%; |
| top: 0; bottom: 60px; |
| width: 2px; |
| background: repeating-linear-gradient( |
| to bottom, |
| rgba(88,166,255,0.15) 0px, |
| rgba(88,166,255,0.15) 8px, |
| transparent 8px, |
| transparent 16px |
| ); |
| transform: translateX(-1px); |
| z-index: 0; |
| } |
| |
| |
| .step { |
| position: relative; |
| z-index: 1; |
| margin-bottom: 0; |
| } |
| |
| |
| .arrow { |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| gap: 8px; |
| padding: 6px 0; |
| position: relative; |
| z-index: 1; |
| } |
| .arrow-line { |
| width: 2px; height: 28px; |
| background: linear-gradient(to bottom, rgba(88,166,255,0.3), rgba(88,166,255,0.1)); |
| position: relative; |
| } |
| .arrow-line::after { |
| content: '▼'; |
| position: absolute; |
| bottom: -8px; left: 50%; |
| transform: translateX(-50%); |
| font-size: 8px; |
| color: rgba(88,166,255,0.4); |
| } |
| .arrow-tag { |
| font-size: 9px; |
| color: var(--text2); |
| font-family: 'JetBrains Mono', monospace; |
| background: var(--surface); |
| border: 1px solid var(--border); |
| border-radius: 4px; |
| padding: 2px 8px; |
| white-space: nowrap; |
| } |
| |
| |
| .layer { |
| background: var(--surface); |
| border: 1px solid var(--border); |
| border-radius: 14px; |
| padding: 16px 20px; |
| position: relative; |
| overflow: hidden; |
| } |
| .layer::before { |
| content: ''; |
| position: absolute; |
| top: 0; left: 0; right: 0; |
| height: 2px; |
| } |
| |
| .layer-head { |
| display: flex; |
| align-items: center; |
| gap: 8px; |
| margin-bottom: 12px; |
| } |
| .layer-icon { |
| width: 28px; height: 28px; |
| border-radius: 8px; |
| display: flex; align-items: center; justify-content: center; |
| font-size: 14px; |
| flex-shrink: 0; |
| } |
| .layer-title { |
| font-size: 13px; |
| font-weight: 700; |
| letter-spacing: -0.2px; |
| } |
| .layer-sub { |
| font-size: 9px; |
| color: var(--text2); |
| font-family: 'JetBrains Mono', monospace; |
| margin-left: auto; |
| } |
| |
| |
| .cards { |
| display: flex; |
| flex-wrap: wrap; |
| gap: 8px; |
| } |
| .card { |
| background: var(--surface2); |
| border: 1px solid var(--border2); |
| border-radius: 8px; |
| padding: 8px 12px; |
| min-width: 130px; |
| flex: 1; |
| position: relative; |
| transition: transform 0.15s, border-color 0.15s; |
| } |
| .card:hover { |
| transform: translateY(-1px); |
| border-color: rgba(255,255,255,0.15); |
| } |
| .card-name { |
| font-size: 11px; |
| font-weight: 700; |
| margin-bottom: 2px; |
| } |
| .card-file { |
| font-size: 9px; |
| color: var(--text2); |
| font-family: 'JetBrains Mono', monospace; |
| margin-bottom: 4px; |
| } |
| .card-desc { |
| font-size: 9px; |
| color: var(--text3); |
| line-height: 1.4; |
| } |
| |
| |
| .tags { display: flex; flex-wrap: wrap; gap: 3px; } |
| .t { |
| font-size: 8px; |
| font-weight: 600; |
| padding: 1px 5px; |
| border-radius: 3px; |
| font-family: 'JetBrains Mono', monospace; |
| border: 1px solid; |
| line-height: 1.5; |
| } |
| .t-py { color: var(--blue); background: rgba(88,166,255,0.08); border-color: rgba(88,166,255,0.2); } |
| .t-js { color: var(--yellow); background: rgba(227,179,65,0.08); border-color: rgba(227,179,65,0.2); } |
| .t-md { color: var(--purple); background: rgba(188,140,255,0.08); border-color: rgba(188,140,255,0.2); } |
| .t-json{ color: var(--green); background: rgba(63,185,80,0.08); border-color: rgba(63,185,80,0.2); } |
| .t-api { color: var(--text2); background: rgba(139,148,158,0.06); border-color: rgba(139,148,158,0.15); } |
| .t-new { color: var(--cyan); background: rgba(57,210,192,0.08); border-color: rgba(57,210,192,0.2); } |
| .t-red { color: var(--red); background: rgba(248,81,73,0.08); border-color: rgba(248,81,73,0.2); } |
| .t-warn{ color: var(--orange); background: rgba(210,153,34,0.08); border-color: rgba(210,153,34,0.2); } |
| .t-rust{ color: #f97316; background: rgba(249,115,22,0.08); border-color: rgba(249,115,22,0.2); } |
| |
| |
| .l-rust::before { background: linear-gradient(90deg, #f97316, #fb923c); } |
| |
| |
| .l-user::before { background: linear-gradient(90deg, var(--cyan), var(--blue)); } |
| .l-api::before { background: linear-gradient(90deg, var(--blue), var(--purple)); } |
| .l-l0::before { background: linear-gradient(90deg, var(--red), var(--orange)); } |
| .l-orch::before { background: linear-gradient(90deg, var(--blue), var(--cyan)); } |
| .l-par::before { background: linear-gradient(90deg, var(--orange), var(--purple)); } |
| .l-scout::before { background: linear-gradient(90deg, var(--green), var(--cyan)); } |
| .l-intel::before { background: linear-gradient(90deg, var(--purple), var(--blue)); } |
| .l-analyst::before{ background: linear-gradient(90deg, var(--blue), var(--purple)); } |
| .l-critic::before { background: linear-gradient(90deg, var(--red), var(--orange)); } |
| .l-advisor::before{ background: linear-gradient(90deg, var(--green), var(--cyan)); } |
| .l-tools::before { background: linear-gradient(90deg, var(--cyan), var(--green)); } |
| .l-memory::before { background: linear-gradient(90deg, var(--green), var(--yellow)); } |
| .l-harness::before{ background: linear-gradient(90deg, var(--orange), var(--red)); } |
| .l-ext::before { background: linear-gradient(90deg, var(--text3), var(--text2)); } |
| |
| |
| .parallel { |
| display: grid; |
| grid-template-columns: 1fr 1fr; |
| gap: 10px; |
| position: relative; |
| } |
| .parallel::before { |
| content: '⚡ PARALLEL'; |
| position: absolute; |
| top: -8px; left: 50%; |
| transform: translateX(-50%); |
| font-size: 8px; |
| font-weight: 700; |
| color: var(--orange); |
| background: var(--bg); |
| padding: 0 8px; |
| font-family: 'JetBrains Mono', monospace; |
| letter-spacing: 1px; |
| z-index: 2; |
| } |
| |
| |
| .shield { |
| display: inline-flex; |
| align-items: center; |
| gap: 4px; |
| font-size: 8px; |
| font-weight: 700; |
| padding: 2px 7px; |
| border-radius: 4px; |
| font-family: 'JetBrains Mono', monospace; |
| border: 1px solid; |
| margin-top: 4px; |
| } |
| .shield-red { color: var(--red); border-color: rgba(248,81,73,0.3); background: rgba(248,81,73,0.06); } |
| .shield-green{ color: var(--green); border-color: rgba(63,185,80,0.3); background: rgba(63,185,80,0.06); } |
| .shield-cyan { color: var(--cyan); border-color: rgba(57,210,192,0.3); background: rgba(57,210,192,0.06); } |
| .shield-purple{color: var(--purple);border-color: rgba(188,140,255,0.3);background: rgba(188,140,255,0.06);} |
| |
| |
| .path { display: inline-flex; align-items: center; gap: 3px; |
| font-size: 8px; font-weight: 700; padding: 2px 6px; |
| border-radius: 3px; border: 1px solid; |
| font-family: 'JetBrains Mono', monospace; } |
| .path-pkg { color:#c792ff; border-color:rgba(199,146,255,0.3); background:rgba(199,146,255,0.06); } |
| .path-code { color:#7ecfff; border-color:rgba(126,207,255,0.3); background:rgba(126,207,255,0.06); } |
| .path-ai { color:#ffd166; border-color:rgba(255,209,102,0.3); background:rgba(255,209,102,0.06); } |
| .path-cfg { color:#4fd1c5; border-color:rgba(79,209,197,0.3); background:rgba(79,209,197,0.06); } |
| |
| |
| .did-strip { |
| background: linear-gradient(135deg, rgba(248,81,73,0.04), rgba(210,153,34,0.04)); |
| border: 1px solid rgba(248,81,73,0.15); |
| border-radius: 10px; |
| padding: 14px 18px; |
| margin-top: 6px; |
| } |
| .did-title { |
| font-size: 10px; |
| font-weight: 700; |
| color: var(--red); |
| text-transform: uppercase; |
| letter-spacing: 1.5px; |
| margin-bottom: 8px; |
| } |
| .did-layers { |
| display: grid; |
| grid-template-columns: repeat(4, 1fr); |
| gap: 6px; |
| } |
| .did-item { |
| background: var(--surface2); |
| border: 1px solid var(--border2); |
| border-radius: 6px; |
| padding: 8px 10px; |
| text-align: center; |
| position: relative; |
| } |
| .did-item::before { |
| content: ''; |
| position: absolute; |
| top: 0; left: 0; right: 0; |
| height: 2px; |
| border-radius: 6px 6px 0 0; |
| background: var(--red); |
| } |
| .did-num { |
| font-size: 16px; |
| font-weight: 800; |
| color: var(--red); |
| } |
| .did-loc { |
| font-size: 8px; |
| color: var(--text2); |
| font-family: 'JetBrains Mono', monospace; |
| margin-top: 2px; |
| } |
| .did-desc { |
| font-size: 8px; |
| color: var(--text3); |
| margin-top: 3px; |
| } |
| |
| |
| .dim-panel { |
| background: linear-gradient(135deg, rgba(63,185,80,0.03), rgba(57,210,192,0.03)); |
| border: 1px solid rgba(63,185,80,0.15); |
| border-radius: 10px; |
| padding: 14px 18px; |
| } |
| .dim-title { |
| font-size: 10px; font-weight: 700; color: var(--green); |
| text-transform: uppercase; letter-spacing: 1.5px; margin-bottom: 8px; |
| } |
| .dims { |
| display: grid; |
| grid-template-columns: repeat(6, 1fr); |
| gap: 6px; |
| } |
| .dim { |
| background: var(--surface2); |
| border: 1px solid var(--border2); |
| border-radius: 6px; |
| padding: 6px 8px; |
| text-align: center; |
| } |
| .dim-name { font-size: 9px; font-weight: 700; } |
| .dim-w { font-size: 11px; font-weight: 800; } |
| .dim-src { font-size: 7px; color: var(--text2); font-family: 'JetBrains Mono', monospace; margin-top: 2px; } |
| |
| |
| .tool-grid { |
| display: grid; |
| grid-template-columns: repeat(auto-fill, minmax(110px, 1fr)); |
| gap: 6px; |
| } |
| .tool { |
| background: var(--surface2); |
| border: 1px solid var(--border2); |
| border-left: 3px solid var(--green); |
| border-radius: 6px; |
| padding: 6px 10px; |
| } |
| .tool-name { font-size: 9px; font-weight: 700; } |
| .tool-file { font-size: 8px; color: var(--text2); font-family: 'JetBrains Mono', monospace; } |
| |
| |
| .ext-grid { |
| display: grid; |
| grid-template-columns: repeat(auto-fill, minmax(105px, 1fr)); |
| gap: 6px; |
| } |
| .ext { |
| background: rgba(139,148,158,0.04); |
| border: 1px solid rgba(139,148,158,0.12); |
| border-radius: 6px; |
| padding: 6px 8px; |
| text-align: center; |
| } |
| .ext-name { font-size: 9px; font-weight: 600; color: var(--text2); } |
| .ext-url { font-size: 7.5px; color: var(--text3); font-family: 'JetBrains Mono', monospace; } |
| |
| |
| .footer { |
| text-align: center; |
| padding: 24px; |
| font-size: 10px; |
| color: var(--text3); |
| font-family: 'JetBrains Mono', monospace; |
| } |
| .footer a { color: var(--accent); text-decoration: none; } |
| |
| |
| @keyframes pulse { 0%,100%{box-shadow:0 0 0 0 rgba(63,185,80,0.2)} 50%{box-shadow:0 0 0 6px rgba(63,185,80,0)} } |
| .pulse { animation: pulse 3s infinite; } |
| |
| |
| .side-note { |
| position: absolute; |
| font-size: 8px; |
| color: var(--text3); |
| font-family: 'JetBrains Mono', monospace; |
| writing-mode: vertical-rl; |
| text-orientation: mixed; |
| letter-spacing: 1px; |
| } |
| |
| |
| @media (max-width: 768px) { |
| .parallel { grid-template-columns: 1fr; } |
| .dims { grid-template-columns: repeat(3, 1fr); } |
| .did-layers { grid-template-columns: repeat(2, 1fr); } |
| } |
| </style> |
| </head> |
| <body> |
|
|
| |
| <div class="header"> |
| <h1>ThreatHunter v5.1 — 全域 Pipeline 流程圖</h1> |
| <div class="sub">完整資料流 · Defense-in-Depth · OSV-First Intelligence · 2026-04-19</div> |
| </div> |
|
|
| |
| <div class="stats"> |
| <div class="stat"><div class="stat-n" style="color:var(--blue)">7</div><div class="stat-l">AI Agents</div></div> |
| <div class="stat"><div class="stat-n" style="color:var(--purple)">20</div><div class="stat-l">Skill SOPs</div></div> |
| <div class="stat"><div class="stat-n" style="color:var(--green)">10</div><div class="stat-l">Tools</div></div> |
| <div class="stat"><div class="stat-n" style="color:#f97316">6+1</div><div class="stat-l">Rust Crates</div></div> |
| <div class="stat"><div class="stat-n" style="color:var(--cyan)">4</div><div class="stat-l">Scan Paths</div></div> |
| <div class="stat"><div class="stat-n" style="color:var(--orange)">6/6</div><div class="stat-l">API-Driven</div></div> |
| <div class="stat"><div class="stat-n" style="color:var(--red)">4</div><div class="stat-l">CVE Filters</div></div> |
| </div> |
|
|
| <div class="pipeline"> |
|
|
| |
| <div class="step"> |
| <div class="layer l-user"> |
| <div class="layer-head"> |
| <div class="layer-icon" style="background:rgba(57,210,192,0.1);color:var(--cyan)">👤</div> |
| <div class="layer-title">使用者輸入</div> |
| <div class="layer-sub">Browser → HTTP</div> |
| </div> |
| <div class="cards"> |
| <div class="card"> |
| <div class="card-name">🖥 主介面</div> |
| <div class="card-file">ui/static/index.html</div> |
| <div class="tags"><span class="t t-js">HTML5</span><span class="t t-js">CSS3</span><span class="t t-js">JS</span></div> |
| </div> |
| <div class="card"> |
| <div class="card-name">⚡ SSE 即時串流</div> |
| <div class="card-file">ui/static/app.js</div> |
| <div class="tags"><span class="t t-js">Vanilla JS</span><span class="t t-api">EventSource</span></div> |
| </div> |
| <div class="card"> |
| <div class="card-name">🔬 Checkpoint 儀表板</div> |
| <div class="card-file">ui/static/checkpoint.html</div> |
| <div class="tags"><span class="t t-js">HTML</span><span class="t t-js">JS</span></div> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| <div class="arrow"> |
| <div class="arrow-line"></div> |
| <div class="arrow-tag">POST /api/scan { tech_stack, input_type }</div> |
| </div> |
|
|
| |
| <div class="step"> |
| <div class="layer l-api"> |
| <div class="layer-head"> |
| <div class="layer-icon" style="background:rgba(88,166,255,0.1);color:var(--blue)">🚀</div> |
| <div class="layer-title">FastAPI Server + UI Filter</div> |
| <div class="layer-sub">ui/server.py</div> |
| </div> |
| <div class="cards"> |
| <div class="card" style="flex:2"> |
| <div class="card-name">🚀 FastAPI + Uvicorn</div> |
| <div class="card-file">ui/server.py — _pipeline_worker()</div> |
| <div class="tags"> |
| <span class="t t-py">Python 3.12</span> |
| <span class="t t-py">FastAPI</span> |
| <span class="t t-py">SSE</span> |
| <span class="t t-py">threading</span> |
| </div> |
| <div class="card-desc" style="margin-top:4px">接收掃描請求 → 分配 scan_id → 開啟 Worker Thread → SSE 推送進度</div> |
| </div> |
| <div class="card pulse"> |
| <div class="card-name" style="color:var(--red)">🛡 UI CVE Filter</div> |
| <div class="card-file">_enrich_result() L165</div> |
| <div class="shield shield-red">DEFENSE LAYER 4 · CVE < 2005 → 隱藏</div> |
| <div class="card-desc" style="margin-top:3px">最後防線:從 vulnerability_detail 濾除遠古 CVE</div> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| <div class="arrow"> |
| <div class="arrow-line"></div> |
| <div class="arrow-tag">Worker Thread → run_pipeline_with_callback()</div> |
| </div> |
|
|
| |
| <div class="step"> |
| <div class="layer l-l0"> |
| <div class="layer-head"> |
| <div class="layer-icon" style="background:rgba(248,81,73,0.1);color:var(--red)">🛡</div> |
| <div class="layer-title">L0 安全閘門 — 確定性(LLM 之前)</div> |
| <div class="layer-sub">OWASP LLM01:2025</div> |
| </div> |
| <div class="cards"> |
| <div class="card" style="flex:2"> |
| <div class="card-name">🔍 Input Sanitizer</div> |
| <div class="card-file">input_sanitizer.py</div> |
| <div class="tags"> |
| <span class="t t-py">Python</span> |
| <span class="t t-py">regex</span> |
| <span class="t t-py">hashlib</span> |
| </div> |
| <div class="card-desc" style="margin-top:4px"> |
| Blocklist 掃描 → L0 正則標記 → 輸入類型推斷 → SHA-256 追蹤 |
| </div> |
| </div> |
| <div class="card" style="opacity:0.6; border-style:dashed;"> |
| <div class="card-name" style="color:var(--orange)">🦀 Rust L0 Core</div> |
| <div class="card-file">rust/sanitizer/</div> |
| <div class="tags"><span class="t t-warn">計劃中</span><span class="t t-warn">PyO3</span></div> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| <div class="arrow"> |
| <div class="arrow-line"></div> |
| <div class="arrow-tag">SanitizeResult { safe, input_type, hash }</div> |
| </div> |
|
|
| |
| <div class="step"> |
| <div class="layer l-orch"> |
| <div class="layer-head"> |
| <div class="layer-icon" style="background:rgba(88,166,255,0.1);color:var(--blue)">⚙️</div> |
| <div class="layer-title">Pipeline v3.1 Coordinator</div> |
| <div class="layer-sub">main.py</div> |
| </div> |
| <div class="cards"> |
| <div class="card" style="flex:2"> |
| <div class="card-name">🧭 Orchestrator + Path Router</div> |
| <div class="card-file">agents/orchestrator.py + main.py</div> |
| <div class="tags"> |
| <span class="t t-py">Python</span> |
| <span class="t t-py">CrewAI</span> |
| </div> |
| <div style="display:flex;gap:4px;flex-wrap:wrap;margin-top:6px"> |
| <span class="path path-pkg">📦 Path A: PKG</span> |
| <span class="path path-code">🔍 Path B: CODE</span> |
| <span class="path path-ai">🤖 Path B: INJECTION</span> |
| <span class="path path-cfg">⚙️ Path C: CONFIG</span> |
| </div> |
| <div class="card-desc" style="margin-top:4px">input_type → 動態選擇 Skill SOP → Path-Aware 路由</div> |
| </div> |
| <div class="card"> |
| <div class="card-name">📝 Checkpoint Recorder</div> |
| <div class="card-file">checkpoint.py</div> |
| <div class="tags"><span class="t t-py">Python</span><span class="t t-json">JSONL</span></div> |
| <div class="card-desc" style="margin-top:4px">STAGE_ENTER · LLM_CALL · TOOL_CALL · DEGRADATION<br>append-only · threading.Lock</div> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| <div class="arrow"> |
| <div class="arrow-line"></div> |
| <div class="arrow-tag">OSV Batch Warmup (Harness 0) → PackageExtractor</div> |
| </div> |
|
|
| |
| <div class="step"> |
| <div class="layer l-par"> |
| <div class="layer-head"> |
| <div class="layer-icon" style="background:rgba(210,153,34,0.1);color:var(--orange)">⚡</div> |
| <div class="layer-title">Layer 1 — 並行處理(同時執行)</div> |
| <div class="layer-sub">concurrent.futures</div> |
| </div> |
| <div class="parallel"> |
| |
| <div class="card"> |
| <div class="card-name">🔒 Security Guard</div> |
| <div class="card-file">agents/security_guard.py</div> |
| <div class="tags"> |
| <span class="t t-py">CrewAI</span> |
| <span class="t t-py">ast.parse()</span> |
| <span class="t t-py">regex</span> |
| </div> |
| <div class="card-desc" style="margin-top:4px"> |
| Dual LLM Pattern · allow_delegation=False<br> |
| <span style="color:var(--text3)">→ skills/security_guard.md</span> |
| </div> |
| </div> |
| |
| <div class="card pulse" style="border-color:rgba(188,140,255,0.2)"> |
| <div class="card-name">🧮 Intel Fusion</div> |
| <div class="card-file">agents/intel_fusion.py</div> |
| <div class="tags"> |
| <span class="t t-py">CrewAI</span> |
| <span class="t t-new">OSV-First</span> |
| <span class="t t-py">6D Score</span> |
| </div> |
| <div class="shield shield-red" style="margin-top:4px">DEFENSE LAYER 2 · Harness 2.5 CVE < 2005 → 過濾</div> |
| <div class="card-desc" style="margin-top:3px"> |
| search_osv 優先 · NVD fallback · calculate_composite_score()<br> |
| <span style="color:var(--text3)">→ skills/intel_fusion.md</span> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| <div class="arrow"> |
| <div class="arrow-line"></div> |
| <div class="arrow-tag">parallel output → merged into pipeline context</div> |
| </div> |
|
|
| |
| <div class="step"> |
| <div class="layer l-scout"> |
| <div class="layer-head"> |
| <div class="layer-icon" style="background:rgba(63,185,80,0.1);color:var(--green)">🔭</div> |
| <div class="layer-title">Scout Agent — 情報蒐集</div> |
| <div class="layer-sub">agents/scout.py</div> |
| </div> |
| <div class="cards"> |
| <div class="card" style="flex:2"> |
| <div class="card-name">🔭 Scout Agent</div> |
| <div class="card-file">agents/scout.py — run_scout_pipeline()</div> |
| <div class="tags"> |
| <span class="t t-py">CrewAI</span> |
| <span class="t t-new">OSV-First</span> |
| <span class="t t-py">SKILL_MAP</span> |
| </div> |
| <div class="shield shield-red" style="margin-top:4px">DEFENSE LAYER 1 · Harness 3.5 CVE < 2005 → 過濾</div> |
| <div class="card-desc" style="margin-top:3px"> |
| Harness 0: OSV Batch Cache Warmup · Harness 3: NVD 驗證 (OSV cache 優先)<br> |
| Harness 3.5: CVE year filter · 從 output 移除遠古漏洞 |
| </div> |
| </div> |
| <div class="card"> |
| <div class="card-name" style="color:var(--purple)">📋 Path-Aware SOP</div> |
| <div class="card-file">skills/</div> |
| <div style="display:flex;flex-direction:column;gap:2px;margin-top:4px"> |
| <span class="t t-md" style="font-size:7px">pkg → threat_intel.md</span> |
| <span class="t t-md" style="font-size:7px">code → source_code_audit.md</span> |
| <span class="t t-md" style="font-size:7px">injection → ai_security_audit.md</span> |
| <span class="t t-md" style="font-size:7px">config → config_audit.md</span> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| <div class="arrow"> |
| <div class="arrow-line"></div> |
| <div class="arrow-tag">Scout JSON { vulnerabilities[], packages[], risk_hints }</div> |
| </div> |
|
|
| |
| <div class="step"> |
| <div class="layer l-analyst"> |
| <div class="layer-head"> |
| <div class="layer-icon" style="background:rgba(88,166,255,0.1);color:var(--blue)">🔬</div> |
| <div class="layer-title">Analyst Agent — 攻擊連鎖分析</div> |
| <div class="layer-sub">agents/analyst.py</div> |
| </div> |
| <div class="cards"> |
| <div class="card" style="flex:2"> |
| <div class="card-name">🔬 Analyst Agent</div> |
| <div class="card-file">agents/analyst.py — run_analyst_pipeline()</div> |
| <div class="tags"> |
| <span class="t t-py">CrewAI</span> |
| <span class="t t-py">3-Task Pipeline</span> |
| <span class="t t-py">SKILL_MAP</span> |
| </div> |
| <div class="shield shield-cyan" style="margin-top:4px">Harness: _harness_filter_ancient_cves() · 標記 NEEDS_VERIFICATION</div> |
| <div class="card-desc" style="margin-top:3px"> |
| Task 1: Parse Scout → Task 2: KEV + Exploit 查詢 → Task 3: Chain Analysis<br> |
| KillChain · 攻擊連鎖推理 · Adaptive Weight |
| </div> |
| </div> |
| <div class="card"> |
| <div class="card-name" style="color:var(--purple)">📋 Path-Aware SOP</div> |
| <div class="card-file">skills/</div> |
| <div style="display:flex;flex-direction:column;gap:2px;margin-top:4px"> |
| <span class="t t-md" style="font-size:7px">pkg → chain_analysis.md</span> |
| <span class="t t-md" style="font-size:7px">code → code_chain_analysis.md</span> |
| <span class="t t-md" style="font-size:7px">injection → ai_chain_analysis.md</span> |
| <span class="t t-md" style="font-size:7px">config → config_chain_analysis.md</span> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| <div class="arrow"> |
| <div class="arrow-line"></div> |
| <div class="arrow-tag">Analyst JSON { analysis[], chain_risk, adjusted_risk }</div> |
| </div> |
|
|
| |
| <div class="step"> |
| <div class="layer l-critic"> |
| <div class="layer-head"> |
| <div class="layer-icon" style="background:rgba(248,81,73,0.1);color:var(--red)">⚔️</div> |
| <div class="layer-title">Critic Agent — 對抗式辯論 (ColMAD)</div> |
| <div class="layer-sub">agents/critic.py · ENABLE_CRITIC=True</div> |
| </div> |
| <div class="cards"> |
| <div class="card" style="flex:2"> |
| <div class="card-name">⚔️ Critic Agent</div> |
| <div class="card-file">agents/critic.py — run_critic_pipeline()</div> |
| <div class="tags"> |
| <span class="t t-py">CrewAI</span> |
| <span class="t t-red">ColMAD Debate</span> |
| <span class="t t-py">5D Scorecard</span> |
| </div> |
| <div class="card-desc" style="margin-top:4px"> |
| red_team · blue_team · arbiter 三角色驗證<br> |
| MAINTAIN / DOWNGRADE 判決 · challenge 產生 critic_context |
| </div> |
| </div> |
| <div class="card"> |
| <div class="card-name" style="color:var(--purple)">📋 Path-Aware SOP</div> |
| <div class="card-file">skills/</div> |
| <div style="display:flex;flex-direction:column;gap:2px;margin-top:4px"> |
| <span class="t t-md" style="font-size:7px">pkg → debate_sop.md</span> |
| <span class="t t-md" style="font-size:7px">code → code_debate_sop.md</span> |
| <span class="t t-md" style="font-size:7px">injection → ai_debate_sop.md</span> |
| <span class="t t-md" style="font-size:7px">config → config_debate_sop.md</span> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| <div class="arrow"> |
| <div class="arrow-line"></div> |
| <div class="arrow-tag">Critic JSON { verdict, challenges[], weighted_score }</div> |
| </div> |
|
|
| |
| <div class="step"> |
| <div class="layer l-advisor"> |
| <div class="layer-head"> |
| <div class="layer-icon" style="background:rgba(63,185,80,0.1);color:var(--green)">📋</div> |
| <div class="layer-title">Advisor Agent — 最終裁決者 (Judge)</div> |
| <div class="layer-sub">agents/advisor.py</div> |
| </div> |
| <div class="cards"> |
| <div class="card pulse" style="flex:2"> |
| <div class="card-name">📋 Advisor Agent</div> |
| <div class="card-file">agents/advisor.py — run_advisor_pipeline()</div> |
| <div class="tags"> |
| <span class="t t-py">CrewAI</span> |
| <span class="t t-py">6-Layer Harness</span> |
| <span class="t t-py">Judge + Feedback</span> |
| </div> |
| <div class="shield shield-red" style="margin-top:4px">DEFENSE LAYER 3 · Harness 6 CVE < 2005 → 從 urgent/important 移除</div> |
| <div class="card-desc" style="margin-top:3px"> |
| L1: 強制輸出 · L2: Schema · L3: risk_score 0-100 · L4: command · L5: 重複比對 · L6: 年份過濾 |
| </div> |
| </div> |
| <div class="card"> |
| <div class="card-name" style="color:var(--purple)">📋 Path-Aware SOP</div> |
| <div class="card-file">skills/</div> |
| <div style="display:flex;flex-direction:column;gap:2px;margin-top:4px"> |
| <span class="t t-md" style="font-size:7px">pkg → action_report.md</span> |
| <span class="t t-md" style="font-size:7px">code → code_action_report.md</span> |
| <span class="t t-md" style="font-size:7px">injection → ai_action_report.md</span> |
| <span class="t t-md" style="font-size:7px">config → config_action_report.md</span> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| <div class="arrow"> |
| <div class="arrow-line"></div> |
| <div class="arrow-tag">Advisor JSON → _enrich_result() → SSE scan_complete → UI</div> |
| </div> |
|
|
| |
| <div class="step"> |
| <div class="did-strip"> |
| <div class="did-title">🛡 Defense-in-Depth — CVE 年份過濾(year < 2005 → 攔截)</div> |
| <div class="did-layers"> |
| <div class="did-item"> |
| <div class="did-num">L1</div> |
| <div style="font-size:9px;font-weight:700;margin-top:2px">Scout</div> |
| <div class="did-loc">scout.py Harness 3.5</div> |
| <div class="did-desc">Scout output 過濾</div> |
| </div> |
| <div class="did-item"> |
| <div class="did-num">L2</div> |
| <div style="font-size:9px;font-weight:700;margin-top:2px">Intel Fusion</div> |
| <div class="did-loc">intel_fusion.py Harness 2.5</div> |
| <div class="did-desc">fusion_results 過濾</div> |
| </div> |
| <div class="did-item"> |
| <div class="did-num">L3</div> |
| <div style="font-size:9px;font-weight:700;margin-top:2px">Advisor</div> |
| <div class="did-loc">advisor.py Harness 6</div> |
| <div class="did-desc">urgent/important 過濾</div> |
| </div> |
| <div class="did-item"> |
| <div class="did-num">L4</div> |
| <div style="font-size:9px;font-weight:700;margin-top:2px">UI Server</div> |
| <div class="did-loc">server.py _enrich_result</div> |
| <div class="did-desc">vulnerability_detail 最終過濾</div> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| <div class="arrow" style="padding:10px 0"> |
| <div style="width:100%;height:1px;background:linear-gradient(90deg,transparent,var(--border2),transparent)"></div> |
| </div> |
|
|
| |
| <div class="step"> |
| <div class="dim-panel"> |
| <div class="dim-title">⚡ 六維情報融合分析 — 100% API 驅動 · 0% LLM 猜測</div> |
| <div class="dims"> |
| <div class="dim"> |
| <div class="dim-name" style="color:var(--green)">CVSS</div> |
| <div class="dim-w" style="color:var(--green)">20%</div> |
| <div class="dim-src">NVD API v2</div> |
| </div> |
| <div class="dim"> |
| <div class="dim-name" style="color:var(--purple)">EPSS</div> |
| <div class="dim-w" style="color:var(--purple)">30%</div> |
| <div class="dim-src">FIRST.org</div> |
| </div> |
| <div class="dim"> |
| <div class="dim-name" style="color:var(--red)">KEV</div> |
| <div class="dim-w" style="color:var(--red)">25%</div> |
| <div class="dim-src">CISA API</div> |
| </div> |
| <div class="dim"> |
| <div class="dim-name" style="color:var(--cyan)">GHSA</div> |
| <div class="dim-w" style="color:var(--cyan)">10%</div> |
| <div class="dim-src">OSV.dev</div> |
| </div> |
| <div class="dim"> |
| <div class="dim-name" style="color:var(--orange)">ATT&CK</div> |
| <div class="dim-w" style="color:var(--orange)">10%</div> |
| <div class="dim-src">CWE→CAPEC Map</div> |
| </div> |
| <div class="dim"> |
| <div class="dim-name" style="color:var(--text2)">OTX</div> |
| <div class="dim-w" style="color:var(--text2)">5%</div> |
| <div class="dim-src">AlienVault</div> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| <div class="arrow" style="padding:10px 0"> |
| <div style="width:100%;height:1px;background:linear-gradient(90deg,transparent,var(--border2),transparent)"></div> |
| </div> |
|
|
| |
| <div class="step"> |
| <div class="layer l-tools"> |
| <div class="layer-head"> |
| <div class="layer-icon" style="background:rgba(57,210,192,0.1);color:var(--cyan)">🔧</div> |
| <div class="layer-title">工具層 — Agents 呼叫</div> |
| <div class="layer-sub">tools/</div> |
| </div> |
| <div class="tool-grid"> |
| <div class="tool" style="border-left-color:var(--cyan);position:relative"> |
| <div style="position:absolute;top:3px;right:3px;font-size:6px;padding:1px 4px;background:rgba(57,210,192,0.1);border:1px solid rgba(57,210,192,0.3);border-radius:2px;color:var(--cyan);font-weight:700;font-family:'JetBrains Mono',monospace">PRIMARY</div> |
| <div class="tool-name">🎯 OSV Tool</div> |
| <div class="tool-file">osv_tool.py</div> |
| <div class="tags" style="margin-top:2px"><span class="t t-new" style="font-size:7px">ecosystem-aware</span></div> |
| </div> |
| <div class="tool" style="opacity:0.7;position:relative"> |
| <div style="position:absolute;top:3px;right:3px;font-size:6px;padding:1px 4px;background:rgba(139,148,158,0.1);border:1px solid rgba(139,148,158,0.3);border-radius:2px;color:var(--text2);font-weight:700;font-family:'JetBrains Mono',monospace">FALLBACK</div> |
| <div class="tool-name">🔎 NVD Tool</div> |
| <div class="tool-file">nvd_tool.py</div> |
| </div> |
| <div class="tool"> |
| <div class="tool-name">⚠️ KEV Tool</div> |
| <div class="tool-file">kev_tool.py</div> |
| </div> |
| <div class="tool"> |
| <div class="tool-name">🌐 OTX Tool</div> |
| <div class="tool-file">otx_tool.py</div> |
| </div> |
| <div class="tool"> |
| <div class="tool-name">💣 Exploit Tool</div> |
| <div class="tool-file">exploit_tool.py</div> |
| </div> |
| <div class="tool" style="border-left-color:var(--purple)"> |
| <div class="tool-name">📊 EPSS Tool</div> |
| <div class="tool-file">epss_tool.py</div> |
| </div> |
| <div class="tool" style="border-left-color:var(--orange)"> |
| <div class="tool-name">🎯 ATT&CK Tool</div> |
| <div class="tool-file">attck_tool.py</div> |
| </div> |
| <div class="tool" style="border-left-color:var(--purple)"> |
| <div class="tool-name">📦 GHSA Tool</div> |
| <div class="tool-file">ghsa_tool.py</div> |
| </div> |
| <div class="tool"> |
| <div class="tool-name">💾 Memory Tool</div> |
| <div class="tool-file">memory_tool.py</div> |
| </div> |
| <div class="tool"> |
| <div class="tool-name">📦 Pkg Extractor</div> |
| <div class="tool-file">package_extractor.py</div> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| <div class="arrow" style="padding:8px 0"> |
| <div style="width:100%;height:1px;background:linear-gradient(90deg,transparent,var(--border2),transparent)"></div> |
| </div> |
|
|
| |
| <div class="step"> |
| <div class="layer l-memory"> |
| <div class="layer-head"> |
| <div class="layer-icon" style="background:rgba(63,185,80,0.1);color:var(--green)">🗃</div> |
| <div class="layer-title">持久化記憶 + 快取</div> |
| <div class="layer-sub">memory/ · data/ · logs/</div> |
| </div> |
| <div class="cards" style="gap:6px"> |
| <div class="card" style="min-width:100px;flex:unset"> |
| <div class="card-name" style="font-size:10px">📂 Scout</div> |
| <div class="card-file">scout_memory.json</div> |
| </div> |
| <div class="card" style="min-width:100px;flex:unset"> |
| <div class="card-name" style="font-size:10px">📂 Analyst</div> |
| <div class="card-file">analyst_memory.json</div> |
| </div> |
| <div class="card" style="min-width:100px;flex:unset"> |
| <div class="card-name" style="font-size:10px">📂 Advisor</div> |
| <div class="card-file">advisor_memory.json</div> |
| </div> |
| <div class="card" style="min-width:100px;flex:unset"> |
| <div class="card-name" style="font-size:10px">📝 Checkpoint</div> |
| <div class="card-file">*.jsonl</div> |
| <div class="tags"><span class="t t-json" style="font-size:7px">append-only</span></div> |
| </div> |
| <div class="card" style="min-width:100px;flex:unset;border-left:2px solid var(--cyan)"> |
| <div class="card-name" style="font-size:10px;color:var(--cyan)">🎯 OSV Cache</div> |
| <div class="card-file">osv_cache_*.json</div> |
| <div class="tags"><span class="t t-new" style="font-size:7px">24h TTL</span></div> |
| </div> |
| <div class="card" style="min-width:100px;flex:unset"> |
| <div class="card-name" style="font-size:10px">📦 NVD Cache</div> |
| <div class="card-file">nvd_cache.json</div> |
| </div> |
| <div class="card" style="min-width:100px;flex:unset;border-left:2px solid var(--purple)"> |
| <div class="card-name" style="font-size:10px;color:var(--purple)">📊 EPSS Cache</div> |
| <div class="card-file">epss_cache_*.json</div> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| <div class="arrow" style="padding:8px 0"> |
| <div style="width:100%;height:1px;background:linear-gradient(90deg,transparent,var(--border2),transparent)"></div> |
| </div> |
|
|
| |
| <div class="step"> |
| <div class="layer l-harness"> |
| <div class="layer-head"> |
| <div class="layer-icon" style="background:rgba(210,153,34,0.1);color:var(--orange)">🏗</div> |
| <div class="layer-title">Harness Engineering 基礎設施</div> |
| <div class="layer-sub">三柱架構</div> |
| </div> |
| <div class="cards"> |
| <div class="card"> |
| <div class="card-name">Layer 1 — Context</div> |
| <div class="card-file">harness/context/</div> |
| <div class="card-desc">agent_map · doc_indexer</div> |
| </div> |
| <div class="card"> |
| <div class="card-name">Layer 2 — Constraints</div> |
| <div class="card-file">harness/constraints/</div> |
| <div class="card-desc">arch_linter · boundary_rules.toml</div> |
| </div> |
| <div class="card"> |
| <div class="card-name">Layer 3 — Entropy</div> |
| <div class="card-file">harness/entropy/</div> |
| <div class="card-desc">entropy_scanner · until_clean_loop</div> |
| </div> |
| <div class="card"> |
| <div class="card-name">🔧 Config / LLM</div> |
| <div class="card-file">config.py</div> |
| <div class="tags"><span class="t t-api" style="font-size:7px">OpenRouter</span></div> |
| <div class="card-desc" style="margin-top:2px">降級瀑布 · 429 輪替 · rate_limiter</div> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| <div class="arrow" style="padding:8px 0"> |
| <div style="width:100%;height:1px;background:linear-gradient(90deg,transparent,var(--border2),transparent)"></div> |
| </div> |
|
|
| |
| <div class="step"> |
| <div class="layer l-rust"> |
| <div class="layer-head"> |
| <div class="layer-icon" style="background:rgba(249,115,22,0.12);color:#f97316">🦀</div> |
| <div class="layer-title">Rust 高效能層 + 安全隔離 Sandbox</div> |
| <div class="layer-sub">rust/ · sandbox/ · PyO3 + maturin</div> |
| </div> |
|
|
| |
| <div style="font-size:9px;text-transform:uppercase;letter-spacing:1.5px;color:#f97316;font-weight:700;margin-bottom:8px">🦀 Rust PyO3 Crates(6 個 cdylib · Cargo Workspace)</div> |
| <div class="cards" style="gap:6px;margin-bottom:14px"> |
| <div class="card" style="border-left:3px solid #f97316;flex:1"> |
| <div class="card-name" style="color:#f97316">🛡 sanitizer</div> |
| <div class="card-file">rust/sanitizer/</div> |
| <div class="tags" style="margin-top:3px"> |
| <span class="t t-rust" style="font-size:7px">Rust</span> |
| <span class="t t-rust" style="font-size:7px">PyO3</span> |
| <span class="t t-rust" style="font-size:7px">regex</span> |
| <span class="t t-rust" style="font-size:7px">sha2</span> |
| </div> |
| <div class="card-desc" style="margin-top:3px">scan_blocklist · infer_input_type · sha256_hex<br>替代 input_sanitizer.py 的效能關鍵路徑</div> |
| </div> |
| <div class="card" style="border-left:3px solid #f97316;flex:1"> |
| <div class="card-name" style="color:#f97316">📝 checkpoint_writer</div> |
| <div class="card-file">rust/checkpoint_writer/</div> |
| <div class="tags" style="margin-top:3px"> |
| <span class="t t-rust" style="font-size:7px">Rust</span> |
| <span class="t t-rust" style="font-size:7px">tokio</span> |
| <span class="t t-rust" style="font-size:7px">parking_lot</span> |
| </div> |
| <div class="card-desc" style="margin-top:3px">open_writer · write_line · flush · write_batch<br>Mutex + BufWriter 高效 JSONL I/O</div> |
| </div> |
| <div class="card" style="border-left:3px solid #f97316;flex:1"> |
| <div class="card-name" style="color:#f97316">🔒 prompt_sandbox</div> |
| <div class="card-file">rust/prompt_sandbox/</div> |
| <div class="tags" style="margin-top:3px"> |
| <span class="t t-rust" style="font-size:7px">Rust</span> |
| <span class="t t-rust" style="font-size:7px">wasmtime 28</span> |
| <span class="t t-rust" style="font-size:7px">WASM</span> |
| </div> |
| <div class="card-desc" style="margin-top:3px">sandbox_eval · L0.5 WASM Runtime<br>wasmtime Host · prompt_guard.wasm</div> |
| </div> |
| </div> |
| <div class="cards" style="gap:6px;margin-bottom:14px"> |
| <div class="card" style="border-left:3px solid #f97316"> |
| <div class="card-name" style="color:#f97316">📋 json_validator</div> |
| <div class="card-file">rust/json_validator/</div> |
| <div class="tags" style="margin-top:3px"> |
| <span class="t t-rust" style="font-size:7px">serde_json</span> |
| <span class="t t-rust" style="font-size:7px">regex</span> |
| </div> |
| <div class="card-desc" style="margin-top:3px">safe_parse_json · validate_cve_id · validate_cve_list</div> |
| </div> |
| <div class="card" style="border-left:3px solid #f97316"> |
| <div class="card-name" style="color:#f97316">💾 memory_validator</div> |
| <div class="card-file">rust/memory_validator/</div> |
| <div class="tags" style="margin-top:3px"> |
| <span class="t t-rust" style="font-size:7px">serde_json</span> |
| <span class="t t-rust" style="font-size:7px">regex</span> |
| </div> |
| <div class="card-desc" style="margin-top:3px">validate_memory_write · validate_cve_id</div> |
| </div> |
| <div class="card" style="border-left:3px solid #f97316"> |
| <div class="card-name" style="color:#f97316">🔗 url_builder</div> |
| <div class="card-file">rust/url_builder/</div> |
| <div class="tags" style="margin-top:3px"> |
| <span class="t t-rust" style="font-size:7px">url crate</span> |
| </div> |
| <div class="card-desc" style="margin-top:3px">build_api_url · validate_url · encode_query_value</div> |
| </div> |
| <div class="card" style="border-left:3px dashed #f97316"> |
| <div class="card-name" style="color:#f97316">🎯 prompt_sandbox_guest</div> |
| <div class="card-file">rust/prompt_sandbox_guest/</div> |
| <div class="tags" style="margin-top:3px"> |
| <span class="t t-rust" style="font-size:7px">wasm32-unknown-unknown</span> |
| </div> |
| <div class="card-desc" style="margin-top:3px">WASM Guest → prompt_guard.wasm</div> |
| </div> |
| </div> |
|
|
| |
| <div style="font-size:9px;text-transform:uppercase;letter-spacing:1.5px;color:var(--cyan);font-weight:700;margin-bottom:8px">🐳 Python Sandbox 安全隔離模組(三層防禦 + Graceful Degradation)</div> |
| <div class="cards" style="gap:6px;margin-bottom:10px"> |
| <div class="card" style="border-left:3px solid var(--cyan)"> |
| <div class="card-name" style="color:var(--cyan)">🔍 AST Guard</div> |
| <div class="card-file">sandbox/ast_guard.py</div> |
| <div class="tags" style="margin-top:3px"> |
| <span class="t t-py" style="font-size:7px">Python</span> |
| <span class="t t-py" style="font-size:7px">ast.parse()</span> |
| </div> |
| <div class="card-desc" style="margin-top:3px">Layer 1 — AST 遮罩 + timeout</div> |
| </div> |
| <div class="card" style="border-left:3px solid var(--cyan)"> |
| <div class="card-name" style="color:var(--cyan)">🐳 Docker Sandbox</div> |
| <div class="card-file">sandbox/docker_sandbox.py</div> |
| <div class="tags" style="margin-top:3px"> |
| <span class="t t-py" style="font-size:7px">Python</span> |
| <span class="t t-api" style="font-size:7px">Docker</span> |
| </div> |
| <div class="card-desc" style="margin-top:3px">Layer 2 — 容器隔離 · seccomp-profile.json</div> |
| </div> |
| <div class="card" style="border-left:3px solid var(--cyan)"> |
| <div class="card-name" style="color:var(--cyan)">🧹 Memory Sanitizer</div> |
| <div class="card-file">sandbox/memory_sanitizer.py</div> |
| <div class="tags" style="margin-top:3px"> |
| <span class="t t-py" style="font-size:7px">Python</span> |
| <span class="t t-py" style="font-size:7px">regex</span> |
| </div> |
| <div class="card-desc" style="margin-top:3px">Layer 3 — 記憶快取淨化 · CVE year 正則</div> |
| </div> |
| </div> |
|
|
| |
| <div style="display:flex;gap:6px;align-items:center;padding:8px 12px;background:rgba(249,115,22,0.04);border:1px solid rgba(249,115,22,0.12);border-radius:6px;font-size:9px;color:var(--text2)"> |
| <span style="font-weight:700;color:#f97316">BUILD</span> |
| <span class="t t-rust" style="font-size:7px">maturin develop</span> |
| <span class="t t-rust" style="font-size:7px">MinGW-w64 GNU</span> |
| <span class="t t-rust" style="font-size:7px">x86_64-pc-windows-gnu</span> |
| <span style="margin-left:auto;font-family:'JetBrains Mono',monospace;font-size:8px">build_rust_crates.py</span> |
| </div> |
| </div> |
| </div> |
|
|
| <div class="arrow" style="padding:8px 0"> |
| <div style="width:100%;height:1px;background:linear-gradient(90deg,transparent,var(--border2),transparent)"></div> |
| </div> |
|
|
| |
| <div class="step"> |
| <div class="layer l-ext"> |
| <div class="layer-head"> |
| <div class="layer-icon" style="background:rgba(139,148,158,0.1);color:var(--text2)">☁️</div> |
| <div class="layer-title">外部 API 依賴</div> |
| <div class="layer-sub">REST / JSON Feed</div> |
| </div> |
| <div class="ext-grid"> |
| <div class="ext" style="border-color:rgba(57,210,192,0.3);background:rgba(57,210,192,0.03)"> |
| <div class="ext-name" style="color:var(--cyan)">🎯 OSV.dev</div> |
| <div class="ext-url">api.osv.dev/v1</div> |
| <div class="tags" style="justify-content:center;margin-top:3px"><span class="t t-new" style="font-size:6px">PRIMARY</span></div> |
| </div> |
| <div class="ext"> |
| <div class="ext-name">🔒 NVD v2</div> |
| <div class="ext-url">services.nvd.nist.gov</div> |
| </div> |
| <div class="ext"> |
| <div class="ext-name">⚠️ CISA KEV</div> |
| <div class="ext-url">cisa.gov</div> |
| </div> |
| <div class="ext" style="border-color:rgba(188,140,255,0.3);background:rgba(188,140,255,0.03)"> |
| <div class="ext-name" style="color:var(--purple)">📊 FIRST EPSS</div> |
| <div class="ext-url">api.first.org/epss</div> |
| </div> |
| <div class="ext"> |
| <div class="ext-name">🌐 OTX</div> |
| <div class="ext-url">otx.alienvault.com</div> |
| </div> |
| <div class="ext" style="border-color:rgba(210,153,34,0.3);background:rgba(210,153,34,0.03)"> |
| <div class="ext-name" style="color:var(--orange)">🎯 ATT&CK</div> |
| <div class="ext-url">CWE→CAPEC→T-ID</div> |
| </div> |
| <div class="ext"> |
| <div class="ext-name">🤖 LLM</div> |
| <div class="ext-url">openrouter.ai</div> |
| </div> |
| <div class="ext"> |
| <div class="ext-name">💣 GitHub</div> |
| <div class="ext-url">api.github.com</div> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| </div> |
|
|
| |
| <div class="footer"> |
| <div style="margin-bottom:6px"> |
| <span style="color:var(--blue)">Python</span> — agents/ · tools/ · ui/ · main.py · config.py · checkpoint.py · harness/ | |
| <span style="color:#f97316">Rust</span> — 6 PyO3 crates + WASM Guest(sanitizer · json_validator · memory_validator · url_builder · checkpoint_writer · prompt_sandbox) | |
| <span style="color:var(--yellow)">JS/HTML/CSS</span> — 前端介面 | |
| <span style="color:var(--purple)">Markdown</span> — 20 Skill SOP | |
| <span style="color:var(--green)">JSON/JSONL</span> — 記憶 + 日誌 |
| </div> |
| <div style="display:inline-block;padding:6px 14px;background:rgba(57,210,192,0.05);border:1px solid rgba(57,210,192,0.15);border-radius:6px;margin-top:4px"> |
| ⚡ <strong style="color:var(--cyan)">v5.1</strong> · OSV-First · 4-Layer CVE Defense · 6D 100% API · 🦀 Rust PyO3 · Harness Engineering |
| </div> |
| <div style="margin-top:8px;color:rgba(255,255,255,0.2)"> |
| ThreatHunter v5.1 · 2026-04-19 · AMD Developer Hackathon · Built with Antigravity |
| </div> |
| </div> |
|
|
| </body> |
| </html> |
|
|