nandrzej/vlnr

GitHub: nandrzej/vlnr

基于 LLM 的自动化安全 Agent,面向 Python PyPI 供应链实现从漏洞发现、扫描、分流到 PoC 生成与沙盒验证的完整闭环。

Stars: 37 | Forks: 0

**vlnr — 针对 Python 供应链的自动化 Agent 漏洞利用流水线** `vlnr` 是一款经过 LLM 增强的自动化 Agent 安全工具,它只需极少的人工干预, 即可对 Python PyPI 包运行完整的 **发现 → 扫描 → 分流 → 利用 → 验证** 周期。 LLM Agent 负责驱动整个循环,决定要扫描哪些包, 何时生成概念验证漏洞利用,以及何时在隔离容器中验证它们—— 所有这些都在预算感知和可恢复的状态下完成。 ## vlnr 的与众不同之处 传统的静态分析工具(Bandit, Semgrep)仅停留在标记潜在发现的层面。`vlnr` 闭环了整个流程: - **Agent 而非脚本** — 基于LLM驱动的 `Plan → Act → Observe` 循环,根据积累的发现和剩余的 token 预算, 自主决定下一步操作(扫描、生成漏洞利用、验证、停止) - **确认可利用性** — 对于高可信度的发现,Agent 会生成一个功能性的 PoC,并在沙盒化的 Docker 容器中执行, 以确认漏洞是可触达的,而不仅仅是被标记 - **专注于供应链** — 使用反向依赖中心性、OSV 覆盖盲区和语义意图评分, 针对流行但缺乏审计的 PyPI 包——特别是对更广泛的生态系统最危险的那类包 - **减少约 25% 的误报** — 分层 LLM 分流机制在升级之前,会在完整的文件上下文中评估可利用性, 从而过滤掉 Bandit/Semgrep 的噪音 ## 架构 ``` PyPI Ecosystem │ ▼ ┌──────────────────────────────┐ │ Candidate Finder │ Semantic scoring: download centrality, │ poc-find-candidates │ OSV coverage gaps, LLM intent classification. │ vlnr/cli.py + scorer.py │ Targets: CLI tools, ML/AI libs, devops infra. └────────────┬─────────────────┘ │ top_candidates.json ▼ ┌──────────────────────────────┐ │ Agentic Loop │ LLM agent drives the Think–Act–Observe cycle. │ vlnr agent │ Persists state to JSON; resumable across runs. │ vlnr/agent.py │ Budget-aware: tracks token cost per action. └──┬──────────┬──────────┬─────┘ │ │ │ ▼ ▼ ▼ Scan Generate Validate Package PoC PoC │ │ │ vulncli.py vulnreasoner vulnvalidate vulnast.py .py .py (Docker) │ ▼ taint slices triage.py (Tiered LLM) │ ▼ TriageInfo + plausibility score vex.py → OpenVEX output ``` ### Agent 循环 Agent 运行一个 `while iterations < max_iterations and budget_remaining > 0` 的循环。在每一步中,它会: 1. **观察** 当前状态(已扫描的包、发现结果、切片、预算) 2. **决策** 下一步操作,通过带有结构化工具清单的 LLM 调用实现 3. **分发** 到相应的流水线函数 4. **更新** 状态并将其保存到磁盘(可通过 `--state-path` 恢复) Agent 的策略: - 对于任何分流可信度 ≥ 0.7 的切片,自动触发 `generate_poc` - 紧接着执行 `validate_poc`,然后再转到下一个包 - 当没有进一步有效的操作或预算耗尽时,调用 `stop` ## 分层 LLM 策略 所有的模型路由都在 `llm_config.yaml` 中配置——没有任何提供商被硬编码。 | 层级 | 角色 | 目标模型 | 备注 | |------|------|--------------|-------| | **Tier 1** | PoC 生成,整仓推理 | Qwen 3.5 397B, Gemini 3 Flash | 1M token 上下文;98–99% 的 PoC 成功率 | | **Tier 2** | 上下文分流,评分优化 | Gemma 4 31B, GLM-5.1 | 通过预过滤减少 Tier 1 的调用 | | **Tier 3** | 元数据分类,意图评分 | Qwen 3.5 4B, Gemma 4 2B | 高吞吐量,低成本 | **漏洞优先级评分:** ``` P = (Ws × Cs + Wl × Cl) × Er ``` `Cs` = 静态工具置信度 · `Cl` = LLM 语义置信度 (log-probs) · `Er` = 可利用性推理得分 · 权重:`Ws=0.4`,`Wl=0.6` ## CWE 覆盖范围 | CWE | Sink | 检测方法 | |-----|------|-----------------| | CWE-78 | `subprocess.run(shell=True)` | AST 污点分析 + 旁路扫描;shell 转义 PoC 生成 | | CWE-22 | `open(file_path)` | `os.path.join` 标准化旁路检测 | | CWE-502 | `pickle.loads()` | `__reduce__` payload 构建 | | CWE-94 | `eval()`, `exec()` | 通过 `getattr` 进行内建函数反射 | | CWE-918 | `urllib`, `httpx`, `aiohttp` | OpenGrep SSRF 规则 (`vlnr/rules/ssrf.yaml`) | ## 开始使用 ### 前置条件 - Python 3.14+ - [`uv`](https://github.com/astral-sh/uv) 包管理器 - Docker(用于沙盒 PoC 验证) - 兼容 OpenAI 的 LLM API 密钥 ### 安装说明 ``` git clone https://github.com/nandrzej/vlnr cd vlnr uv sync ``` ### 配置 ``` # .env LLM_API_KEY= GITHUB_TOKEN= ``` `llm_config.yaml` 控制每个层级的模型路由: ``` tier1: model: openai/qwen-3.5-397b-instruct temperature: 0.1 reasoning_effort: high tier2: model: openai/gemma-4-31b-it temperature: 0.0 tier3: model: openai/qwen-3.5-4b-instruct temperature: 0.0 ``` ## 运行说明 ### 阶段 1 — 候选发现 ``` # 仅 Heuristic scoring uv run poc-find-candidates --include-cli --include-ml --limit 500 --out top_candidates.json # 使用 LLM-augmented intent detection(发现 Heuristic 遗漏的 crypto/auth/network libs) uv run poc-find-candidates --packages requests,flask --llm-discovery ``` ### 阶段 2 — 深度扫描 + 分流(流水线模式) ``` uv run poc-scan-vulnerabilities top_candidates.json --llm-triage --llm-poc ``` ### 自主 Agent 模式 ``` # 启动新 agent session uv run vlnr agent --package target-lib --budget 10.0 # 恢复之前的 session uv run vlnr agent --state-path session.json ``` ## 示例:SSRF 发现 ``` Finding: CWE-918 Server-Side Request Forgery Signal: User-controlled URL from Web API → aiohttp socket call Triage: plausibility=0.94 — sink reachable via unvalidated input PoC: Agent generates exploit targeting internal metadata endpoint Validation: Confirms successful exfiltration in Docker sandbox Output: OpenVEX record (status: affected) + PoC script ``` ## 输出格式 - **`top_candidates.json`** — 排名后的候选包,包含 `candidate_score`、OSV ID、 下载中心性、审计历史和意图分类 - **单包发现** — 结构化 JSON:`plausibility`、`suggested_cwe`、 污点追踪、source/sink 映射、工具命中记录 (Bandit, Ruff, Semgrep) - **OpenVEX 记录** — 机器可读的可利用性状态 (`affected | not_affected | fixed | under_investigation`) - **PoC 脚本** — 带有沙盒验证结果的可执行漏洞利用 - **`session.json`** — 序列化的 `AgentState`,用于恢复会话 ## 质量标准 - **严格类型检查** — 完整的 MyPy `--strict` 覆盖 - **可复现的测试** — 所有 LLM 和 HTTP 交互均使用 `vcrpy` 卡带; CI 中不进行实时调用 - **提供商抽象** — 所有模型名称和端点都位于 `llm_config.yaml` 中, 绝不硬编码 - **容器隔离** — PoC 执行在瞬时容器中使用 Docker SDK ## 许可证 MIT — 详见 [LICENSE](LICENSE)。
标签:Bandit, DevSecOps, DLL 劫持, Docker, Maven, PoC生成, PyPI安全, Python, Python供应链, Semgrep, WordPress安全扫描, 上游代理, 人工智能安全, 合规性, 大语言模型, 安全防御评估, 提示词注入, 攻击模拟, 无后门, 漏洞验证, 网络安全, 自动化payload嵌入, 自动化渗透测试, 误报过滤, 请求拦截, 软件供应链安全, 远程方法调用, 逆向依赖分析, 逆向工具, 错误基检测, 隐私保护, 静态代码分析, 驱动签名利用