claudit 是一个面向 Python 代码库的 AI 安全审计工具:先用 tree-sitter 索引仓库、识别危险 sink(危险函数)与用户输入 source(攻击面),再用 semgrep 做确定性静态预扫,然后交给 Claude 做语义级漏洞分析,最后用对抗式验证(POC 参考库佐证 + OCR 截图兜底)压低误报。产出带 file:line / CWE / 严重度 / 验证结论的发现,支持 CLI、Web dashboard 复核与 SARIF 交付。
- 五层流水线:索引 → semgrep 预扫 → AI 审计 → 对抗式验证 → 人工复核
- 确定性 + 语义结合:semgrep 规则零 token 抓确定性问题;AI 专注静态工具抓不到的业务逻辑与跨函数污点
- 对抗式验证:质疑者 agent 主动反驳每条发现,只有「sink 危险 + 输入可控 + 无净化」才 confirmed
- POC 参考库:本机 Threekiii/Awesome-POC 库(1103 个真实漏洞,834MB,需自行下载,不入库)按标题检索,验证阶段读 md 内容佐证;截图 OCR 兜底
- Web dashboard:浏览选取审计目标(文件或整个文件夹)、按键扫描(SSE 实时进度)、统计筛选、批量三态复核、一键修复(AI 生成补丁 → 预览 diff → 应用并自动备份)、网页设置 API 参数;与 CLI 共享同一数据库
- 分部分析与 token 控制:AI 阶段按「每批切片」分批处理(sink 级
analyzed标记,重扫自动续跑剩余);超长函数切片截断为 sink 为中心窗口;token 预算(默认 50 万)超了自动停止并提示续扫;扫描可选排除目录 - SARIF 2.1.0 导出:兼容 GitHub code scanning / VS Code
- 全程把被审计代码与 POC 内容视为不可信数据(提示注入防御)
# 1. conda 环境
conda create -n claudit python=3.11 -y
conda activate claudit
# 2. 安装(semgrep 为可选 extras;dev 含 pytest)
pip install -e .[dev,semgrep]
# 3. 配置 API key(.env 放在项目根目录,从任何目录运行都能读到)
cp .env.example .env # 填入 ANTHROPIC_API_KEY可选:CLAUDIT_POC_DIR(POC 库路径)、CLAUDIT_OCR_PYTHON(有 easyocr 的解释器,默认 base conda)、CLAUDIT_MODEL、CLAUDIT_LIMIT、CLAUDIT_VERIFY_LIMIT、CLAUDIT_EXCLUDE。
📦 POC 参考库不入库(834MB 本地资料,含 3000+ 截图)。需要验证佐证功能时,自行下载:
git clone --depth 1 https://github.com/Threekiii/Awesome-POC.git # 工具默认在项目根目录找 Awesome-POC-2.0 或 Awesome-POC 目录名 # 也可把克隆目录放到任意位置,设 CLAUDIT_POC_DIR 指向它缺失时验证降级为无 POC 参考(阶段二 OCR 兜底也跳过),其余功能不受影响。
# 自带一个故意留漏洞的 Flask 夹具,5 秒内看到全流程效果
claudit audit tests/fixtures/vuln_app --limit 5 --verify
claudit findings --target tests/fixtures/vuln_app
claudit dashboard --target tests/fixtures/vuln_app # 网页复核# 静态全量扫描(不调 AI、零 token):tree-sitter 索引 + semgrep 确定性预扫
claudit audit <目标仓库> --no-ai
# 完整审计:索引 + semgrep 预扫 + AI 分析 + 自动对抗式验证
claudit audit <目标仓库> --limit 10 --verify # --no-semgrep 可跳过预扫
# 单独跑验证(阶段一 md 参考 → 阶段二 uncertain OCR 兜底)
claudit verify --target <目标仓库> --limit 10
# POC 参考库
claudit poc-index # 重建 md 索引
claudit poc-search "SQL注入" --top 5 # 按标题检索漏洞
claudit poc-ocr <截图路径...> # 手动 OCR 截图(复用 easyocr)
# 查看 / 详情 / 人工复核标记
claudit findings --target <目标仓库> # 含 Source 列(ai/semgrep)
claudit show <id> --target <目标仓库>
claudit mark <id> --status confirmed|fp --target <目标仓库>
# Web dashboard:选取目标 → 扫描(SSE 进度)→ 复核 → 一键修复 → 设置
claudit dashboard [--target <初始目标>] --port 8000
# 或者直接双击项目根目录的 启动.bat(免参数直达 dashboard)
# 导出 SARIF 2.1.0(兼容 GitHub code scanning / VS Code)
claudit export --target <目标仓库> --out findings.sarif [--status confirmed]审计结果存在 <目标仓库>/.claudit/audit.db(SQLite),CLI 与 dashboard 共享。
⚠️ dashboard 默认只绑定127.0.0.1。发现包含源码与敏感信息,勿通过--host对外暴露。
① 索引 (M1) tree-sitter 解析 → 函数/调用图/source(用户输入)/sink(危险函数)
② 预扫 (M2) semgrep 策展规则 → 确定性发现(source=semgrep,零 token)
③ AI 审计 (M3) 对「sink + 可达污点路径」切片 → Claude 结构化输出(CWE/severity/证据/修复)
④ 对抗验证 (M4) 质疑者 agent 反驳每条发现
├ 命中 POC 标题 → 读 md 内容佐证
├ confirmed / refuted
└ uncertain → OCR 相关 POC 截图 → 再验证(stage=ocr)
⑤ 复核 (M6) CLI mark / Web dashboard 批量三态复核
⑥ 交付 (M7) SARIF 2.1.0 导出
Z:\py\代码审计\
├── claudit/
│ ├── config.py # .env 加载(cwd + 项目根目录双保险)+ 配置
│ ├── store.py # SQLite DAO(runs/files/functions/sinks/sources/findings/verifications)
│ ├── core/
│ │ ├── rules.py # 漏洞分类法 → source/sink AST 匹配规则
│ │ ├── indexer.py # tree-sitter 解析、提取函数、匹配 source/sink
│ │ ├── callgraph.py # 调用图 + 污点可达性(切片优先级)
│ │ ├── semgrep.py # M2 预扫:扫描 + 归一化 + 入库(source=semgrep)
│ │ ├── ai.py # LLM 基类 + 分析器(tool-use 结构化输出)
│ │ ├── finder.py # 切片选择 → AI → 去重 → 入库
│ │ ├── verifier.py # M4 对抗式验证(md → OCR 两阶段)
│ │ ├── sarif.py # M7 SARIF 2.1.0 导出
│ │ └── poc/ # POC 参考库:indexer / retriever(标题检索)/ ocr(子进程复用 easyocr)
│ ├── rules/semgrep/ # 18 条策展规则(纯 ASCII,含 UPLOAD/SSTI/XXE/重定向等)
│ ├── web/ # FastAPI dashboard + 原生 JS 前端(无构建)
│ └── cli/app.py # audit / verify / findings / show / mark / export / dashboard / poc-*
├── tests/ # 29 个用例(索引/semgrep/验证/dashboard/SARIF/迁移)
│ └── fixtures/ # vuln_app(漏洞夹具)、pocs(迷你 POC 库)、semgrep_target
└── Awesome-POC-2.0/ # POC 参考库(1103 个真实漏洞,含截图)
| 变量 | 默认 | 说明 |
|---|---|---|
ANTHROPIC_API_KEY |
— | 必填,AI 分析/验证 |
CLAUDIT_MODEL |
claude-sonnet-4-5 |
审计模型 |
CLAUDIT_LIMIT |
50 |
单次审计最多分析切片数 |
CLAUDIT_VERIFY_LIMIT |
50 |
单次验证最多发现数 |
CLAUDIT_POC_DIR |
项目根/Awesome-POC-2.0 | POC 参考库(不设则默认;设相对路径按 cwd 解析) |
CLAUDIT_OCR_PYTHON |
C:/ProgramData/miniconda3/python.exe |
OCR 兜底用的解释器(需有 easyocr) |
CLAUDIT_EXCLUDE |
— | 索引排除目录(逗号分隔) |
CLAUDIT_SLICE_MAX_LINES |
250 |
超长函数切片截断阈值 |
CLAUDIT_MAX_TOKENS |
500000 |
AI 阶段 token 预算(超出停止,续扫继续) |
- XSS 服务端渲染场景弱检测;FastAPI 依赖注入式参数(
Depends)暂不识别为 source - POC 检索为标题加权关键词(无向量 embedding)
- 搜寻参考仍是规则表 + 模型知识(POC 参与分析阶段的增强暂缓)
- 被审计代码与 POC 内容都视为数据而非指令(提示注入防御)
python -m pytest tests/ # 29 个用例;semgrep 用例在未装 semgrep 时自动跳过