NotChaosuu/vibecheck
GitHub: NotChaosuu/vibecheck
vibecheck 是一款用 Go 编写的静态安全扫描器,专注于检测 AI 生成 Web 应用中常见的安全配置缺陷和依赖漏洞。
Stars: 0 | Forks: 0
# vibecheck
**AI 编写了你的应用,同时也敞开了大门。**
一款专为 AI 生成 / "vibe-coded(凭感觉编码)" Web 应用设计的静态安全扫描工具。将其指向你自己的代码仓库,它会对代码库进行评分,列出每一项发现及其 `文件:行号` 和修复建议,并实时检查你的依赖项是否存在已知漏洞。只需一个二进制文件,没有运行时依赖,无需额外安装任何附属组件。
我们的切入点:AI 代码生成器构建的工具会以可预测的方式发生故障。它们会搭建出一个可用的功能,但将安全配置保留在不安全的默认状态——例如开放的 Firebase 规则、没有行级安全(Row Level Security)的 Supabase 表、保存了真实密钥的 `NEXT_PUBLIC_` 变量,或是带有凭证的通配符 CORS。通用的扫描器是数据流引擎,它们读取应用程序逻辑,但基本上会跳过这类声明式接口配置。vibecheck 则直击痛点。
```
$ vibecheck ./my-app
vibecheck ./my-app
Security grade: F (0/100)
Findings: 4 critical 5 high
Languages: JavaScript, Python
Frameworks: Firebase, Flask, Supabase
Files scanned: 7
CONFIRMED (5) structural, safe to act on
CRIT Subprocess spawned with shell=True
api/app.py:6 [command-shell-true]
fix: Pass an argument list and drop shell=True.
CRIT Firebase rules allow public read/write
firestore.rules:3 [firebase-rules-open]
match /{document=**} { allow read, write: if true; }
fix: Replace `if true` with `request.auth != null` plus per-document ownership checks.
CRIT Hardcoded Stripe secret key
server.js:5 [secret-stripe-secret-key]
fix: Move it to a server-only env var and roll the key in the Stripe dashboard.
CRIT Endpoint returns process environment
server.js:6 [env-dump-endpoint]
fix: Remove the debug route. Never return environment variables to a client.
HIGH CORS allows any origin with credentials
server.js:4 [cors-wildcard-credentials]
fix: Replace the wildcard with an explicit list of trusted origins.
REVIEW (4) heuristic, worth a look
HIGH Table created without Row Level Security
supabase/migrations/001_init.sql:1 [supabase-missing-rls]
fix: alter table messages enable row level security; then add per-user policies.
VULNERABLE DEPENDENCIES (2) via OSV.dev
HIGH jinja2@2.4.1 (PyPI)
PYSEC-2026-1475 Jinja sandbox breakout through indirect reference to format method fixed in 3.1.5
```
## 已确认 / 待复核 划分
每一项发现都会落入两个通道之一,而这种区分正是核心所在:
- **CONFIRMED(已确认)** —— 结构性事实。以 `sk_live_` 开头的字符串就是 Stripe 密钥;`allow read, write: if true` 就是开放规则;`shell=True` 就会运行 shell。这些都可以安全地直接处理。
- **REVIEW(待复核)** —— 启发式分析。“此 API 路由访问了数据库且没有 auth 守卫”或“此 SQL 由字符串拼接构建”*值得一看*,但它是否真的可被利用还需要你的亲眼确认。vibecheck 会如实说明,而不是妄下定论。
一个总是“狼来了”的扫描器最终会被无视。将两者区分开,意味着一条 CONFIRMED 的发现才具有真正的实际意义。
## 安装
```
go install github.com/NotChaosuu/vibecheck/cmd/vibecheck@latest
```
或者从源码构建:
```
git clone https://github.com/NotChaosuu/vibecheck.git
cd vibecheck
go build -o vibecheck ./cmd/vibecheck
```
需要 Go 1.22+。**零第三方依赖** —— 整个项目(包括 OSV client)全部使用标准库构建。一款不会反过来拖入庞大依赖树的安全工具。
## 用法
```
vibecheck # scan the current directory
vibecheck ./my-app # scan a specific path
vibecheck --json ./my-app # JSON for CI
vibecheck -v ./my-app # verbose: OWASP category + full explanation per finding
vibecheck --confirmed-only . # hide the review lane, show only structural findings
vibecheck --min-severity high . # only critical + high
vibecheck --no-sca . # skip the dependency check (code scan only)
vibecheck --offline . # never touch the network
vibecheck --exit-code . # exit non-zero on any confirmed critical/high (CI gate)
vibecheck --list # print the rule catalogue
```
## 它能捕获什么
**配置 / 框架错误配置**(通用扫描器遗漏的部分)
- 处于测试模式的 Firebase / Firestore / Storage 规则(`allow read, write: if true`)
- 创建时没有启用行级安全(Row Level Security)的 Supabase 表,以及显式的 `disable row level security`
- 在客户端可触及的代码中使用了 Supabase 的 `service_role` 密钥
- 宽松的 CORS:带有凭证的通配符源(在 Express / FastAPI / Flask 中,与顺序无关)
- 包含密钥的 `NEXT_PUBLIC_` / `VITE_` / `REACT_APP_` 变量(它们会被内联到浏览器 bundle 中)
- 未被 `.gitignore` 覆盖的 `.env` 文件
**密钥** —— 硬编码的 AWS、Google、Stripe、GitHub、OpenAI、Anthropic、Slack 密钥以及 PEM 私钥,通过其独特的前缀进行匹配,以将误报率保持在接近零的水平。
**注入与不安全的 sink** —— 通过字符串拼接构建的 SQL、`shell=True` 以及动态的 `exec`、对非字面量输入的 `eval`、`pickle.loads` / 不安全的 `yaml.load`、带有未净化值的 `dangerouslySetInnerHTML`。
**认证 / 加密** —— JWT `alg:none`、硬编码的 JWT 密钥、禁用签名验证、关闭 TLS 验证、弱哈希(MD5/SHA1)、遗留的 debug 模式、返回 `process.env` 的路由、访问数据但无 auth 守卫的 API 路由。
**易受攻击的依赖项** —— 解析 `package-lock.json`、`yarn.lock`、`requirements.txt`、`poetry.lock`、`Pipfile.lock` 和 `go.mod`,然后针对每个已解析的版本实时比对 [OSV.dev](https://osv.dev)。因为它是在扫描时进行查询,所以不需要在本地维护并更新漏洞数据库——它始终掌握着最新的安全公告,包括近期的供应链安全事件。
请参阅 [`docs/rules.md`](docs/rules.md) 获取包含严重程度以及“已确认/待复核”划分的完整规则目录。
## 语言
JavaScript、TypeScript、React、Next.js、Python、Go,以及 Firebase 规则文件和 SQL migrations。规则即是数据,因此添加一种语言或一项检查只需添加条目,无需重写引擎。
## 扫描你自己的代码
vibecheck 是一款防御性工具,用于审计你拥有或被授权审查的代码。它会读取文件,并且除非你传入 `--offline` / `--no-sca`,否则它只会将你的依赖项名称和版本发送到 OSV.dev——绝对不会发送你的源代码。在发布你的业余项目之前用它扫一扫,或者带上 `--exit-code` 将其置入 CI 作为一道把关卡。
## 评分机制如何运作
分数从 100 分开始,并会根据每项发现扣分(按严重程度加权),其中已确认(CONFIRMED)的发现比待复核(REVIEW)的发现扣分更多,而易受攻击的依赖项将按其严重程度等同于已确认的发现来计算。一旦出现单项被确认为严重(Critical)的发现,分数将被直接封顶,这样一份基本上干净的评分就无法掩盖那一个真正的漏洞。评级采用 A–F,其中 A 表示没有出现任何被确认的问题。
## 许可证
MIT。请参阅 [`LICENSE`](LICENSE)。
**Chaosuu** | 专注于反机器人系统与 Web/API 安全的独立研究。
- GitHub: [NotChaosuu](https://github.com/NotChaosuu)
- Telegram: [t.me/chaosuudev](https://t.me/chaosuudev)
- X: [@NotChaosuu](https://x.com/NotChaosuu)
其他工具: [akamaixray](https://github.com/NotChaosuu/akamaixray) · [apkxray](https://github.com/NotChaosuu/apkxray) · [wafprobe](https://github.com/NotChaosuu/wafprobe) · [authmap](https://github.com/NotChaosuu/authmap) · [tlsprint](https://github.com/NotChaosuu/tlsprint)
标签:AI代码审计, EVTX分析, Go, Ruby工具, 数据可视化, 日志审计, 逆向工具, 零依赖, 静态代码扫描