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, 代码安全, 图数据库, 漏洞枚举, 盲注攻击, 自动化攻击, 请求拦截, 错误基检测, 静态代码分析