odbd/oh-my-audit-free

GitHub: odbd/oh-my-audit-free

一款本地优先的安全扫描工具,整合多种扫描器并针对 AI 生成代码和个人数据提供专项检测,在代码不离开本机的前提下完成安全审计。

Stars: 0 | Forks: 0

# oh-my-audit (免费引擎 + CLI) **[ohmyaudit.app](https://ohmyaudit.app)** 背后的开源安全扫描引擎和 CLI。 将其指向代码库;它会运行 [gitleaks](https://github.com/gitleaks/gitleaks) (已提交的密钥)、[semgrep](https://semgrep.dev) (SAST) 以及 [osv-scanner](https://github.com/google/osv-scanner) (存在漏洞的依赖项), 并融入为 **AI 生成的代码**和**个人数据**构建的检查, 最后返回一个 **0–100 的安全评分**,以及**去重且具有可操作性的审计结果** —— 每个结果都包含其位置以及修复建议。 它**完全在本地**运行。没有数据库,没有云,不上传密钥,没有遥测 —— 它只通过 shell 调用这三个扫描器的 CLI。你的代码不会离开 你的机器。核心就在于此:你不必为了获取安全诊断 而将私有源代码交给陌生人。 ## 为什么它是开源的 大多数人(理所当然地)不愿意将源代码上传到他们无法 检查的扫描器中。因此,生成**免费** oh-my-audit 报告的引擎在 **AGPL-3.0** 协议下开源 —— 你可以自己运行它,确切地阅读它的功能,并信任其 方法论。托管服务则增加了本地运行无法提供的功能:可共享、 已签名的**验证报告/徽章**、历史记录、持续监控和团队协作。 ## 安装与运行 无需 npm registry —— 使用 Docker、GitHub Action,或者直接从 仓库通过 `npx` 运行。(发布到 npm 是可选的;以下所有操作在没有它的情况下均可 正常运行。) ### Docker(推荐 —— 内置扫描器,零配置) ``` docker run --rm -v "$PWD:/src" ghcr.io/odbd/oh-my-audit-free scan /src docker run --rm -v "$PWD:/src" ghcr.io/odbd/oh-my-audit-free scan /src --sarif > results.sarif ``` 该镜像以 root 身份运行,以便 GitHub Action 能够写入 runner 的 工作空间。如果直接运行,请降权 —— 因为扫描器会解析不受信任的代码: ``` docker run --rm --user "$(id -u):$(id -g)" -v "$PWD:/src" \ ghcr.io/odbd/oh-my-audit-free scan /src ``` ### npx,直接从 GitHub 运行 (Node ≥ 20;需要 PATH 中包含扫描器的 CLI) ``` npx github:odbd/oh-my-audit-free scan ./ # pretty report npx github:odbd/oh-my-audit-free scan ./ --json # full JSON npx github:odbd/oh-my-audit-free scan ./ --sarif > results.sarif npx github:odbd/oh-my-audit-free scan ./ --markdown > report.md npx github:odbd/oh-my-audit-free scan ./ --fail-on high # exit 1 on any high+ (CI) ``` 安装扫描器:`gitleaks`, `semgrep`, `osv-scanner`。如果缺少扫描器,它们会被 跳过(启发式检查仍会运行) —— 或者使用 Docker 镜像,其中已内置这些工具。 ### GitHub Action ``` # .github/workflows/security.yml name: security on: [push, pull_request] jobs: scan: runs-on: ubuntu-latest permissions: security-events: write # to upload SARIF to code scanning steps: - uses: actions/checkout@v4 - uses: odbd/oh-my-audit-free@v1 with: path: . format: sarif output: results.sarif - uses: github/codeql-action/upload-sarif@v3 with: sarif_file: results.sarif ``` 扫描结果将出现在你仓库的 **Security → Code scanning** 标签页中。你的代码永远不会 离开 runner,也不涉及任何应用安装或仓库访问授权 —— 扫描完全在你自己的 CI 任务内部进行。 ### 作为 pre-merge 门禁,并将报告显示在任务摘要中 ``` - uses: odbd/oh-my-audit-free@v1 with: format: markdown output: report.md fail-on: critical # block the merge only on critical findings - run: cat report.md >> "$GITHUB_STEP_SUMMARY" if: always() ``` 推荐将 `fail-on: critical` 作为起点。基于 `high` 进行门禁拦截往往会导致 该检查在第一周就被禁用;建议从严格但范围狭窄的设置开始,之后再逐步收紧。 ## 选项 | 标志 | 含义 | |------|---------| | `--json` | 完整的 JSON 结果 | | `--sarif` | SARIF 2.1.0 (GitHub code scanning / CI) | | `--markdown` | 用于 CI 任务摘要 / PR 评论的 Markdown 报告 | | `--fail-on ` | 如果任何审计结果 ≥ `critical\|high\|medium\|low`,则以状态码 1 退出 | | `--registry-check` | 验证直接依赖是否存在于 npmjs.org 上(**唯一的网络调用**;需手动开启) | | `--no-semgrep` / `--no-gitleaks` / `--no-osv` | 跳过某个扫描器 | ## 作为库使用 ``` import { runOptionalExternalScans, analyzeScoreFiles } from "oh-my-audit"; const files = [{ path: "app.js", content: "..." }]; const external = await runOptionalExternalScans(files, process.env, {}); const result = analyzeScoreFiles(files, external); console.log(result.score, result.internalFindings); ``` ## 针对 AI 生成代码的检查 使用 AI 助手快速迭代开发会带来一种特定的失败模式:代码 能够运行,但缺乏安全边界。以下规则正是针对这一问题: | 规则 | 捕捉目标 | |------|-----------------| | `ai.client-exposure` | 带有 `dangerouslyAllowBrowser` 的 LLM 客户端,或 provider 密钥位于客户端打包的环境前缀(`NEXT_PUBLIC_`, `VITE_`, …)之后 | | `ai.mcp-config` | 硬编码在 MCP 服务器配置中的凭证 | | `ai.prompt-injection` | 请求输入被直接拼接到 prompt 中 | | `dependency.registry-missing` | 在 registry 上无法解析的直接依赖 —— “slopsquatting”(需手动开启,要求使用 `--registry-check`) | | 密钥检测器 | OpenAI, Anthropic, Hugging Face, Groq, Replicate, OpenRouter, Google 等 provider 的密钥,以及 AWS/GitHub/Stripe 密钥 | ## 针对个人数据 (PII) 的检查 | 规则 | 捕捉目标 | |------|-----------------| | `pii.committed-identifier` | 韩国居民身份证号 `주민등록번호`(已通过官方加权校验和验证,因此任意的 13 位数字不会触发误报)以及符合 Luhn 算法验证的银行卡号 | | `pii.llm-egress` | 在没有脱敏步骤的情况下直接传输给 LLM provider 的个人数据 | | `pii.third-party-egress` | 针对分析 SDK 和外部 HTTPS 请求的同类数据暴露模式 | | `pii.log-exposure` | 被写入到日志中的敏感标识符 | 字段检测覆盖韩文和英文姓名(`주민등록번호`, `계좌번호`, `rrn`, `account_number`, …)。联系级别的字段(姓名 / 电话 / 邮箱 / 地址)需要包含两种不同类型的信息才会被上报,因为配置文件中的技术支持 邮箱并不构成隐私事件。**匹配到的值永远不会被 打印、存储或传输** —— 审计结果仅包含数量和位置。 这些是技术层面的措施,**而非合规性判定**。在特定的隐私法律下,假名化 是否充分属于法律判断,而非 扫描器能够断言的事情。 ## 覆盖范围(及局限性) 自动检查涵盖**密钥泄露**、**存在漏洞的依赖项**、 **常见代码级安全问题** (SAST)、**AI 代码模式**以及 **个人数据处理**。它*不是*手动渗透测试,也不 涵盖业务逻辑、基础设施或运行时配置。自动化分析可能 包含误报 —— 请在采取行动前进行核实。 通过在仓库根目录下创建 `.oh-my-audit-ignore` 文件来屏蔽审计结果。每行一条规则,以空格分隔的 `key=value` 键值对形式(值不能包含空格);每条 规则至少需要一个选择器(`id`, `rule`, `source`, `category`, `severity`, `path`): ``` # 合成 fixtures,非真实个人数据 id=pii.committed-identifier path=fixtures/ # 整个目录 category=upload path=examples/** # time-boxed:在此日期前忽略,之后恢复生效 id=ai.prompt-injection path=src/experimental/ expires=2026-12-31 ``` 默认情况下,`path` 匹配的是子字符串;`dir/**` 匹配前缀,而 `**/name.ts` 匹配后缀。对于多词原因,请改用 JSON 格式: ``` { "ignore": [{ "id": "pii.committed-identifier", "path": "fixtures/", "reason": "synthetic test data" }] } ``` ## 许可证 [AGPL-3.0-only](./LICENSE)。可自由使用、修改和自托管。如果你将 修改后的版本作为网络服务提供,则必须以相同的 许可证发布你的修改。
标签:AI代码审计, MITM代理, SAST, 代码安全, 图数据库, 漏洞枚举, 盲注攻击, 自动化攻击, 请求拦截, 错误基检测, 静态代码分析