Skip to content

Repository files navigation

claudit — AI 代码安全审计工具

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_MODELCLAUDIT_LIMITCLAUDIT_VERIFY_LIMITCLAUDIT_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 个真实漏洞,含截图)

配置(.env)

变量 默认 说明
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 时自动跳过

About

claudit — AI 驱动的 Python 代码安全审计工具:tree-sitter 索引 → semgrep 预扫 → Claude 语义分析 → 对抗式验证(POC 参考佐证)→ Web 复核/一键修复 → SARIF 导出

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages