hzj-Jeff-07/AI-CodeGuard

GitHub: hzj-Jeff-07/AI-CodeGuard

一款结合 Tree-sitter AST 静态预过滤与 LLM 智能确认的两阶段 AI 代码安全扫描工具,旨在精准发现多语言代码中的漏洞并降低误报率。

Stars: 1 | Forks: 0

# AI-CodeGuard ## 当前状态 AI-CodeGuard 目前处于 **Phase 1** 阶段,但 runtime pipeline 已不再仅限于 Stage 1。 目前已实现的功能: - CLI 命令:`scan`、`init`、`rules` (`--list`、`validate`、`create`、`test`) - 本地扫描支持 **JavaScript、TypeScript、Python、Go 和 Java (MVP)** - **13 条内置基于 OWASP 的规则** - 可选的 YAML 自定义规则加载,通过 `rules.custom` 实现 - 通过 **`rules validate/create/test`** 实现自定义规则 CLI 工作流 - 支持 **text、JSON、SARIF** 格式的报告输出 - 当 `scan` 在不带 `--dry-run` 参数运行时,通过 **Claude** 或 **OpenAI** 进行 Stage 2 LLM 分析 - 通过 `--fix` 提供可选的修复建议 - 通过 `.codeguard.yml` / 环境变量加载配置 - 用于 Stage 2 LLM 结果的磁盘缓存(`cache.enabled`),已接入扫描 pipeline - GitHub composite Action (`action.yml`) 以及 CI / SARIF 上传工作流 - 自动化验证,包含 **10 个测试文件中的 225 个通过测试**(2026 年 7 月 4 日的 `npm run test:run` 结果) 目前**尚未**完成的内容: - 超出 2 条规则 MVP 范围的 Java 覆盖(计划加入凭据 / 路径遍历 / SSRF) - npm 发布 / 版本化发布(目前还没有 `v0.2.0` 标签) ### 完成情况快照 | 里程碑 | 状态 | 含义 | |----------|--------|---------| | M0 Phase 1 CLI 基线 | 已完成 | `scan` / `init` / `rules --list` 可用 | | M1 Stage 2 Analyzer | 已完成 | 非 `--dry-run` 扫描可运行 LLM 确认 | | M2 `--fix` 建议 | 已完成 | 确认的 Stage 2 扫描结果可包含 `fix` | | M3 Tree-sitter 解析器 | 已完成 | 主解析器现在使用基于 Tree-sitter 的规范化 AST | | M4 自定义规则 runtime | 已完成 | `rules.custom` 已接入 `scan()`,且 `rules validate/create/test` 可用 | | M5 GitHub / CI 集成 | 已完成 | 存在 composite `action.yml`、`ci.yml` 和 `security-scan.yml`(将 SARIF 上传至 Code Scanning)且通过测试 | | M6 更多语言 | 已完成 (MVP 范围) | Go:5 条规则;Java:2 条规则的 MVP (SQL + 命令注入) | ### 术语 为保证文档的一致性: - **Phase 1** = 当前发布的产品阶段:可用的本地 CLI 基线 - **Stage 1** = runtime pipeline 的静态预过滤阶段 - **Stage 2** = runtime pipeline 的 LLM 确认 / 增强阶段 当前事实:代码库仍处于 **Phase 1**,且 `scan()` 现在支持 **Stage 1 + Stage 2**。使用 `--dry-run` 可在 Stage 1 之后停止。 ## 目前可用的功能 ### CLI 命令 ``` # 构建 CLI npm install npm run build # 在当前项目中初始化 config node dist/index.js init # 仅 Stage 1 node dist/index.js scan ./src --dry-run # 包含 Stage 2 的完整扫描 export CODEGUARD_API_KEY="..." node dist/index.js scan ./src # 在 Stage 2 期间请求修复建议 node dist/index.js scan ./src --fix # 输出 JSON 或 SARIF node dist/index.js scan ./src --output json node dist/index.js scan ./src --output sarif --output-file report.sarif # 列出内置规则 node dist/index.js rules --list # 创建一个起始自定义规则文件 node dist/index.js rules create ./custom-rules/example.yml # 验证自定义规则 YAML node dist/index.js rules validate ./custom-rules # 运行仅 Stage 1 的自定义规则冒烟测试 node dist/index.js rules test ./custom-rules ./src --output json ``` ### 作为 GitHub Action 使用 添加一个工作流,扫描每个 Pull request 并将结果上传到 GitHub Code Scanning(Security 标签页): ``` name: security-scan on: [pull_request] permissions: contents: read security-events: write jobs: codeguard: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: AI-CodeGuard scan id: scan uses: hzj-Jeff-07/AI-CodeGuard@main with: paths: ./src output-file: ai-codeguard.sarif # dry-run: 'false' # enable Stage 2 LLM confirmation # api-key: ${{ secrets.CODEGUARD_API_KEY }} - name: Upload SARIF to Code Scanning if: always() uses: github/codeql-action/upload-sarif@v3 with: sarif_file: ai-codeguard.sarif category: ai-codeguard ``` 默认行为:仅运行 Stage 1(无需 API key),遇到 critical/high 级别的发现时将使任务失败。所有输入参数和更多方案请见:[docs/dev/GITHUB-ACTION.md](./docs/dev/GITHUB-ACTION.md)。 ### 支持的语言 | 语言 | 扩展名 | 规则覆盖范围 | |----------|------------|---------------| | JavaScript | `.js`, `.jsx`, `.mjs`, `.cjs` | 所有 13 条内置规则 | | TypeScript | `.ts`, `.tsx` | 所有 13 条内置规则 | | Python | `.py` | 所有 13 条内置规则 | | Go | `.go` | `CG-001` SQL 注入,`CG-002` 命令注入,`CG-020` 硬编码凭据,`CG-030` 路径遍历,`CG-060` SSRF | | Java | `.java` | MVP:`CG-001` SQL 注入(包含 `String.format`),`CG-002` 命令注入(`Runtime.exec`、`ProcessBuilder`) | ### 内置规则集 | 类别 | 规则 ID | 备注 | |----------|----------|-------| | Injection | `CG-001`, `CG-002`, `CG-003` | SQL 注入、命令注入、eval/代码注入;`CG-001`/`CG-002` 也涵盖 Go 和 Java | | XSS | `CG-010`, `CG-011` | 反射型/DOM 型 XSS | | Auth / Crypto | `CG-020`, `CG-021` | 硬编码凭据(亦包含 Go),弱加密 | | Path | `CG-030`, `CG-031` | 路径遍历(亦包含 Go),任意文件读/写 | | Data | `CG-040`, `CG-041` | 敏感数据暴露,不安全的反序列化 | | Config | `CG-050` | 安全配置错误 | | SSRF | `CG-060` | 服务端请求伪造(亦包含 Go) | 总计:**13 条内置规则**。 ### 自定义规则 Runtime 当前的 runtime 还支持通过配置使用可选的 YAML 自定义规则: ``` rules: preset: none custom: ./custom-rules ``` 当前限制: - `rules.custom` 可以指向一个 YAML 文件或目录 - 目录会递归加载 `*.yml` / `*.yaml` - `disable` 通过规则 ID 应用于内置和自定义规则 - `rules --list` 显示内置规则以及配置中的自定义规则(支持 `--config`) - `rules create` 写入一个最小化的 YAML 骨架并支持 `--force` - `rules validate` 检查 YAML 解析、schema 有效性以及重复的规则 ID - `rules test` 是一个**仅限 Stage 1** 的自定义规则冒烟测试路径,因此它不需要 API key ## 当前扫描的工作原理 当前的 runtime pipeline 为: 1. 使用 `fast-glob` 发现文件 2. 根据文件扩展名检测语言 3. 使用 **基于 Tree-sitter 的规范化解析器** 解析每个文件 4. 加载内置规则以及可选的自定义 YAML 规则 5. 运行规则以产生可疑节点 6. 将可疑节点转换为 Stage 1 扫描结果 7. 如果**未**启用 `--dry-run`,对这些候选项运行 Stage 2 LLM 分析 8. 将输出渲染为 text / JSON / SARIF 重要的 runtime 行为: - `--dry-run` 表示**仅限 Stage 1**,因此 `llmCalls = 0` 且 `estimatedCost = 0` - 到达 Stage 2 的非 dry-run 扫描需要 `llm.apiKey` 或受支持的环境变量 - 确认的 Stage 2 扫描结果会获得 `llmAnalysis`,并且 `--fix` 可以添加 `fix` - LLM 未确认的扫描结果将被移至 `dismissedFindings`(JSON 输出)并附带 LLM 的推理过程,同时文本摘要会显示被驳回的数量 —— Stage 2 的抑制保持可审计 - Stage 2 的 prompt 将被扫描的代码视为不受信任的数据,因此针对被扫描代码中试图诱导 LLM 驳回某一发现的情况,已明确予以禁止(prompt 注入加固) - 当达到 `llm.maxCostUSD` 时,新的 LLM 调用将停止,剩余未分析的扫描结果将保留为 Stage 1 扫描结果 - 当 `cache.enabled` 为 `true` 时,Stage 2 的结果将持久化到 `cache.directory`(默认为 `.codeguard-cache/`);重复扫描在复用它们时,针对缓存条目的 `llmCalls = 0` 且 `estimatedCost = 0` ## 配置 运行 `init` 以生成初始配置: ``` scan: include: - "src/**/*.{ts,js,py,go,java}" - "lib/**/*.{ts,js,py,go,java}" exclude: - "node_modules" - "dist" - "build" - "**/*.test.*" - "**/*.spec.*" rules: preset: owasp-top-10 llm: provider: claude model: claude-sonnet-5 maxConcurrency: 5 output: format: text ``` ### 配置和环境变量 加载器支持: - `.codeguard.yml` - `.codeguard.yaml` - `.codeguard.json` - `codeguard.config.js` - `codeguard.config.ts` 配置加载器目前支持的环境变量覆盖: - `CODEGUARD_API_KEY` - `ANTHROPIC_API_KEY` - `OPENAI_API_KEY` - `CODEGUARD_MODEL` - `CODEGUARD_MAX_COST` Stage 2 目前使用: - `llm.provider` - `llm.model` - `llm.apiKey` - `llm.maxConcurrency` - `llm.maxCostUSD` Stage 2 磁盘缓存由以下选项控制(默认禁用): ``` cache: enabled: true directory: .codeguard-cache ttl: 86400 ``` 注意:提供商选择是在配置文件中配置的,而不是通过专门的环境变量。 ## 输出格式 ### Text 人类可读的终端摘要,包含严重程度、位置、代码片段、可选的修复建议、可选的 LLM 推理以及汇总计数。 ### JSON 结构化的机器可读输出,包含: - 扫描元数据 - 扫描结果 - 跳过的文件 - 可选的 `fix` 和 `llmAnalysis` ### SARIF 适用于下游工具的 SARIF v2.1.0 输出,包含可选的 SARIF 修复和 LLM markdown 上下文。 SARIF 输出可与 GitHub Code Scanning 集成:该代码库提供了一个 composite Action (`action.yml`) 和一个 `security-scan.yml` 工作流,该工作流运行 Stage 1 扫描并通过 `github/codeql-action/upload-sarif` 上传 SARIF 报告。 ## 代码库结构 ``` ai-codeguard/ ├── src/ │ ├── analyzer/ # Stage 2 orchestration and provider adapters │ ├── cli/ # Commander.js entry and commands │ ├── config/ # Config schema, defaults, loader │ ├── parser/ # Tree-sitter runtime, normalization, and adapters │ ├── reporter/ # text / json / sarif formatters │ ├── rules/ # Built-in + custom rule loading and execution │ ├── scanner/ # File discovery and orchestration │ └── types/ # Shared TypeScript types ├── docs/ │ ├── README.md # Documentation entrypoint and reading guide │ ├── adr/ │ │ └── decisions.md │ ├── design/ │ │ ├── TECHNICAL-SUMMARY.md │ │ ├── core-modules.md │ │ ├── CONFIGURATION.md │ │ ├── RULES.md │ │ ├── REPORTING.md │ │ └── LLM-INTEGRATION.md │ └── dev/ │ ├── CLI-EXAMPLES.md │ ├── ROADMAP.md │ └── TESTING.md ├── tests/ │ ├── fixtures/ │ ├── integration/ │ └── unit/ ├── ARCHITECTURE.md ├── package.json ├── tsconfig.json ├── tsup.config.ts └── vitest.config.ts ``` ## 验证 于 2026 年 7 月 4 日验证: ``` npm run build npm run test:run ``` 结果: - 构建通过 - `10` 个测试文件通过 - `225` 个测试通过 ## 限制 当前已知的限制: - 默认的非 dry-run 扫描在进入 Stage 2 时需要 API key - 解析器使用 Tree-sitter 以及保持兼容性的规范化 AST 层 - 模型成本限制依赖于内置的定价表;如果为未知模型设置了 `llm.maxCostUSD`,扫描将快速失败 - `rules test` 被特意设计为仅限 Stage 1,不会触发 Stage 2 - Go 支持涵盖 5 条规则(`CG-001`/`CG-002`/`CG-020`/`CG-030`/`CG-060`);Java 涵盖 2 条规则(`CG-001`/`CG-002`)。Stage 1 没有数据流分析,因此内联的 `db.Query(fmt.Sprintf(...))` / `executeQuery(String.format(...))` 可能会同时报告外部调用和内部格式化调用 - `config.output.format` 已定义,但 scan 命令的 CLI 默认设置仍倾向于使用 text,除非显式提供 `--output` - 修复建议仅供参考;CLI 不会自动重写文件 ## 文档 - [docs/README.md](./docs/README.md) — 文档入口、术语指南和推荐阅读顺序 - [ARCHITECTURE.md](./ARCHITECTURE.md) — 当前实现架构 - [docs/design/core-modules.md](./docs/design/core-modules.md) — 当前代码库的逐模块解析 - [docs/design/TECHNICAL-SUMMARY.md](./docs/design/TECHNICAL-SUMMARY.md) — 实现状态、验证情况和下一步优先级 - [docs/design/CONFIGURATION.md](./docs/design/CONFIGURATION.md) — 配置模型、默认值、环境变量覆盖和 runtime 消耗边界 - [docs/design/RULES.md](./docs/design/RULES.md) — 当前内置 + 自定义规则加载行为、规则行为及已知限制 - [docs/design/REPORTING.md](./docs/design/REPORTING.md) — text / JSON / SARIF 输出行为及当前输出限制
标签:DLL 劫持, GitHub Action, IPv6支持, Petitpotam, 代码安全扫描, 多包管理, 大语言模型, 自动化攻击, 错误基检测, 静态代码分析