hamzamiladin/Vulnchain
GitHub: hamzamiladin/Vulnchain
Vulnchain 是一款集成了 SAST 与 AI 能力的自主安全审计工具,通过多引擎扫描与攻击链关联分析,为软件团队生成深度漏洞报告。
Stars: 4 | Forks: 0
# Vulnchain
**面向软件团队的自主 AI 驱动安全审计。**
Vulnchain 扫描任意 Git 仓库,并生成包含攻击链、STRIDE 威胁模型以及 AI 生成的代码风险评分的优先级漏洞报告——只需一条 `docker compose up` 命令即可完成。无需 SaaS 账户,除了您自己的 Claude 密钥外,无需任何 API 令牌。
[](LICENSE)
[](https://github.com/your-org/vulnchain/actions/workflows/ci.yml)
[](https://www.python.org/downloads/)
[](docker-compose.yml)
[](CONTRIBUTING.md)
## 为什么选择 Vulnchain?
| 功能 | Vulnchain | Semgrep OSS | CodeQL | Snyk |
|---------|:---:|:---:|:---:|:---:|
| 多引擎 SAST (Semgrep + CPG 污点分析) | ✅ | ❌ | 部分 | ❌ |
| Joern 过程间污点分析 (13 个脚本) | ✅ | ❌ | ✅ | ❌ |
| AI 生成代码检测 | ✅ | ❌ | ❌ | ❌ |
| LLM 代码审查 (Claude) | ✅ | ❌ | ❌ | ❌ |
| 攻击链综合 | ✅ | ❌ | ❌ | ❌ |
| STRIDE 威胁模型 | ✅ | ❌ | ❌ | ❌ |
| CVE 扫描 (OSV) | ✅ | ❌ | ❌ | ✅ |
| 10 种语言的 Semgrep 规则 (135+ 条规则) | ✅ | 部分 | ❌ | 部分 |
| 通用密钥扫描器 (18 种模式) | ✅ | 部分 | ❌ | ✅ |
| SARIF 输出 | ✅ | ✅ | ✅ | ✅ |
| 完全自托管,无需认证 | ✅ | ✅ | ❌ | ❌ |
## 工作原理
```
GitHub Webhook (Rust :9000)
│ push / PR event
▼
Agent API (Python / FastAPI :8080)
│ spawns LangGraph pipeline
▼
┌─────────────────────────────────────────────────────┐
│ Scan Pipeline │
│ │
│ clone_repo → parse_ast → run_semgrep │
│ → detect_ai_code → run_joern │
│ → scan_dependencies → llm_code_review │
│ → generate_threat_model │
│ → synthesize_attack_chains → generate_report │
└─────────────────────────────────────────────────────┘
│
▼
PostgreSQL 16 ←→ Next.js Dashboard (:3000)
```
### 服务
| 服务 | 技术栈 | 端口 | 用途 |
|-------------|-----------------------|------|-------------------------------|
| `agent` | Python 3.12 / FastAPI | 8080 | 扫描流水线 + REST API |
| `webhook` | Rust / Axum | 9000 | GitHub webhook 接收器 |
| `dashboard` | Next.js 14 | 3000 | Web UI — 发现结果 + 报告 |
| `db` | PostgreSQL 16 | 5432 | 持久化存储 |
## 快速开始
### 环境要求
- Docker + Docker Compose v2
- 一个 [Anthropic API key](https://console.anthropic.com/)
```
git clone https://github.com/your-org/vulnchain
cd vulnchain
cp .env.example .env
# 编辑 .env — 至少设置 ANTHROPIC_API_KEY
docker compose up --build -d
```
首次构建大约需要 5–10 分钟(会下载 Joern、Java 21、Semgrep、Rust 工具链、Node 模块)。
### 运行您的第一次扫描
```
# 通过 API 触发
curl -X POST http://localhost:8080/api/scans \
-H "Content-Type: application/json" \
-d '{"repo_url": "https://github.com/digininja/DVWA"}'
# → {"scan_id": "...", "status": "accepted"}
# 轮询结果
curl http://localhost:8080/api/scans/
# 或打开 dashboard
open http://localhost:3000
```
### CLI(不使用 Docker)
```
pip install -e ".[dev]"
export ANTHROPIC_API_KEY=sk-ant-...
export DATABASE_URL=postgresql://vulnchain:vulnchain@localhost:5432/vulnchain
vulnchain scan https://github.com/digininja/DVWA
vulnchain serve --port 8080
```
## 扫描流水线 — 逐步详解
| 步骤 | 作用 |
|------|-------------|
| **clone_repo** | 克隆目标仓库或检出特定的 commit/PR SHA |
| **parse_ast** | Tree-sitter:提取语言、导入、函数名、路由定义以进行架构指纹识别 |
| **run_semgrep** | 跨 10 种语言的 135+ 条本地规则 —— 针对多跳注入流的污点模式,无需认证 |
| **detect_ai_code** | 6 评分器启发式引擎检测 AI 生成的代码:提交元数据、突发性、安全反模式、注释密度、占位符字符串、幽灵方法 |
| **run_joern** | 13 个 CPG 污点脚本用于过程间分析:SQLi、SSRF、SSTI、原型污染、JWT 混淆、XXE、反序列化、LDAP 等 |
| **scan_dependencies** | 解析所有 lockfile,批量查询 [OSV API](https://osv.dev) 获取 CVE,识别框架版本指纹 |
| **llm_code_review** | 将高风险文件连同前置行号发送给 Claude;通过证据片段搜索将发现结果锚定到实际代码 |
| **generate_threat_model** | Claude 基于发现的架构和发现结果生成完整的 STRIDE 威胁模型,并映射到 OWASP Top 10 2021 和 CWE ID |
| **synthesize_attack_chains** | Claude 将发现结果组合成现实的多步骤利用链(例如 SQL 注入 → 凭证转储 → 管理员接管),并附带 CVSS 估算 |
| **generate_report** | 汇编 Markdown + SARIF 输出,准备好导入 GitHub Security 标签页 |
## Semgrep 规则(135+ 条规则,10 种语言,无需认证)
所有规则位于 `src/vulnchain/semgrep_rules/`。无需 Semgrep 账户即可在本地运行。
| 文件 | 语言 | 规则数 | 主要覆盖范围 |
|------|----------|-------|-------------|
| `python-security.yaml` | Python | 22 | SQLi、命令注入、路径遍历、pickle/shelve 反序列化、XXE、Jinja2/Mako SSTI、SSRF、zip slip、LDAP 注入、subprocess shell 注入 |
| `java-security.yaml` | Java | 19 | SQLi、SpEL 注入、命令注入、路径遍历、SSRF、XXE、反序列化 (ObjectInputStream/XMLDecoder)、Log4Shell、Thymeleaf/FreeMarker/Velocity SSTI、开放重定向、LDAP、弱加密算法 |
| `php-security.yaml` | PHP | 19 | SQLi 污点、XSS 污点、命令注入、eval/assert RCE、文件包含、XXE、session fixation、unserialize、extract()、类型混淆、preg_replace /e、开放重定向、LDAP、弱哈希 |
| `go-security.yaml` | Go | 11 | SQLi、命令注入、路径遍历、SSRF、TLS `InsecureSkipVerify`、硬编码密钥、不安全的随机数、开放重定向、模板注入、弱加密算法 |
| `javascript-security.yaml` | JavaScript | 12 | 原型污染、NoSQL 注入、ReDoS、postMessage origin 绕过、路径遍历、`innerHTML` XSS、JWT 无算法、`eval` |
| `csharp-security.yaml` | C# | 12 | SQLi、命令注入、路径遍历、SSRF、XXE、BinaryFormatter/NetDataContractSerializer 反序列化、Json.NET TypeNameHandling、LDAP、ViewState MAC 绕过、弱加密算法 |
| `ruby-security.yaml` | Ruby | 14 | SQLi (ActiveRecord + raw Arel)、命令注入、`eval`、批量赋值、路径遍历、SSRF、ERB SSTI、开放重定向、`Marshal.load`、`html_safe` XSS、弱哈希、ReDoS |
| `typescript-security.yaml` | TypeScript | 6 | Lodash 原型污染、不安全的 `JSON.parse as Type`、`req.body as any` 绕过、JWT 算法混淆、硬编码密钥 |
| `secrets-universal.yaml` | All | 18 | AWS (AKIA)、GCP (AIza)、GitHub PAT、GitLab token、Stripe、Slack、SendGrid、Twilio、SSH 私钥、URL 中的凭证、JWT 令牌、OpenAI/Anthropic/Hugging Face 密钥 |
| `swift-security.yaml` | Swift | 3 | 硬编码凭证、不安全的 HTTP、`allowsArbitraryLoads` |
**总计:10 种语言共 136 条规则**
## Joern CPG 脚本(过程间污点分析)
Joern 为整个仓库构建代码属性图 (CPG) 并运行过程间数据流分析 —— 捕获跨多个文件和函数调用的漏洞,而这些是模式匹配工具会遗漏的。
| 脚本 | 规则 ID | 严重程度 | 覆盖范围 |
|--------|---------|----------|---------|
| `tainted_sql.sc` | `tainted-sql-injection` | 严重 | 用户输入 → 跨调用边界的 SQL 汇点 |
| `command_injection.sc` | `tainted-command-injection` | 严重 | 用户输入 → exec/system/popen |
| `path_traversal.sc` | `tainted-path-traversal` | 高 | 用户输入 → 文件打开/读取汇点 |
| `ssrf.sc` | `tainted-ssrf` | 高 | 用户输入 → HTTP 客户端 URL 参数 |
| `template_injection.sc` | `template-injection-ssti` | 严重 | 用户输入 → Thymeleaf/FreeMarker/Velocity/Jinja2/Pug/EJS 渲染 |
| `xxe_injection.sc` | `xxe-injection` | 高 | 用户输入 → 无 DTD 防护的 XML 解析器 |
| `insecure_deserialization.sc` | `insecure-deserialization` | 严重 | 用户输入 → ObjectInputStream/XMLDecoder/pickle/unserialize |
| `ldap_injection.sc` | `ldap-injection` | 高 | 用户输入 → 未转义的 LDAP 过滤器 |
| `open_redirect.sc` | `open-redirect` | 中 | 用户 URL → sendRedirect/Response.Redirect |
| `data_leak.sc` | `sensitive-data-in-logs` | 高 | 密码/令牌参数 → 日志汇点 |
| `missing_auth.sc` | `missing-authorization` | 高 | 缺少身份验证检查的端点 |
| `prototype_pollution.sc` | `prototype-pollution` | 高 | req.body → lodash merge/set/deepMerge |
| `jwt_algorithm_confusion.sc` | `jwt-algorithm-confusion` | 严重 | 来自 JWT 头的算法 → decode 调用;`algorithms=None` |
## AI 生成代码检测
`detect_ai_code` 步骤会标记显示出 AI 生成统计特征的文件。这一点很重要,因为 [Veracode 2025 GenAI 代码安全报告](https://www.veracode.com/resources/state-of-software-security-genai) 发现 **45% 的 AI 生成代码引入了安全缺陷** —— 这一比例高于人工编写的代码。
六个独立的评分器通过学习到的权重进行组合:
| 评分器 | 权重 | 衡量内容 |
|--------|--------|-----------------|
| 提交信号 | 30% | 提交信息中的 AI 工具归属(Copilot、Cursor、Codeium);大型原子转储(200+ 行新增,0 行删除) |
| 代码模式 | 25% | 过于详尽的文档字符串;空存根函数;宽泛的 `except Exception`; TODO 占位符;**突发性**(低行长 CV < 0.35 — AAAI 2024) |
| 安全反模式 | 25% | `verify=False`、`InsecureSkipVerify`、占位符密钥(`"changeme"`、`"your-secret-key"`)、用于密码的 SHA256、JWT `verify_signature=False`、时序不安全的 `==` |
| 注释密度 | 10% | >20% 的注释与代码比例 —— AI 过度文档化 |
| 占位符字符串 | 5% | `example.com`、`localhost`、`dummy_key`、`foo`/`bar` 字面量 |
| 方法有效性 | 5% | 被调用的方法名在 stdlib 或导入中未找到的比例很高 |
得分 ≥ 0.40 的文件会被标记,并附带置信度分数和报告中列出的触发信号。
**研究基础:** arxiv:2601.17406(97.2% F1 AI 指纹识别)、AAAI 2024 突发性指标(AUC 0.56 → 0.87)、Veracode 2025 GenAI 代码安全报告。
## API 参考
| 方法 | 端点 | 描述 |
|--------|----------|-------------|
| `GET` | `/health` | 健康检查 |
| `GET` | `/api/scans` | 列出扫描 (`?page=1&page_size=20`) |
| `POST` | `/api/scans` | 触发扫描:`{"repo_url": "..."}` |
| `GET` | `/api/scans/{id}` | 扫描详情,包含发现结果 + 攻击链 |
| `GET` | `/api/scans/{id}/report` | 完整 Markdown 报告 |
| `GET` | `/api/stats` | 聚合统计 + 30 天趋势 |
| `GET` | `/api/repos` | 已扫描的不同仓库 |
| `GET` | `/api/repos/{name}/trend` | 每个仓库的发现趋势 |
| `POST` | `/internal/scan` | 内部 —— 由 webhook 服务使用 |
###对象
```
{
"id": "uuid",
"scan_id": "uuid",
"source": "semgrep | joern | llm_review | dependency",
"rule_id": "php-sql-injection-taint",
"severity": "critical | high | medium | low | info",
"file_path": "src/login.php",
"line_start": 42,
"message": "User input flows into SQL query without sanitization",
"fix_suggestion": "Use prepared statements with PDO or MySQLi bind_param()",
"is_ai_generated": false,
"ai_confidence": null,
"cve_id": null
}
```
### 攻击链对象
```
{
"id": "uuid",
"scan_id": "uuid",
"title": "SQL Injection to Admin Takeover",
"combined_severity": "critical",
"steps": ["Step 1: Extract credentials via SQLi", "Step 2: Crack MD5 hash offline", "Step 3: Login as admin"],
"finding_ids": ["php-sql-injection-taint", "php-weak-hash"],
"business_impact": "Full database read/write, admin session hijack, potential RCE",
"cvss_score": 9.1
}
```
## GitHub PR 扫描(自动)
1. 创建一个 GitHub App,启用 `pull_request` 事件 + `contents: read` + `pull_requests: write` 权限
2. 安装到您的组织/仓库
3. 在 `.env` 中设置 `GITHUB_APP_ID`、`GITHUB_WEBHOOK_SECRET`、`GITHUB_APP_PRIVATE_KEY_PATH`
4. 将 webhook 指向 `http://:9000/webhook`
Rust webhook 服务验证 HMAC-SHA256 签名,创建扫描记录,并转发给 agent。当扫描完成时,会在 PR 上发布一条评论,其中包含发现结果摘要。
## 项目结构
```
vulnchain/
├── LICENSE
├── README.md
├── SECURITY.md
├── CONTRIBUTING.md
├── docker-compose.yml
├── Dockerfile.agent
├── pyproject.toml
├── .env.example
│
├── src/vulnchain/
│ ├── main.py # CLI entrypoint (typer)
│ ├── config.py # Pydantic settings
│ ├── agent/
│ │ ├── graph.py # LangGraph pipeline
│ │ ├── nodes.py # Pipeline step implementations
│ │ ├── state.py # ScanState TypedDict
│ │ ├── prompts.py # LLM prompt templates
│ │ └── pr_comment.py # GitHub PR comment formatter
│ ├── analysis/
│ │ ├── semgrep_scanner.py # Semgrep subprocess wrapper
│ │ ├── joern_runner.py # Joern CPG runner (13 scripts)
│ │ ├── ai_code_detector.py # AI-generated code detector (6 scorers)
│ │ ├── dependency_scanner.py # OSV CVE + tech fingerprinting
│ │ ├── ast_parser.py # Tree-sitter file analysis
│ │ └── models.py # Dataclasses (Finding, JoernFinding, etc.)
│ ├── semgrep_rules/ # 136 local Semgrep rules (10 languages)
│ ├── joern_scripts/ # 13 Joern CPG taint analysis scripts
│ ├── api/
│ │ └── app.py # FastAPI app + endpoints
│ ├── db/
│ │ ├── connection.py # asyncpg connection pool
│ │ ├── models.py # SQLAlchemy ORM models
│ │ └── migrations/ # SQL migration files
│ ├── ingestion/ # Repo cloning + file reading
│ └── reporting/ # Markdown + SARIF report generators
│
├── dashboard/ # Next.js 14 frontend
│ ├── src/app/
│ │ ├── page.tsx # Scans list + stats
│ │ └── scan/[id]/page.tsx # Scan detail page
│ └── src/components/
│ ├── FindingsTable.tsx # Severity/source badges
│ └── AttackChainCard.tsx # Attack chain display
│
├── vulnchain-webhook/ # Rust webhook receiver
│ ├── src/
│ │ ├── main.rs # Axum server setup
│ │ ├── webhook.rs # GitHub webhook + HMAC-SHA256 verification
│ │ ├── github.rs # GitHub API client (app auth)
│ │ └── db.rs # DB helpers
│ └── Cargo.toml
│
└── tests/ # pytest test suite
├── test_semgrep_scanner.py
├── test_ai_detector.py
└── conftest.py
```
## 配置参考
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `DATABASE_URL` | `postgresql://vulnchain:vulnchain@localhost:5432/vulnchain` | PostgreSQL 连接字符串 |
| `ANTHROPIC_API_KEY` | — | **必填。** 用于 LLM 审查、威胁模型、攻击链 |
| `LLM_MODEL` | `claude-sonnet-4-6` | Claude 模型 ID |
| `CORS_ORIGINS` | `http://localhost:3000` | 逗号分隔的允许来源 |
| `GITHUB_APP_ID` | `0` | GitHub App ID(可选) |
| `GITHUB_WEBHOOK_SECRET` | — | 用于 webhook 验证的 HMAC-SHA256 密钥 |
| `GITHUB_APP_PRIVATE_KEY_PATH` | `./github-app.pem` | GitHub App 私钥 PEM 文件路径 |
| `AGENT_URL` | `http://agent:8080` | Webhook 服务使用的内部 agent URL |
| `SCAN_SANDBOX_DIR` | `/tmp/vulnchain-scans` | 仓库克隆位置 |
| `MAX_REPO_SIZE_MB` | `500` | 拒绝大于此大小的仓库 |
| `SEMGREP_TIMEOUT_SECONDS` | `120` | Semgrep 单次扫描超时时间 |
| `JOERN_TIMEOUT_SECONDS` | `300` | Joern 单次扫描超时时间(JVM 启动约 15s) |
| `LOG_LEVEL` | `INFO` | Python 日志级别 |
## 开发
```
# 安装 dev dependencies
pip install -e ".[dev]"
# 运行 tests
pytest tests/ -v --cov=src/vulnchain
# Lint + typecheck
ruff check src/ tests/
mypy src/
# 验证所有 Semgrep rules
semgrep --config src/vulnchain/semgrep_rules/ --validate
# 代码更改后仅重新构建 agent
docker compose up --build -d agent
# Tail logs
docker compose logs -f agent
```
## 故障排除
**Agent 启动时出现 `DB connection error`**
`docker-compose.yml` 中的 `depends_on: condition: service_healthy` 处理了启动顺序。如果看到此错误,请运行 `docker compose ps` 并等待 `db` 显示为 `healthy`。
**Semgrep 退出代码 7**
注册表令牌产生了干扰。请确保您的环境中未设置 `SEMGREP_APP_TOKEN` —— 扫描器仅在本地运行。
**Joern 在大型仓库上超时**
增加 `JOERN_TIMEOUT_SECONDS`。Joern 失败是非致命的;流水线会继续处理所有其他发现结果。
**LLM 发现结果缺少行号**
流水线会在实际文件中搜索每个证据片段以锚定行号。如果来自 Claude 的证据字段与任何真实代码都不匹配,行号默认为 0。请检查 agent 日志中的 `[anchor_line]`。
**`findings_source_check` 约束冲突**
旧的数据库架构。重启 agent —— 它会在启动时删除并重新创建此约束。
## 安全
如果您在 Vulnchain 本身中发现安全漏洞,请遵循 [SECURITY.md](SECURITY.md) 中的流程。不要公开提交 issue。
## 许可证
[MIT](LICENSE) — Copyright (c) 2026 Vulnchain Contributors
标签:AI安全, AV绕过, Chat Copilot, Claude, CPG, CVE检测, DevSecOps, Docker, FastAPI, Git仓库扫描, Joern, LangGraph, LLM, Rust, SARIF, SAST, secrets scanner, Semgrep, STRIDE, Unmanaged PE, WordPress安全扫描, 上游代理, 代码审查, 代码属性图, 可视化界面, 多语言支持, 威胁建模, 安全测试框架, 安全防御评估, 密钥泄露检测, 开源安全工具, 攻击链分析, 测试用例, 盲注攻击, 结构化查询, 网络流量审计, 自动化安全, 自托管, 请求拦截, 逆向工具, 逆向工程平台