MohammedAlsabih/ai-code-auditor

GitHub: MohammedAlsabih/ai-code-auditor

一款确定性的无 LLM 静态分析工具,专门检测 AI 生成代码中的幻觉依赖和高风险编程模式。

Stars: 0 | Forks: 0

# AI 代码审计工具 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/MohammedAlsabih/ai-code-auditor/actions/workflows/ci.yml) [![Release](https://img.shields.io/github/v/release/MohammedAlsabih/ai-code-auditor?include_prereleases)](https://github.com/MohammedAlsabih/ai-code-auditor/releases) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) 一款针对包含 AI 生成或 AI 修改代码的代码仓库的确定性静态分析工具。 它专门检测生成代码中常见的两类缺陷:不存在的依赖项(幻觉包)和 高风险代码模式。该工具在运行时不使用任何 LLM —— 相同的输入始终 产生相同的结果,且绝不会执行被扫描代码仓库中的任何内容。 该工具并不试图证明一段代码是*谁*编写的; 它只检查生成代码中容易出现的错误。 ## 检查内容 **引擎 1 — 幻觉依赖。** 每个 import 和声明的 依赖项都会与公共仓库(PyPI、npm、Maven Central、NuGet)进行比对。声明但在其仓库中不存在的包被判定为 可能的幻觉包以及可被抢注的名称。下载量接近于零的极新包 会被标记为供应链警告。查询仅发送包*名称*;`--offline` 会禁用所有网络访问,并 将依赖仓库的规则标记为未验证,而不是进行猜测。 **引擎 2 — 高风险模式。** 通过 tree-sitter 实现的 AST 规则,按语言划分: | 家族 | 语言 | 示例 | |---|---|---| | P | 全部 | 硬编码密钥(输出时脱敏)、字符串拼接的 SQL、空的 catch 块、圈复杂度、相对于 `requires-python` 的标准库偏移 | | R | React | Rules-of-Hooks 违规、effect 依赖问题、`key={index}`、非字面量的 `dangerouslySetInnerHTML` | | N | Next.js | 基于真实模块导入图解析的服务器/客户端边界违规、`NEXT_PUBLIC_` 密钥(值不回显) | | J / D | Java / .NET | 字符串使用 `==` 比较、缺失 try-with-resources、`async void`、阻塞式的 `.Result`/`.Wait()`、原始 SQL 插值 | | S | 多种 | 可选的 Semgrep/OpenGrep 层;默认仅运行捆绑的 MIT 许可规则 | 支持的语言:Python、TypeScript/JavaScript (React、Next.js)、Java、 C#。运行该工具本身需要 Python 3.11 或 3.12;Windows 和 Linux 已由 CI 覆盖。 ## 发现级别与精度 发现结果带有兼容 SARIF 的 `level`: - `error` — 高置信度缺陷(例如:幻觉的 npm import、 密钥形状的字面量、被拼接到执行 sink 的 SQL) - `warning` — 需要审查(例如:未验证的未声明 import、 在客户端代码中读取的私有环境变量) - `note` — 信息性提示(例如:AI 风格的不完整注释) 每个发现结果还会声明其 `precision`:当规则的前提条件在机制上确定时为 `exact`;当其依赖于某种约定时为 `heuristic`(例如 Python 的 import 名称等同于包名称的约定,或 Java/.NET 的 前缀映射)。 ## 门控策略与判定 判定结果衍生自每个发现结果的 `gate_action`,而不是 仅凭级别或数量: | 级别 | 精度 | gate_action | |---|---|---| | error | exact | **block** | | error | heuristic | review | | warning | exact / heuristic | review | | note | exact / heuristic | informational | 精度为 `exact` 的 error 会阻断门控 (block)。精度为 `heuristic` 的 error 是一个强烈信号,而非 确凿证明 —— 默认情况下它要求进行审查而不是阻断(项目可以 在其配置中将其提升为 `block`,见下文)。note 永远不会触发门控。 `report.json` 中的 `summary.gate_counts` 准确显示了驱动判定结果的因素。 `code_health` 分数仅作为严重性排序指标,绝非 安全声明。 ## 分析置信度 vs. 仓库验证 这是报告摘要中两个独立的维度: - `analysis_confidence` — 文件/清单/规则分析 的*完整*程度(跳过的文件、未解析的清单、规则失败)。它不包含 任何仓库因素。 - `registry_status` — 依赖验证是否运行: `complete`、`partial`(部分查询失败 → 判定结果不能为 `pass`)、`unavailable`(预期的 `--offline`)或 `not_applicable`,仅当查询实际运行时才会提供 数字形式的 `registry_confidence`。 由于预期的 `--offline` 运行不属于分析缺陷,一次干净且完整的 离线扫描可以以 `PASS` 结束并返回退出代码 0 —— 包括在 `--strict` 模式下。依赖仓库的规则仍会作为未验证的 note 显示。 ## 执行证据 `report.json` 不仅记录发现结果,还记录每条规则是否实际运行: `analysis_manifest.execution` 保存了每个项目、每条规则的事实(符合条件 的输入、尝试、失败、被阻止或部分解析的输入、结构化 原因)以及推导出的状态:`executed`、`partial`、`failed`、`blocked`、 `unavailable`、`skipped`、`not_applicable`、`not_recorded` 或 `inconsistent`。一条运行且未发现任何问题的规则状态为 `executed` —— 这是 刻意设计的,不存在“passed”状态。报告浏览器的 **Rules** 标签页按 规则和项目可视化展示了此区块。 ## 安装 ``` python -m venv .venv .venv/Scripts/pip install -e . # core scanner .venv/Scripts/pip install -e ".[web]" # + local report explorer auditor --version # ai-code-auditor 0.1.0a1 ``` 或者安装随 [最新发布版本](https://github.com/MohammedAlsabih/ai-code-auditor/releases)附带的 wheel 包。 尚未在 PyPI 上发布。 ## 扫描 ``` auditor scan https://github.com/org/repo # clone + scan a public repo auditor scan path/to/project --output my-report auditor scan . --offline # no network at all auditor scan . --strict # REVIEW also fails (for CI) auditor scan . --no-semgrep # builtin rules only auditor scan . --semgrep-bin opengrep --semgrep-config my.yml auditor scan . --sarif # also write report.sarif auditor scan . --baseline old/report.json # mark findings new/unchanged auditor scan . --baseline old/report.json --new-only # gate on new findings only auditor scan . --config path/to/.auditor.toml # explicit project config ``` 退出代码:`0` 通过 · `1` 判定 BLOCK(或在 `--strict` 下为 REVIEW)· `2` 致命错误。输出结果保存在 `--output` 中(默认为 `auditor-report/`): `report.md` 供人类阅读,`report.json` 供机器读取(完整的诊断账本、 `analysis_confidence`、`registry_status`、门控计数),当提供 `--sarif` 参数时还会生成 `report.sarif` (SARIF 2.1.0)—— 可导入到 GitHub 代码 扫描及其他 SARIF 消费者中。SARIF 文件包含规则元数据、 相对于代码库的路径、与行号无关的指纹以及基线状态; 它绝不包含源码片段、审查备注或机器路径。 ## 基线 `--baseline` 接收来自先前扫描的 `report.json`。每个当前的 发现结果都会通过内容指纹(项目、文件、规则、 引擎以及标准化后的匹配文本 —— 刻意去除了行号, 因此移动代码不会产生“新”的发现结果)与其进行匹配,并 标记为 `baseline_state: new | unchanged`。使用 `--new-only` 时,仅 *新*发现结果会影响判定 —— 报告依然包含所有内容,且摘要 会统计已解决的基线发现数量。典型的 CI 形态:在修复回归问题时阻断门控, 同时单独处理继承的历史遗留问题。 ## 项目配置 位于代码仓库根目录的 `.auditor.toml`(或使用 `--config PATH`)可调整 扫描行为。Schema v1 涵盖范围界定;schema v2 增加了门控策略: ``` schema_version = 2 exclude_paths = ["fixtures", "legacy/generated"] dependency_exclude_paths = ["docs"] # code rules still run there npm_roots = ["tools/scripts"] # manifestless dirs that are npm-owned [policy] heuristic_errors = "block" # promote heuristic errors from review to block [rule_levels] # per-rule level overrides, catalog-validated R007 = "warning" P005 = "error" ``` 规则级别的覆盖会透明地更改发现结果的有效级别: 报告会将原始级别保留为 `default_level`,并标记 `level_source = "project_policy"`。格式错误的配置会明确报错,且 应用的策略会被记录在 `analysis_manifest.policy` 中。 ## 报告浏览器 ``` auditor serve auditor-report/report.json --repo path/to/project --port 8765 ``` 需要安装 `[web]` 扩展。这是一个仅限本地回环、用于查看单个报告的 Web UI: 包含搜索、级别/规则/路径过滤器、只读源码查看器、规则覆盖 标签页(目录 × 执行证据)、覆盖面板,以及审查工作流 (已确认 / 误报 / 接受风险 / 备注),存储在 报告旁边的 `*.reviews.json` 辅助文件中。使用 `--baseline` 扫描的报告会获得 New/Existing 徽章以及 All/New/Existing 过滤器。 报告文件本身绝不会被修改。 ## 隐私 - 扫描和报告均在本地进行;该工具不会上传任何内容。 - 报告可能包含源码片段 —— 请以与代码本身相同的 保密级别对待 `report.json`/`report.md`。 - 在线模式仅使用包名称查询公共仓库。绝不联系 私有仓库;其背后的包将被报告为 无法验证,而不是进行查询。 - 报告文本会经过脱敏层处理(auth header、token、 密码形状的值),且绝对机器路径不会写入 报告中。脱敏是基于启发式算法的 —— 分享前请进行审查。 ## 局限性 - Java/.NET 的 import 到构件映射使用精选的前缀映射;未映射的 import 将作为未解析的警告报告,绝不会作为猜测的错误。 - Maven Central 不公开下载量,因此新包的启发式判断 在此处较弱。 - Next.js 模块图排除了 middleware、instrumentation 和 metadata 路由;由字符串构建的动态 import 路径将被报告为 未解析的边,而不是进行猜测。 - 不会分析普通 `.js` 文件中的 JSX(会分析 `.jsx`/`.tsx`)。 - Semgrep Registry 包可通过 `--semgrep-config` 选择性开启,并在 您自己的许可责任下运行;默认仅运行捆绑的 MIT 规则。 有关测试夹具的 真实输出,请参见 [`examples/report.md`](examples/report.md) 和 [`examples/report.json`](examples/report.json);有关安全策略,请参见 [SECURITY.md](SECURITY.md)。 ## AI 提供商(仅用于连接测试) `auditor ai` 层负责管理与 LLM 提供商的连接,用于计划中的 AI 辅助审查。在现阶段,它只做两件事:列出 提供商的模型,并使用固定的探针 (`Reply with OK only.`,输出限制为 8 个 token)测试连接。**在此阶段,不会向任何模型发送任何源代码、任何 发现结果或任何报告内容。** 外部服务会收取 API 使用费,并 应用其各自的数据保留策略;Ollama 是本地选项, 不会向机器外发送任何内容。 支持的提供商:`openai` (OpenAI)、`anthropic` (Anthropic Claude)、 `xai` (xAI Grok)、`ollama` (本地 Ollama) 以及 `openai_compatible`(任何 使用 OpenAI chat API 的服务器)。无需额外安装 —— 该层 使用扫描器现有的 HTTP 协议栈。 ``` auditor ai providers # local state, no network auditor ai models --provider anthropic # explicit network call auditor ai test --provider ollama --model llama3.2 ``` 配置仅通过环境变量进行;密钥绝不会写入配置文件、 报告、SARIF、审查辅助文件或浏览器存储中: | 变量 | 含义 | |---|---| | `OPENAI_API_KEY` / `ANTHROPIC_API_KEY` / `XAI_API_KEY` | 提供商密钥 | | `AUDITOR_OPENAI_COMPAT_BASE_URL` | OpenAI 兼容服务器的基础 URL | | `AUDITOR_OPENAI_COMPAT_API_KEY` | 该服务器的可选密钥 | | `OLLAMA_HOST` | Ollama 地址(默认 `http://127.0.0.1:11434`) | | `AUDITOR_AI_PROVIDER` / `AUDITOR_AI_MODEL` | 用于后续阶段的默认值 | OpenAI、Anthropic 和 xAI 的端点固定为官方主机; 自定义基础 URL 仅适用于 Ollama 和 OpenAI 兼容服务器,且 只能从服务器环境中获取 —— 绝不能从浏览器获取。报告 浏览器会获得一个功能相同的 **AI Providers** 标签页;打开 该标签页不会执行任何出站请求,只有明确的“刷新/测试” 按钮才会执行。 ## 开发 ``` pip install -e ".[web,dev]" # pinned pytest/mypy/ruff/type stubs python -m pytest -q # offline by design; registries are mocked python -m ruff check src python -m mypy src # config lives in [tool.mypy] cd web && npm ci && npm run typecheck && node --test tests/*.mjs && npm run build ``` 前端构建输出(`src/auditor/web/static/`)已被提交,因此 wheel 包和普通的检出无需 Node 即可工作。CI 在 Ubuntu 和 Windows、Python 3.11 和 3.12 上运行完整的测试矩阵。 ## 许可证 MIT — 请参见 [LICENSE](LICENSE)。
标签:AI代码审计, 威胁情报, 开发者工具, 逆向工具, 错误基检测, 静态代码分析