TreRB/vercel-env-audit
GitHub: TreRB/vercel-env-audit
针对 2026 年 4 月 Vercel 安全事件的响应式审计工具,用于检测未标记为 Sensitive 的环境变量。
Stars: 0 | Forks: 0
# @valtik/vercel-env-audit
审计 Vercel 团队中的每一个环境变量,并标记未
标记为 **Sensitive** 的变量。这是针对
[2026 年 4 月 Vercel 安全事件](https://valtikstudios.com/blog/vercel-april-2026-security-incident-runbook)
暴露路径的响应式修复,该路径会导致明文环境变量通过受损的构建/运行时路径泄露。
## 安装
```
npx @valtik/vercel-env-audit --help
```
或全局安装:
```
npm i -g @valtik/vercel-env-audit
vercel-env-audit --help
```
需要 Node.js **20+**(使用内置的 `fetch`)。
## 用法
```
# 显式提供令牌
vercel-env-audit --token "$VERCEL_TOKEN"
# 或通过环境变量
VERCEL_TOKEN=xxxxx vercel-env-audit
# 限制特定项目(可重复)
vercel-env-audit --project my-app --project marketing-site
# 用于 CI 的机器可读输出
vercel-env-audit --json > audit.json
# 如果发现任何非敏感密钥则构建失败
vercel-env-audit --fail-on-warn
```
### 选项
| 标志 | 说明 |
| --- | --- |
| `--token ` | Vercel API 令牌。默认使用 `VERCEL_TOKEN`。 |
| `--team ` | 要审计的团队 ID。默认从 `user.defaultTeamId` 自动检测。 |
| `--project ` | 限制到单个项目。可重复使用。 |
| `--json` | 输出机器可读的 JSON(不显示表格)。 |
| `--fail-on-warn` | 如果发现任何非 Sensitive 变量,即使风险为中等也退出 1。 |
| `--verbose` | 向标准错误输出额外进度日志。 |
| `--help` | 显示帮助并退出。 |
### 退出码
| 代码 | 含义 |
| --- | --- |
| `0` | 正常 — 未发现 HIGH 风险项。 |
| `1` | 至少发现一个 HIGH 风险项,或触发了 `--fail-on-warn`。 |
| `2` | API 错误或参数错误。可能会输出部分结果。 |
## 风险分类方式
每个环境变量会被归入三个风险等级之一。
| 风险 | 标准 |
| --- | --- |
| **HIGH** | 键名匹配敏感模式(`API_KEY`、`SECRET`、`TOKEN`、`PASSWORD`、`PRIVATE_KEY`、`AUTH`、`CREDENTIAL`、`DATABASE_URL`、`CONNECTION_STRING`、`_PAT`、`SIGNING_KEY`)**且** `type !== "sensitive"` **且** 不是 `NEXT_PUBLIC_*`。 |
| **MEDIUM** | `type !== "sensitive"`,但键名不匹配已知敏感模式。仍有审查价值。 |
| **LOW** | `type === "sensitive"` **或** 键名为 `NEXT_PUBLIC_*`(按设计为公开)。 |
## 示例输出
```
VERCEL ENVIRONMENT VARIABLE AUDIT team_xxxxxxxxxxxx
┌──────────────────────┬────────────────────────────┬──────────────┬─────────┬──────┐
│ Project │ Var │ Env │ Sens. │ Risk │
├──────────────────────┼────────────────────────────┼──────────────┼─────────┼──────┤
│ valtik-studios-webs… │ RESEND_API_KEY │ production │ ✗ │ HIGH │
│ valtik-studios-webs… │ RESEND_FROM │ production │ ✗ │ MED │
│ valtik-studios-webs… │ CSRF_SECRET │ production │ ✓ │ LOW │
└──────────────────────┴────────────────────────────┴──────────────┴─────────┴──────┘
Summary: 12 env vars total
• 3 non-Sensitive (rotate + mark Sensitive)
• 1 HIGH risk secret exposed
• 11 MEDIUM risk
• 0 LOW risk
```
## JSON 输出结构
```
{
"tool": "@valtik/vercel-env-audit",
"version": "0.1.0",
"teamId": "team_xxx",
"summary": { "total": 12, "high": 1, "medium": 11, "low": 0, "nonSensitive": 3, "sensitive": 9 },
"findings": [
{
"project": "valtik-studios-website",
"projectId": "prj_xxx",
"key": "RESEND_API_KEY",
"target": "production",
"type": "encrypted",
"sensitive": false,
"risk": "high"
}
]
}
```
输出中**绝不包含**实际的值。仅包含键名、目标环境以及 Vercel 的 `type` 标志。
## 本工具不做什么
- 它**不会**解密任何环境变量的值。Vercel 请求会以 `decrypt=false` 发出。
- 它**不会**尝试利用配置错误。
- 它**不会**修改任何 Vercel 资源。100% 只读。
- 它**不会**向外部报告。请求仅发送到 `api.vercel.com`。
## CI 集成
将其添加到 GitHub Actions 步骤中,以在 PR 中引入未标记的密钥时失败:
```
- name: Vercel env audit
run: npx -y @valtik/vercel-env-audit --fail-on-warn
env:
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
```
## 上下文
由 [Valtik Studios](https://valtikstudios.com/open-source) 发布。完整的事故运行手册请参见
[Vercel 2026 年 4 月安全事件运行手册](https://valtikstudios.com/blog/vercel-april-2026-security-incident-runbook)。
## 许可证
MIT © 2026 Valtik Studios LLC
标签:API令牌, April 2026 Vercel 安全事件, CMS安全, Fail on warn, GNU通用公共许可证, HIGH, JavaScript, MITM代理, Node.js, OSV, Secret Management, SEO: Vercel 安全, SEO: 密钥泄漏, SEO: 构建安全, SEO: 环境变量审计, Vercel, 二进制发布, 对称加密, 开源工具, 敏感信息, 构建安全, 泄露防护, 环境变量, 自动化审计, 自定义脚本, 风险分级, 高危风险