云原生攻击面映射器与漏洞关联器 — v3.0
NetLogic 是一个网络安全平台,结合了主动端口扫描、CVE 关联(实时 NVD API)、SSL/TLS 分析、HTTP 安全审计、DNS/电子邮件安全评估、子域名接管检测、被动 OSINT、主动漏洞探测、AI 驱动推理引擎、跨主机攻击链发现以及深度探测代理架构——以 Web 应用形式交付(React 仪表盘 + FastAPI)。核心扫描引擎纯 Python 3.9+ 标准库实现,无第三方依赖。
| 模块 | 描述 |
|---|---|
| Port Scanner | TCP 连接扫描,支持 43/58 个端口、22 种服务探测、横幅抓取 |
| CVE Correlator | 实时 NVD API v2.0 + 通过 FIRST.org 的 EPSS 丰富 |
| TLS Analyzer | 协议版本、弱密码套件、POODLE/BEAST/CRIME/DROWN、证书过期 |
| HTTP Header Audit | HSTS、CSP、X-Frame-Options、CORS、Cookie 标志;0–100 分 |
| Stack Fingerprint | 从横幅/头部/正文检测 CMS、框架、云提供商、CDN、WAF |
| DNS Security | SPF、DKIM、DMARC、DNSSEC、区域传输、欺骗性评分 |
| Passive OSINT | 证书透明度日志、DoH DNS、ASN 查询——无直接目标接触 |
| Service Prober | 未认证 Redis/Mongo/ES/Docker/K8s/etcd 探测、33 个管理路径 |
| Takeover Detector | CT 日志子域名发现 + 25 个云提供商 CNAME 指纹 |
| Nuclei Integration | 13k+ 社区模板封装(CVE、技术、暴露、错误配置)— MIT 许可证 |
| Fusion Pipeline | 多传感器信号门 → 确定性共识 → AI 裁决 → 攻击图 → 6 部分报告 |
| Web Fingerprint | Favicon 哈希(兼容 Shodan 的 mmh3)、JS 密钥、版本标记、暴露文件、默认登录页检测 |
| AI Analysis | OpenAI / Anthropic / OpenRouter / Ollama / Gemini / Groq / Kimi / Qwen — 令牌流式 SSE |
| Reasoning Engine | 自适应观察→推理→行动循环,包含证据图、假设引擎、置信度衰减、溯源、调度器、剧本、变更检测、主动验证 |
| Deep Probe | 每服务代理架构:ScoutAgent(侦察)、ProbeAgent(定向 CVE 检查)、协调器、沙箱 |
| AI Investigation Agent | ReAct 风格循环:在基线传感器之后,AI 驱动精炼、范围受限、可审计的工具面(约 35 个工具)来验证线索并构建攻击链——并可选启用激进工具(崩溃探测、自由形式验证、自由形式利用)用于授权目标 |
| Verifier Engine | AI 驱动的 CVE 重新验证:从 CVE 上下文设计原始 HTTP 探测计划,通过标准库套接字执行 |
| Multi-Host Orchestration | 每主机完整扫描流水线 → 跨主机上下文与可达性矩阵 → 攻击链发现 |
| AI Sensor Directors | LLM 根据开放端口、技术栈和 CVE 决定优先使用哪些传感器 |
| Authenticated SSH | 带凭证的 ssh 子进程读取实际安装的软件包版本(60+ 产品映射) |
| Service Enum | 协议级属性提取(SSH KEX、SMBv1、RDP NLA、SNMP 团体、HTTP 认证状态) |
| Topology Mapper | 反向 DNS、IPv6、traceroute、通过 ip-api.com 获取 ASN/组织/国家 |
| 模式 | 命令 | 功能 |
|---|---|---|
| Web 应用 | netlogic --gui | 启动 FastAPI 并提供 React SPA + 进程内扫描代理,自动生成密钥,并在浏览器中打开仪表盘。这是运行 Web 应用的唯一方式。 |
| 命令行 | netlogic <target> [flags] | 一次性终端扫描(无服务器),打印/写入报告。 |
产品界面是 Web 应用(React 仪表盘 + FastAPI)。src/ 下的扫描引擎驱动从 UI 启动的任务。
pip install -r requirements-api.txt pip install -e .
netlogic --gui
netlogic scanme.nmap.org --full
---
## CLI 参考```
netlogic [target] [flags]
入口点是 api.cli:main(定义在 pyproject.toml 中),它将任务委托给 netlogic.py:main()。所有扫描逻辑都在 src/ 目录下。
netlogic example.com
netlogic example.com --full
netlogic example.com --tls --headers
netlogic example.com --takeover
netlogic example.com --osint
netlogic example.com --stack
netlogic example.com --dns
netlogic 10.0.0.5 --probe
netlogic example.com --full --probe
### 端口选择```
# Quick — 43 common ports (default)
netlogic example.com --ports quick
# Full — 58 extended ports
netlogic example.com --ports full
# Custom list
netlogic example.com --ports custom=22,80,443,8080,9200
netlogic example.com --ai --ai-key $KEY
netlogic example.com --ai --ai-provider openai --ai-key $KEY --ai-model gpt-4o-mini
netlogic example.com --ai --ai-provider anthropic --ai-key $KEY
netlogic example.com --ai --ai-provider gemini --ai-key $KEY --ai-model gemini-2.0-flash
netlogic example.com --ai --ai-provider ollama
netlogic example.com --ai --ai-provider custom --ai-base-url https://... --ai-model model-name
### 支持的AI提供商
| 提供商 | 默认模型 | API 风格 |
|---|---|---|
| `openrouter` | `anthropic/claude-sonnet-4` | OpenAI |
| `openai` | `gpt-4o-mini` | OpenAI |
| `anthropic` | `claude-3-5-sonnet-20241022` | Anthropic Messages |
| `kimi` (Moonshot) | `kimi-k2.6` | OpenAI |
| `qwen` (Alibaba) | `qwen-plus` | OpenAI |
| `groq` | `llama-3.3-70b-versatile` | OpenAI |
| `gemini` (Google) | `gemini-2.0-flash` | OpenAI |
| `ollama` | `llama3` | OpenAI |
| `custom` | 用户指定 | OpenAI |
### 推理引擎```
# Adaptive observe→reason→act loop (deterministic by default; AI-augmented with --ai)
netlogic example.com --reason
# Multi-host world modeling — discovers in-scope neighbours, reasons per host
netlogic example.com --reason --multi-host
# Change detection — diffs against prior saved report
netlogic example.com --since-last
# Active validation — confirms hypotheses with safe non-destructive GETs
netlogic example.com --reason --active-validate
# Deep probe — per-service agent architecture with context isolation
netlogic example.com --deep-probe
基线传感器运行后,一个可选的 ReAct 风格智能体让 AI 能够自行驱动其工具来验证线索并构建攻击链,而不是将版本/横幅 CVE 命中作为未经验证的线索搁置。AI 提出工具调用;确定性运行时执行它们——每个工具都限定范围于目标,经过清理,并作为观察记录。AI 从不直接接触网络。```
netlogic example.com --ai --ai-agent
netlogic example.com --ai --agent-depth --agent-max-steps 24 --agent-max-requests 80
该代理默认拥有约35个只读/安全活跃工具:HTTP/TLS/DNS 探测器、`dir_enum`、`confirm_tech`、
`timing_probe`、`cve_probe`(精选的已知 CVE 标记检查)、`sqli_boolean`/`sqli_time`、`ssrf_canary`、
`idor_diff`、`file_disclosure`、`browser_get`(无头模式,通过 JS 挑战),以及 HackerOne 记账功能
(`record_poc`、`severity_suggest`、`submit_readiness`)。
**选择加入的攻击性工具** — 默认关闭,**仅限授权/拥有范围内的目标**(绝不用于公开或陌生人扫描)。每个都需要 `--ai-agent`:
| 标志 | 工具 | 解锁内容 | 保留限制 |
|---|---|---|---|
| `--allow-crash-probes` | `crash_probe` | 精选的崩溃/DoS CVE 检查(http.sys、MS15-034),可能导致主机崩溃 | 固定的 3-CVE 目录 — 非自由格式 |
| `--allow-freeform-proof` | `http_proof` | C 级:自由格式的 GET/HEAD/OPTIONS(+ 对搜索/登录/类 GraphQL 路径的 POST) | 破坏性模式 + PUT/PATCH/DELETE 被阻止;证明,而非修改 |
| `--allow-exploit-requests` | `exploit_request` | E 级:**任意方法**(包括 PUT/PATCH/DELETE)+ 针对目标的任意路径/标头/主体 | 作用域限制;在大量破坏性模式(DROP/TRUNCATE TABLE、`rm -rf`)和 CR/LF 标头注入上失败关闭;每个请求均被审计 |
确定性的 ActionGate 将核心保持在 `safe_active`;这三个标志是其上的明确、经审计的选择加入。示例(拥有实验室箱子 + 本地模型):```
netlogic YOUR_LAB_HOST --full --ai --ai-agent --agent-depth \
--allow-crash-probes --allow-exploit-requests \
--ai-provider ollama --ai-model gemma4:31b-cloud \
--ai-base-url http://localhost:11434/v1 --ai-key ollama
netlogic example.com --ssh-user admin --ssh-key ~/.ssh/id_rsa
netlogic example.com --ssh-user admin --ssh-pass SECRET
netlogic example.com --ssh-user admin --ssh-key ~/.ssh/id_rsa --ssh-port 2222
### 基准测试```
# Fusion pipeline benchmark against recorded cassettes (oracle mode — perfect AI upper bound)
netlogic --benchmark
# With real AI model
netlogic --benchmark --benchmark-ai
# Export report
netlogic --benchmark --benchmark-export report.md
# Verbose per-subject output
netlogic --benchmark --benchmark-verbose
netlogic example.com --report terminal # terminal output (default) netlogic example.com --report json # JSON file netlogic example.com --report html # HTML report netlogic example.com --report all # terminal + JSON + HTML
netlogic example.com --out ./reports
netlogic example.com --min-cvss 7.0
netlogic example.com --no-color
### NVD 缓存管理```
netlogic --cache-stats
netlogic example.com --nvd-key YOUR_NVD_KEY
netlogic --version # Show version and exit netlogic --gui # Start web dashboard
---
## 融合流程
融合流程是一个 **传感器 → 门控 → AI 裁决 → 综合** 漏斗,它用精确的门控取代了单一的 AI 调用。它位于 `src/fusion/` 目录下(共 12 个文件)。
### 信号模式 (`src/fusion/signals.py`)
承载证据的数据契约。每个传感器发出 `Signal` 对象:
- `source`: `probe`/`banner`/`nuclei`/`wappalyzer`/`nvd`/`osv`/`tls`/`dns`
- `kind`: `vuln`/`tech`/`exposure`/`misconfig`/`service`
- `claim`: 规范化主题(例如 `"CVE-2021-44228"`、`"nginx"`)
- `host`、`port`、`service`、`evidence`(最多 600 个字符)
- `confidence`(0..1)、`reliability`(`high`/`medium`/`low`)
- `kev`、`epss`(0..1)、`cvss`(0..10)、`exploit_available`、`version_matched`、`probe_confirmed`
- `exposure` 字典(可达性、WAF、观测点)
- `observed_data`(发送给 AI 的原始字节——而非传感器名称或严重性,以防止标签偏差)
- `ai_view()` 剥离传感器元数据,仅返回观察到的实事
### 门控 (`src/fusion/gate.py`)
确定性协议——给定 `list[Signal]`,按主题分组并返回 `list[Verdict]`:
| 条件 | 裁决 |
|---|---|
| 已列入 KEV 或探针确认或严重+利用/高 EPSS | **已确认**(固定——不可丢弃) |
| ≥2 个独立来源一致,且 ≥1 个高可靠性 | **已确认**(除非全部版本匹配 → 灰色) |
| 单个低可靠性、低/中影响、无佐证 | **已丢弃** |
| 其他所有情况 | **灰色**(消耗一个 AI token) |
### AI 裁决 (`src/fusion/adjudicator.py`)
仅处理灰色区域。安全约束在代码中强制执行(而非提示):
- 高/严重灰色项目绝不能丢弃——最坏情况下降级为 `potential`
- 仅版本匹配限制为 `potential`(发行版可能在不增加版本号的情况下进行向后移植)
- AI 还会从完整的主机上下文中发现新发现
- 软故障:AI 故障时灰色区域保持为 `potential` —— 无静默数据丢失
### 综合 (`src/fusion/synthesis.py`)
`build_attack_graph(verdicts)` → 从 CONFIRMED 发现中生成确定性的可达性图。
`full_synthesize(...)` → 6 部分 AI 报告:
1. 执行摘要
2. 关键发现(表格)
3. 攻击链(基于图,LLM 描述真实边)
4. 已知 CVE 之外
5. 误报与噪音
6. 修复建议
### 传感器
| 传感器 | 文件 | 输出内容 |
|---|---|---|
| 引擎桥接 | `engine_bridge.py` | 将扫描产物转换为来自 NVD、探针、栈、Nuclei、验证器的 Signal |
| Wappalyzer | `sensors/wappalyzer.py` | 零依赖的 Wappalyzer 兼容 HTTP 响应指纹识别 |
| Nuclei | `sensors/nuclei.py` | 针对响应运行 YAML 模板(Nuclei 语法子集) |
| Cassette | `cassette.py` | 从 HTTP 磁带记录/重放(离线基准数据) |
### 跨主机 (`src/fusion/cross_host.py`)
裁决后的跨主机按共享服务+版本分组,用于综合中的多跳攻击链叙述。
### 流程流水线```
Engine artifacts / Cassette data
↓
engine_bridge.py / cassette.py → Signal list
↓
gate.py::adjudicate() → Verdict list (confirmed/discarded/gray)
↓
adjudicator.py::run_adjudication() → AI on gray band only
↓
synthesis.py::full_synthesize() → 6-section report + attack graph
位于 src/reasoning/(约58个文件)。多阶段、安全门控的观察→推理→行动循环。通过 --reason 启用。
src/reasoning/director.py — ReconDirector.run())StrategyManager 选择角色 → Scheduler 选取行动 → SensorStep 执行 → EvidenceGraph 整合观察 → ConfidenceEngine 更新信念Proposal 信封 → AICoordinator 标准化/排序/验证 → 接受的提案播种状态 → Compiler → ExecutionPlanner → ExecutionKernel 运行探测 → InferenceEngine 解析CrossHostGraph 进行跨主机发现,生成子 HostReasoner 实例GoalPlanner 生成调查计划src/reasoning/state.py)src/reasoning/ai/)流水线:生成 → 标准化 → 排序 → (元推理器剪枝) → 验证 → 存储
位于 src/deep/(7个文件)。与 --deep-probe 一起使用。用于上下文隔离探测执行的每个服务代理架构。
DeepCoordinator.run() 流程:
sensor_director 的 _build_sensor_plan)ScoutAgent 进行被动侦察ProbeAgent 实例(每个具有隔离的CVE/技术上下文)位于 src/verifier/(3个文件)。AI驱动的CVE确认,带有针对性探测。
阶段2 重新验证(reverify_with_context)提供完整主机上下文以完善失败的测试。
位于 src/directors/(4个文件)。LLM驱动的扫描参数选择。
位于 src/orchestrator.py。由逗号分隔的目标触发。对每个主机运行 run_scan(),聚合结果,从组合的融合判定中构建跨主机上下文。跨主机组检测跨主机的共享服务/版本,用于多跳攻击链叙述。
src/nvd_lookup.py)--nvd-key)src/epss.py): FIRST.org API,每批100个CVE ID,24小时磁盘缓存位于 ~/.netlogic/epss_cache.json,软故障到0.0src/external/nuclei_runner.py 封装了Nuclei二进制文件(MIT许可证)。可选 — 当找不到二进制文件时优雅降级。结果作为类型信号馈入融合流水线(去除严重性标签以防止LLM偏差)。```
scoop install nuclei # Windows brew install nuclei # macOS go install github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest # Linux
---
## 融合基准测试
`src/fusion/benchmark.py` — 离线测量,与标记的 HTTP 磁带进行对比(`benchmark/*.json` 和 `src/fusion/data/`)。指标:
| 指标 | 门限阈值 |
|---|---|
| FP 降低 | ≥ 80% |
| 关键召回率 | = 100% |
两种模式:
- **Oracle**(`--benchmark`):完美 AI 上限 —— 仅测量确定性机制
- **真实模型**(`--benchmark --benchmark-ai`):使用配置的 LLM 进行测量
---
## 架构```
netlogic/
├── netlogic.py ← Local launcher (`--gui`, optional CLI helpers)
│
├── src/ ← Scan engine (used by the web API)
│ ├── scanner.py ← TCP scanner, 22 service probes, banner grabbing
│ ├── engine.py ← Orchestrator: SensorStep pipeline, all scan modules + fusion
│ ├── orchestrator.py ← Multi-host: per-host scan → cross-host context
│ ├── ai_analyst.py ← LLM integration (9 providers, stdlib-only transport)
│ ├── cve_correlator.py ← CVE matching: NVD
│ ├── nvd_lookup.py ← NVD API v2.0 client, disk cache, CISA KEV
│ ├── epss.py ← EPSS enrichment (FIRST.org, 24h cache)
│ ├── service_prober.py ← Unauthenticated service access, default creds, admin paths
│ ├── vuln_prober.py ← CVE-specific safe active probes
│ ├── osint.py ← DoH, CT logs, ASN lookup
│ ├── tls_analyzer.py ← SSL/TLS deep analysis
│ ├── header_audit.py ← HTTP security header audit
│ ├── stack_fingerprint.py ← CMS, framework, cloud, CDN, WAF detector
│ ├── web_fingerprint.py ← Favicon mmh3, JS secrets, version files, exposed paths, lander detection
│ ├── dns_security.py ← SPF, DKIM, DMARC, DNSSEC, zone transfer
│ ├── takeover.py ← Subdomain takeover (25 provider fingerprints)
│ ├── authenticated.py ← SSH subprocess: dpkg/rpm/apk parsing, 60+ product mappings
│ ├── topology.py ← PTR, IPv6, traceroute, ASN/org/country
│ ├── reachability_prober.py ← Lateral movement matrix from subnet adjacency
│ ├── network_prober.py ← /24 subnet sweep: live-host → full port scan
│ ├── service_enum.py ← Protocol attribute extraction (SSH KEX, SMBv1, RDP NLA, SNMP)
│ ├── ssl_utils.py ← Configurable SSL context management, TLS probe
│ ├── scan_diff.py ← Change-over-time: diffs against prior JSON report
│ ├── json_bridge.py ← Streaming JSON events for agent / REST API
│ ├── reporter.py ← Terminal, JSON, HTML output renderers
│ │
│ ├── fusion/ ← Precision funnel (12 files)
│ │ ├── signals.py ← Signal schema
│ │ ├── gate.py ← Deterministic agreement
│ │ ├── adjudicator.py ← AI adjudication (gray band only)
│ │ ├── synthesis.py ← Attack graph + 6-section report
│ │ ├── ai.py ← CompleteFn/StreamCompleteFn adapter
│ │ ├── engine_bridge.py ← Artifacts → Signals → verdicts
│ │ ├── benchmark.py ← Offline benchmark (oracle + real model)
│ │ ├── cassette.py ← HTTP cassette record/replay
│ │ ├── corpus.py ← Cassette→case conversion + CLI
│ │ ├── cross_host.py ← Cross-host verdict correlation
│ │ ├── sensors/nuclei.py ← Nuclei YAML → Signal conversion
│ │ └── sensors/wappalyzer.py← Wappalyzer fingerprint → Signal
│ │
│ ├── directors/ ← AI sensor directors (4 files)
│ │ ├── sensor_director.py ← LLM selects which sensors to enable
│ │ ├── reprobe.py ← LLM designs re-probe plans
│ │ ├── nuclei_selector.py ← LLM selects Nuclei template tags
│ │ └── subnet_director.py ← LLM directs subnet probing
│ │
│ ├── verifier/ ← AI CVE verification (3 files)
│ │ ├── engine.py ← Verifier orchestration
│ │ ├── planner.py ← Built-in + AI-generated probe plans
│ │ └── runner.py ← Raw TCP/TLS probe execution
│ │
│ ├── deep/ ← Deep probe agents (7 files)
│ │ ├── coordinator.py ← Full deep pipeline orchestrator
│ │ ├── scout_agent.py ← Passive recon agent
│ │ ├── probe_agent.py ← Per-service probe agent
│ │ ├── chain.py ← Exploit chain planning + PoC generation
│ │ ├── sandbox.py ← Restricted PoC execution
│ │ ├── base_agent.py ← Abstract base
│ │ └── models.py ← Mission/AgentReport data models
│ │
│ ├── reasoning/ ← Adaptive reasoning engine (~58 files)
│ │ ├── director.py ← ReconDirector (main loop)
│ │ ├── state.py ← WorldModel/InvestigationState/ExecutionState
│ │ ├── hypothesis.py ← Hypothesis engine (competing candidates)
│ │ ├── evidence_graph.py ← Temporal entity graph (content-addressed obs)
│ │ ├── confidence.py ← Noisy-OR belief computation
│ │ ├── provenance.py ← Observation→Inference→Hypothesis edges
│ │ ├── scheduler.py ← Information-gain action selection
│ │ ├── strategy.py ← Meta-reasoning: personas, explore/exploit
│ │ ├── strategies.py ← Concrete strategy implementations
│ │ ├── action_gate.py ← Risk-tiered probe authorisation
│ │ ├── change_detection.py ← Phase 7: observation-level diff
│ │ ├── active_validation.py ← Phase 8b: SAFE_ACTIVE probes
│ │ ├── cross_host.py ← Cross-host world modeling
│ │ ├── objective.py ← Objective DAG management
│ │ ├── intent.py ← Intent model + EvidenceType enum (29 types)
│ │ ├── candidate.py ← Action candidate with lazy factory
│ │ ├── actions.py ← Action model with RiskTier + Predicate
│ │ ├── compiler.py ← Intent → InvestigationGraph
│ │ ├── execution_planner.py ← InvestigationGraph → ProbePlanGraph
│ │ ├── execution_kernel.py ← Probe execution with validators
│ │ ├── probe_executor.py ← Read-only probe backends
│ │ ├── primitive_registry.py← Probe primitive catalogue
│ │ ├── generators.py ← Deterministic objective/hypothesis population
│ │ ├── playbooks.py ← YAML playbook system
│ │ ├── planning_pass.py ← GoalPlanner integration
│ │ ├── budget.py ← Probe budget management
│ │ ├── inference.py ← Deterministic rule-based inference
│ │ ├── novel_inference.py ← Novel-vuln hypothesis rules
│ │ ├── investigation_planner.py ← Goal-directed investigation planning
│ │ ├── investigation_memory.py ← Strategy attempt memory
│ │ ├── observation_translator.py ← Raw data → structured observations
│ │ ├── observation.py ← Immutable, content-addressed observation
│ │ ├── reflect.py ← PlannerFeedback generation
│ │ ├── reasoning_validator.py ← Continuous integrity audit
│ │ ├── builder.py ← State population from artifacts
│ │ ├── trace.py ← Execution tracing
│ │ ├── explanation.py ← Explanation records
│ │ ├── ai/ ← AI cognitive layer (subsystem)
│ │ ├── packs/ ← Technology pack calibration
│ │ ├── playbooks/ ← YAML playbook templates
│ │ └── rules/ ← JSON inference rules
│ │
│ └── external/nuclei_runner.py ← Nuclei binary wrapper
│
├── api/ ← FastAPI controller
│ ├── main.py ← App factory, lifespan, middleware stack
│ ├── cli.py ← Typer -> netlogic.py bridge
│ ├── db.py ← PostgreSQL connection + migration runner
│ ├── crypto.py ← Fernet seal/unseal (AES-128-CBC + HMAC-SHA256)
│ ├── auth/
│ │ ├── api_keys.py ← Dual-store (memory/PG), SHA-256 hashed
│ │ ├── jwt_handler.py ← Stdlib-only HS256 JWT
│ │ ├── oidc.py ← Clerk/IdP OIDC (RS256 + JWKS)
│ │ ├── license.py ← LicenseManager (stub → real payment API)
│ │ ├── rate_limit.py ← Sliding-window, IP banning
│ │ ├── provisioning.py ← Clerk auto-provisioning
│ │ └── dependencies.py ← require_org FastAPI dependency
│ ├── agents/
│ │ ├── registry.py ← Agent lifecycle (concurrency-aware, JSON persistence)
│ │ └── local_agent.py ← Built-in in-process agent
│ ├── jobs/
│ │ ├── manager.py ← ScanJob lifecycle, capped event deque (10k), SSE, Postgres
│ │ └── executor.py ← Dispatch (capability/selector, least-loaded, reclaimer)
│ ├── middleware/audit.py ← X-Request-ID + structured audit + SIEM shipping
│ ├── models/
│ │ ├── scan_request.py ← Pydantic ScanRequest (ipaddress validation)
│ │ └── agent.py ← AgentRegistration constraints
│ ├── routes/
│ │ ├── auth.py ← /v1/auth/*
│ │ ├── jobs.py ← /v1/jobs/*
│ │ ├── agents.py ← /v1/agents/*
│ │ ├── health.py ← /health + /v1/health
│ │ ├── license.py ← /v1/license/*
│ │ └── settings.py ← /v1/settings/*
│ └── storage/
│ ├── json_store.py ← 10 MB cap, 500 file cap, atomic writes
│ ├── pg_store.py ← Postgres JSONB upsert
│ └── reasoning_store.py ← Dual-store for reasoning state
│
├── dashboard/ ← React SPA (Vite + TypeScript + Tailwind + Clerk)
│ └── src/
│ └── pages/ ← Dashboard, NewScan, ScanDetail, Agents, Targets,
│ TargetTimeline, Settings, License, Login, SignUp, Legal
│
├── docs/ ← Design documentation
│ ├── DEPLOY_SAAS.md, saas-auth.md
│ ├── REASONING_ENGINE_DESIGN.md
│ ├── LEGAL_COMPLIANCE.md
│ ├── ENTERPRISE_READINESS.md
│ └── DESIGN_PARTNER_PACK.md
│
├── db/migrations/ ← PostgreSQL schema migrations
└── benchmark/ ← HTTP cassette recordings for fusion benchmark
所有路由均位于 /v1/ 前缀下。认证方式:
POST /v1/auth/token → HS256 JWT(默认 1 小时过期)require_org 依赖项通过 JWKS 验证POST /v1/auth/token Exchange API key for JWT [10/min/IP] POST /v1/auth/keys Create API key (X-Admin-Key) [admin] GET /v1/auth/keys List keys (masked) [admin] DELETE /v1/auth/keys Revoke key (body, not URL) [admin]
### 职位```
POST /v1/jobs Create scan job [30/min/org]
GET /v1/jobs List recent jobs
GET /v1/jobs/history/{target} Scan history for target
GET /v1/jobs/{id} Job detail
GET /v1/jobs/{id}/stream SSE event stream [60/min/org]
GET /v1/jobs/{id}/export Export (format=json|md|raw)
POST /v1/jobs/{id}/explore-beyond AI deep-dive on finding
POST /v1/jobs/{id}/cancel Cancel job
DELETE /v1/jobs/{id} Remove job
POST /v1/agents/register Register agent [5/hr/IP] POST /v1/agents/{id}/heartbeat Keep-alive [3/min] GET /v1/agents/{id}/tasks Poll pending jobs POST /v1/agents/{id}/tasks/{job_id}/events Submit events [60/min, 500/batch] POST /v1/agents/{id}/tasks/{job_id}/complete Mark done/failed GET /v1/agents List agents (org-scoped) GET /v1/agents/{id} Agent detail DELETE /v1/agents/{id} Deregister POST /v1/agents/{id}/activate Enable agent POST /v1/agents/{id}/deactivate Disable agent
### 许可证 / 设置```
GET /v1/license License status
POST /v1/license/activate Activate key [3/hr/IP]
GET /v1/settings/ai Get org AI config (key masked)
POST /v1/settings/ai Update org AI config (encrypted)
POST /v1/settings/ai/test Test AI connection
GET /health Service status + uptime GET /docs OpenAPI docs GET /redoc ReDoc docs
---
## 环境变量
### 控制器
| 变量 | 默认值 | 描述 |
|---|---|---|
| `NETLOGIC_ENV` | _(unset)_ | `production`/`prod` = 启动时密钥验证 |
| `NETLOGIC_JWT_SECRET` | `changeme-in-production` | HS256 签名密钥,≥32 个字符 |
| `NETLOGIC_JWT_EXPIRY` | `3600` | JWT 生命周期(秒) |
| `NETLOGIC_ADMIN_KEY` | `admin-changeme` | 管理员凭证,生产环境≥32 个字符 |
| `NETLOGIC_API_KEYS` | _(empty)_ | 种子密钥:`key1:org1,key2:org2,...` |
| `NETLOGIC_CORS_ORIGINS` | _(empty)_ | 允许的来源(空则禁用 CORS) |
| `NETLOGIC_PORT` | `8000` | 绑定端口 |
| `NETLOGIC_HOST` | `0.0.0.0` | 绑定地址 |
| `NETLOGIC_NO_BROWSER` | _(unset)_ | `1` 禁用自动打开 |
| `NETLOGIC_OIDC_ISSUER` | _(unset)_ | Clerk 前端 API 地址 → OIDC 登录 |
| `NETLOGIC_OIDC_AUDIENCE` | _(unset)_ | OIDC 受众 |
| `NETLOGIC_OIDC_DEFAULT_ORG` | _(unset)_ | OIDC 用户的后备组织 ID |
| `NETLOGIC_DATABASE_URL` | _(unset)_ | PostgreSQL 连接字符串 |
| `NETLOGIC_SECRETS_KEY` | _(unset)_ | Fernet 密钥用于静态凭据加密 |
| `NETLOGIC_AGENT_TOKEN_MAX_AGE` | `604800` | Agent 令牌生命周期(7天) |
| `NETLOGIC_AGENT_PENDING_CAP` | `50` | 每个 Agent 的最大排队任务数 |
| `NETLOGIC_MAX_AGENTS_PER_ORG` | `100` | 最大注册 Agent 数 |
| `NETLOGIC_AI_PROVIDER` | `openrouter` | 默认 AI 提供商 |
| `NETLOGIC_AI_API_KEY` | _(empty)_ | 默认 AI 密钥 |
| `NETLOGIC_AI_MODEL` | provider default | 默认模型 |
| `NETLOGIC_AI_BASE_URL` | provider default | 自定义基础 URL |
| `NETLOGIC_NVD_KEY` | _(empty)_ | NVD API 密钥 |
| `NETLOGIC_VALID_LICENSES` | _(empty)_ | 开发/测试许可证覆盖 |
| `NETLOGIC_LICENSE_KEY` | _(empty)_ | 实例许可证密钥 |
| `NETLOGIC_SCANS_DIR` | _(default)_ | 扫描存储目录 |
| `NETLOGIC_SIEM_ENDPOINT` | _(empty)_ | 审计日志传输地址 |
| `NETLOGIC_WAPPALYZER_DATA` | _(built-in)_ | Wappalyzer 指纹路径 |
### Agent
| 变量 | 默认值 | 描述 |
|---|---|---|
| `NETLOGIC_CONTROLLER` | `http://localhost:8000` | 控制器基础 URL |
| `NETLOGIC_API_KEY` | _(unset)_ | 注册用 API 密钥 |
---
## 安全架构
### 中间件栈(应用顺序)
1. **AuditMiddleware** — `X-Request-ID` 关联、结构化 JSON 审计日志、SIEM 传输
2. **RequestSizeLimitMiddleware** — 10 MB 请求体限制(DoS 防护)
3. **LicenseMiddleware** — 未授权时阻止所有 `/v1/` 路由(返回 402)
4. **SecurityHeadersMiddleware** — HSTS(1年)、CSP(区分 HTML 与 API)、X-Frame-Options、X-Content-Type-Options、Permissions-Policy、Referrer-Policy
5. **OriginCheckMiddleware** — POST/PUT/DELETE Origin 验证(CSRF 纵深防御)
6. **CORSMiddleware** — 限制性:无通配符,仅限特定来源
### 身份验证
- **API 密钥**:静态存储时 SHA-256 哈希;仅在 `create()` 和 `verify()` 时请求体中的明文
- **JWT**:使用标准库 HS256(`hashlib`+`hmac`+`base64`),验证前固定 `alg` 字段(防止 alg=none),开发时使用临时随机回退
- **OIDC**:Clerk/Auth0/WorkOS — RS256 + JWKS,首次登录时自动配置用户和组织
- **Agent 令牌**:注册表中 SHA-256 哈希,常量时间比较,7 天过期
### 速率限制
内存滑动窗口。按端点、按范围(IP、org_id、agent_id)。10 分钟内 5 次令牌交换失败后 IP 封禁(封禁 1 小时)。
### 数据保护
- LLM API 密钥:静态时 Fernet 加密(AES-128-CBC + HMAC-SHA256)。生产环境安全失败:需要 `NETLOGIC_SECRETS_KEY`
- 多租户:所有数据限定在 `org_id` 内;跨组织查询返回 404(而非 403)
- 路径遍历:所有存储路径经过验证,拒绝分隔符和 `..`
---
## CI / 测试```bash
pip install -r requirements-dev.txt
python -m pytest
CI 流水线(.github/workflows/ci.yml)—— 5 个作业:
pip-auditnpm ci + npm run buildNetLogic 仅用于授权的安全评估、渗透测试和网络管理。 未经明确书面许可扫描或探测主机在大多数司法管辖区属于违法行为。 作者对未经授权的使用不承担任何责任。
MIT © 2026 Dmitry Flynn — 参见 LICENSE.txt
| Reachability Prober | 入侵后横向移动矩阵,基于子网邻接 |
| Network Prober | 主动子网扫描(/24 私有邻居),两阶段发现(活跃扫描 → 全端口扫描) |
| Scan Diff | 随时间变化:针对每个目标,将当前扫描与最近一次 JSON 报告进行差异比较 |
| License Management | 商业许可证系统,密钥激活(Stripe/Paddle/Lemon Squeezy 桩模块) |
| Per-Org AI Config | 每个组织通过 Fernet 存储其自己的 LLM 凭据,静态加密 |
| OIDC / Clerk | 通过 Clerk 发布的会话 JWT 进行人类登录,使用公共 JWKS 验证,并自动配置 |
| PostgreSQL | 完整多租户持久化,自动应用迁移(扫描任务、组织设置、推理状态、审计) |
| Fusion Benchmark | 离线基准测试,基于录制的 HTTP 磁带;精确率/召回率/关键召回率/误报减少指标 |
| 格式 | 示例 | 模式 |
|---|
| 主机名 | example.com | 单主机扫描 |
| IPv4 | 10.0.0.5 | 单主机扫描 |
| CIDR | 192.168.1.0/24 | CIDR 段扫描(仅扫描器,无融合) |
| 逗号分隔 | target1,target2 | 多主机编排(跨主机上下文) |
ReasoningValidator 完整性审计 → ProvenanceBuilder 记录边 → 状态持久化| 层 | 类 | 跟踪内容 |
|---|
| WorldModel | WorldModel | EvidenceGraph, 观察, 信念, 主机, 技术, 可达性 |
| InvestigationState | InvestigationState | 目标(DAG), 假设, 矛盾, 死胡同, 当前角色 |
| ExecutionState | ExecutionState | 预算, probe_history, 来源, investigation_plans, AI 记录 |
| LearnedPatterns | LearnedPatterns | 跨扫描启发式 + 剧本 |
| 组件 | 文件 | 描述 |
|---|
| EvidenceGraph | evidence_graph.py | 去重的时间实体图(通过 SHA-256 内容寻址的观察) |
| Hypothesis engine | hypothesis.py | 具有可能性、熵、信息增益、后验分辨率的竞争候选者 |
| ConfidenceEngine | confidence.py | 对不同来源的噪声或运算;仅版本时上限为 0.60;KEV/探测固定为 0.97 |
| ProvenanceBuilder | provenance.py | 观察→推理→假设边,内容哈希寻址 |
| Scheduler | scheduler.py | 信息增益行动选择,带有探索储备 (10%) |
| StrategyManager | strategy.py | 元推理:角色选择、探索/利用模式、平台检测 |
| ActionGate | action_gate.py | 纵深防御:风险等级(READ_ONLY < SAFE_ACTIVE < INTRUSIVE < EXPLOIT),核心最高为 SAFE_ACTIVE |
| InferenceEngine | inference.py | 来自 rules/*.json 的确定性规则,从不写入置信度 |
| NovelInferenceEngine | novel_inference.py | 用于缓存中毒、请求走私、认证绕过等的规则 |
| ExecutionKernel | execution_kernel.py | 验证 + 执行 + 追踪探测(范围 → 只读 → 预算 → 去重 → 深度) |
| Playbook system | playbooks.py | 带有触发条件和意图模板的 YAML 剧本 |
| Change detection | change_detection.py | 阶段7:对不可变观察(而非状态)进行差异比较,生成 DeltaEvents 的 ScanDelta |
| Active validation | active_validation.py | 阶段8b:通过 ActionGate 的非破坏性 SAFE_ACTIVE 探测 |
| 文件 | 组件 |
|---|
coordinator.py | AICoordinator — 分阶段流水线编排 |
proposals.py | 带类型 Proposal 信封,包含特定类型的载荷、来源、经济性 |
normalize.py | ProposalNormalizer — 总体验证门 |
rank.py | ProposalRanker — 分数 = raw_score × prob_correct × reputation_weight |
meta_reasoner.py | 确定性剪枝(循环检测、不确定性降低) |
verifier.py | 4阶段:语法 → 语义 → 证据 → 安全 |
store.py | ProposalStore — 生命周期分类账 |
transcript.py | InvestigationTranscript — 因果链记录 |
evaluation.py | 基于 Cassette 的确定性评估框架 |
reputation.py | AgentReputation — 追踪每个代理的接受/拒绝率 |
agents/hypothesis_generator.py | C1 — 提出竞争性解释 + 新型漏洞假设 |
agents/counterfactual.py | C11 — 提出反驳目标 |
agents/investigation_designer.py | C2 — 设计证据收集计划 |
| 组件 | 文件 | 描述 |
|---|
DeepCoordinator | coordinator.py | 编排完整深度流水线:AI传感器计划 → ScoutAgent → 每个服务的 ProbeAgent → 服务枚举 → Nuclei → 验证器 → 接管 → 子网探测 → 拓扑 → 认证 → 差异 → 可达性 |
ScoutAgent | scout_agent.py | 被动侦察:TLS、头部、栈、DNS、OSINT |
ProbeAgent | probe_agent.py | 使用隔离的CVE/技术上下文针对一个服务 — 运行探测 + 验证器 |
ExploitChain | chain.py | 在融合确认的判定上进行BFS攻击路径规划,PoC生成 |
Sandbox | sandbox.py | 用于PoC验证的受限子进程(临时目录、超时、清理) |
Mission / AgentReport | models.py | 代理指令和结果的数据模型 |
| 组件 | 文件 | 描述 |
|---|
run_verifier() | engine.py | 编排:生成计划 → 执行 → 构建探测确认的信号 |
generate_plans_for_cves() | planner.py | 每个CVE(CVSS ≥ 7.0):检查约20个内置计划 → AI生成原始HTTP计划(方法、路径、头部、体、预期状态/体) |
run_test() | runner.py | 原始TCP/TLS socket执行,手动HTTP/1.0解析,预期体模式匹配 |
| 指导器 | 文件 | 决定内容 |
|---|
SensorDirector | sensor_director.py | 根据开放端口 + 技术栈 + CVE,决定启用/禁用哪些传感器以及优先级 |
ReprobeDirector | reprobe.py | 判断潜在发现是否可以通过针对性HTTP探测解决 |
NucleiSelector | nuclei_selector.py | 包含/排除哪些Nuclei模板标签(减少不相关运行) |
SubnetDirector | subnet_director.py | 探测哪些相邻主机、哪些端口、何种深度(跳过/快速/标准/深入) |