dgenio/vibeguard

GitHub: dgenio/vibeguard

一个专为AI辅助编程(氛围编码)设计的确定性安全扫描工具,用于在代码合并与发布前检测密钥泄露、危险依赖和风险代码模式等特有问题。

Stars: 1 | Forks: 1

# VibeGuard **氛围编码软件的护栏。** [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/8b4789610f101545.svg)](https://github.com/dgenio/vibeguard/actions/workflows/ci.yml) [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/) [![许可证](https://img.shields.io/badge/license-Apache%202.0-green.svg)](LICENSE) ## 问题所在 人工智能编程工具让开发者能在数小时内完成过去需要数天的工作。这确实很棒。但是,不加审视地接受大型 AI 生成的代码差异,会产生传统安全工具无法捕捉的新型故障模式: - **意外提交的密钥** — API 密钥、令牌和数据库 URL 通过 AI 生成的配置文件混入其中 - **包发布泄露** — 源代码映射、`.env` 文件和测试夹具最终出现在 npm/PyPI 包中 - **依赖供应链风险** — AI 代理引入 git URL、拼写错误的包或宽泛的版本范围 - **安全控制绕过** — AI 注释掉认证检查或禁用 SSL 验证以"使程序运行" - **未经测试的风险代码变更** — 涉及认证、加密和数据库写入的巨大代码差异,且测试覆盖率为零 - **AI 痕迹** — 占位符凭证、`# TODO: implement real auth` 和 `信任所有证书` ## VibeGuard 为何存在 VibeGuard **不是**又一个 AI 包装器、SAST 扫描器或依赖检查器。 它是一个**快速、确定性的合并前安全关卡**,专为 AI 辅助编程("氛围编码")的故障模式而设计。它可在几秒钟内离线运行,无需 API 密钥。 可以将其视为介于"AI 生成了此代码差异"和"此代码差异进入生产环境"之间的检查点。 ## 它能捕获什么 | 类别 | 示例 | |---|---| | 🔑 **密钥** | AWS 密钥、GitHub 令牌、OpenAI 密钥、数据库 URL、私钥、`.env` 文件 | | 🗺️ **源代码映射** | `dist/` 中的 `.map` 文件、包中的 `sourceMappingURL`、发布映射的 npm 包 | | 📦 **打包泄露** | npm/PyPI 包中的 `.env`、`tests/`、`.github/`、源代码映射 | | 🔗 **依赖风险** | git/URL 依赖、拼写错误的包、未固定的版本(严格模式) | | ⚠️ **风险代码模式** | `eval/exec`、`shell=True`、`JWT verify=False`、CORS 通配符、`pickle.loads`、SQL 拼接 | | 🧪 **缺失测试** | 源代码更改但无对应的测试更改 | | 🤖 **AI 痕迹** | 占位符凭证、禁用的认证、信任所有证书、TODO 存根、临时绕过 | ## 快速开始 ``` pip install vibeguard-gate ``` 或从源代码安装: ``` git clone https://github.com/dgenio/vibeguard cd vibeguard pip install -e ".[dev]" ``` 初始化配置文件: ``` vibeguard init ``` 扫描目录: ``` vibeguard scan --path . ``` 为你的 CI 设置关卡(如果发现阻断性问题则退出码为 1): ``` vibeguard gate --diff --fail-on high ``` ## 30 秒内试用 此仓库附带了两个故意存在漏洞的示例包,包含伪造的 密钥,因此你无需将 VibeGuard 指向任何敏感内容即可看到一组 真实且有意义的结果: ``` git clone https://github.com/dgenio/vibeguard cd vibeguard pip install -e . vibeguard scan --path examples/vulnerable-node-package ``` 你应该会看到大约 16 个发现,涵盖密钥、源映射泄露、打包泄露、风险模式和 AI 痕迹——所有这些都不会触及网络或调用任何外部服务。尝试 `examples/vulnerable-python-package` 获取 Python 风格的版本。 要将 VibeGuard 用作 CI 关卡(在发现阻断性问题时退出非零码): ``` vibeguard gate --path examples/vulnerable-python-package --fail-on medium ``` 无需 API 密钥,无遥测,无网络调用。 想要看起来像真实 PR 而非"厨房水槽"式的演示变更?请查看 [`examples/pr-scenarios/`](examples/pr-scenarios) — 六个自包含的场景(禁用 TLS 以通过测试、临时认证绕过、打包泄露、提交的代理记忆、git URL 依赖、风险数据库写入),每个场景都附有确切的命令、预期发现和修复方法。 ## CLI 参考 ### `vibeguard init` 创建一个具有合理默认值的 `vibeguard.yaml` 配置文件。 ``` vibeguard init vibeguard init --path /path/to/repo ``` ### `vibeguard scan` 扫描仓库并打印发现结果。**总是退出码 0**(仅供参考)。 ``` vibeguard scan vibeguard scan --path . vibeguard scan --diff # only changed files (requires git) vibeguard scan --json # machine-readable output vibeguard scan --markdown # for PR comments vibeguard scan --verbose # detailed descriptions vibeguard scan --fail-on medium # set threshold (informational only) ``` ### `vibeguard gate` 与 `scan` 相同,但当发现数量达到或超过阈值时**退出码 1**。 ``` vibeguard gate --path . --fail-on high vibeguard gate --diff --fail-on medium ``` ### `vibeguard publish-check` 模拟 `npm publish` 或 `python -m build`,并在发布到注册表之前,根据已发布文件集中的发现设置关卡。 ``` vibeguard publish-check --path . vibeguard publish-check --ecosystem npm --manifest-out publish-manifest.json vibeguard publish-check --ecosystem python-sdist --fail-on medium ``` 完整指南、发现 ID 和 GitHub Actions 发布关卡模板,请参阅 [docs/pre-publish.md](docs/pre-publish.md)。 ### `vibeguard explain ` 打印某个发现的详细解释和修复指南。 ``` vibeguard explain SEC-ENV vibeguard explain MAP-DIST vibeguard explain TEST-MISSING ``` ## 示例输出 以下是此仓库上运行 `vibeguard scan --path examples/vulnerable-node-package` 的实际输出(如果规则变更,使用相同命令重新生成): ``` VibeGuard Findings ┏━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ Sev ┃ Rule ┃ Path ┃ Title ┃ ┡━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ ☠ CRITICAL │ secrets │ src/server.js:12 │ GitHub Token detected │ │ ✗ HIGH │ secrets │ .env │ Sensitive file committed: .env │ │ ✗ HIGH │ sourcemaps │ package.json │ package.json 'files' includes source maps │ │ ✗ HIGH │ packaging │ package.json │ npm package may publish Environment files (.env) │ │ ✗ HIGH │ packaging │ package.json │ npm package may publish Source map files │ │ ✗ HIGH │ dependencies │ package.json │ URL/git/path dependency: axios │ │ ✗ HIGH │ ai_footprints │ src/server.js:14 │ AI footprint: Security disabled in code │ │ ✗ HIGH │ ai_footprints │ src/server.js:31 │ AI footprint: Trust-all certificates │ │ ✗ HIGH │ auth │ src/server.js:16 │ Auth: Auth bypass TODO/FIXME/HACK comment │ │ ⚠ MEDIUM │ packaging │ .npmignore:8 │ Overly broad .npmignore negation: '!*' │ │ ⚠ MEDIUM │ risky_diff │ src/server.js:9 │ Risk-sensitive area changed: CORS configuration │ │ ⚠ MEDIUM │ risky_diff │ src/server.js:27 │ Risk-sensitive area changed: eval() or exec() usag │ │ ⚠ MEDIUM │ risky_diff │ src/server.js:32 │ Risk-sensitive area changed: Environment variable │ │ ⚠ MEDIUM │ ai_footprints │ src/server.js:17 │ AI footprint: Temporary security bypass or mock │ │ ↓ LOW │ packaging │ package.json │ package.json runs `prepare` at publish time │ │ ℹ INFO │ ai_footprints │ src/server.js:11 │ AI footprint: AI-generated code comment │ └────────────┴────────────────┴──────────────────────┴────────────────────────────────────────────────────┘ Scanned 5 file(s) • 16 finding(s) | critical: 1 high: 8 medium: 5 low: 1 info: 1 • policy: balanced ``` `vibeguard scan` 总是退出码 `0`(仅供参考)。`vibeguard gate` 运行相同的检查,但当发现数量达到或超过 `--fail-on` 设定的阈值时,退出码为 `1`: ``` vibeguard gate --path examples/vulnerable-node-package --fail-on high echo "exit: $?" # exit: 1 ``` ## 策略级别 | 策略 | 描述 | |---|---| | `relaxed` | 仅阻断性和高危发现 | | `balanced` | 高危 + 中危发现(默认) | | `strict` | 所有发现;未固定的依赖和缺失的测试会被提升等级 | 在 `vibeguard.yaml` 中设置: ``` policy: strict fail_on: medium ``` 或在命令行中覆盖: ``` vibeguard gate --fail-on medium ``` ## 配置 运行 `vibeguard init` 创建 `vibeguard.yaml`: ``` policy: balanced fail_on: high ignore: paths: - .git/ - node_modules/ - .venv/ - dist/ - build/ findings: [] # suppress specific finding IDs secrets: enabled: true min_entropy: 3.5 sourcemaps: enabled: true packaging: enabled: true dependencies: enabled: true # `risky_patterns:` tunes the `risky_diff` rule — the YAML section name and # the rule id differ for historical reasons. Use `vibeguard rules explain # ` to look up the config section for any rule. risky_patterns: enabled: true tests: enabled: true ai_footprints: enabled: true ``` ## GitHub Actions 使用方法 添加到你的拉取请求工作流: ``` name: VibeGuard on: [pull_request] jobs: vibeguard: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: actions/setup-python@v5 with: python-version: "3.11" - run: pip install vibeguard-gate - run: vibeguard gate --diff --fail-on high ``` 用于本地开发(发布到 PyPI 之前): ``` - run: pip install -e . - run: vibeguard gate --fail-on high ``` ## 规则快速参考 VibeGuard 内置 **13 条确定性规则**。每条规则会生成一个或多个 稳定的发现 ID,你可以用 `vibeguard explain ` 查看详情, 通过 `vibeguard.yaml` 抑制,或通过 `severity_overrides` 重映射。 | 规则 | 默认严重等级 | 检测内容 | |-------------------|------------------|---------------------------------------------------------------------------------------------------| | `secrets` | 高 | AWS 密钥、GitHub/OpenAI/Slack/Stripe 令牌、私钥、Bearer 令牌、硬编码密码、包含凭证的数据库 URL、已提交的 `.env` 文件。 | | `sourcemaps` | 高 | `dist/`/`build/` 中的 `.map` 文件、`sourceMappingURL` 注释、`package.json` 中包含源映射的 `files` 条目。 | | `packaging` | 中 | npm/PyPI 清单文件会发布 `.env`、测试、源映射、构建配置;宽泛的 `MANIFEST.in` 嫁接、`.npmignore` 否定项。 | | `dependencies` | 高 | git/URL/路径依赖、拼写错误启发式、宽泛版本范围、锁文件漂移、注册表变更。 | | `risky_diff` | 中 | 对风险敏感区域的更改(认证、加密、eval/exec、shell、网络、数据库写入、支付、CORS、JWT、证书)加上差异宽度/大小信号。 | | `auth` | 高 | 被注释掉的认证、JWT `alg=none`、硬编码管理员密码、`verify=False`、允许所有中间件、返回 `True`/`nil` 的认证函数。 | | `sql` | 高 | f-string / 拼接 / 模板字面量 / `fmt.Sprintf` 等可能存在注入风险的 SQL 构造方式。 | | `ai_footprints` | 中 | AI 生成注释、占位符凭证、信任所有证书、CORS 通配符、临时绕过、跳过验证、臆造的 TODO。 | | `agent_memory` | 高 | 意外提交的代理产物:SQLite 记忆数据库、JSONL 日志、转录记录、工具跟踪、隐藏的记忆目录。 | | `ci_docker` | 高 | 风险的 Dockerfile 和 GitHub Actions:特权容器、`latest` 标签、curl-pipe-bash、`pull_request_target`、宽泛权限、密钥回显、未版本控制的 Actions。 | | `iac` | 高 | Terraform:IAM 通配符、开放安全组、公共 S3、未加密资源。Kubernetes:特权容器、hostPath、root 用户、无 TLS、允许所有策略。 | | `go_rules` | 高 | Go 特定风险:TLS 绕过、shell 注入、CORS 通配符、通过 `Sprintf` 的 SQL、硬编码令牌、认证绕过注释、不安全的文件删除。 | | `tests` | 低 | 源代码文件已更改,但无任何对应的测试文件更改。 | 对于任何特定发现(例如 `vibeguard explain SEC-GITHUBTOKEN`),运行 `vibeguard explain ` 获取完整的修复指南。 `risky_diff` 本质上是一个**风险信号**,而非漏洞声明——它表示"人工请关注此处",而非"此处可被利用"。 ## VibeGuard 是/不是什么 **是:** - 一个确定性的、离线的合并前安全关卡,针对 AI 辅助编程大规模产生的各类错误。 - 一道快速的第一道防线——在典型的仓库上通常以个位数秒运行,适用于预提交钩子和 PR 关卡。 - 一个**无需 API 密钥、无网络调用、无遥测**,且不依赖任何 LLM 的工具。 **不是:** - 完整的 SAST 替代品(深度语义分析请使用 Semgrep、CodeQL、Bandit、ESLint 安全插件)。 - 针对已泄露凭证的密钥扫描替代品(针对完整 git 历史请使用 truffleHog 或 gitleaks)。 - 依赖漏洞扫描器(CVE 覆盖请使用 Dependabot、pip-audit、npm audit、Snyk)。 - 人工代码审查的替代品。 - 对代码安全或生产就绪的保证。 ### VibeGuard 与其他工具的定位 | 工具类别 | 擅长领域 | 对 AI 生成代码差异可能遗漏之处 | |-----------------------------------|------------------------------------------|------------------------------------------------------------| | **VibeGuard** | AI 编程故障模式的合并前关卡(新文件中的密钥、打包泄露、"信任所有证书"、注释掉的认证、风险差异信号)。 | 深度数据流分析、CVE 查询、历史泄露扫描。 | | 密钥扫描器 (gitleaks, truffleHog) | 广泛的模式覆盖;可扫描完整 git 历史。 | 即将被提交的 `.env` 文件;已暂存但尚未推送的新代码中的密钥。 | | SAST (Semgrep, CodeQL, Bandit) | 深度数据流分析;社区规则包。 | "AI 痕迹"模式(`# TODO: real auth`、`verify=False`、CORS 通配符)和打包清单卫生。 | | 依赖扫描器 (Dependabot, pip-audit, npm audit, Snyk) | 已知 CVE;传递漏洞覆盖。 | git/URL 依赖、拼写错误启发式、AI 提交引入的锁文件漂移。 | | 代码检查工具 (ruff, eslint) | 风格 + 简单正确性。 | 任何与安全相关的内容。 | 其意图是**补充**这些工具,而非替代。典型的 CI 流水线会将 VibeGuard 与上述每类工具中的一种一起运行。 有关更详细的按工具分类的指南——何时使用 VibeGuard 何时不使用,以及推荐的分层 CI 流水线——请参阅[工具比较指南](docs/comparison.md)。 ### 速度与误报 VibeGuard 附带了一份可重现的[基准测试与评估报告](docs/benchmark.md): 合成仓库的扫描吞吐量、跨 Node/Python/Go/Terraform 测试套件的检测,以及在干净代码上的**零阻断性误报**基线。你可以通过 `make bench` 和 `make bench-scenarios` 自行运行。 ## 生态系统 VibeGuard 是**完全独立的**。它不依赖任何外部服务、API 或兄弟项目进行运行时操作,并且从不回传数据。它唯一需要的是你指向它的差异或目录。 它被设计为通过标准、常规的接口——进程退出码、JSON 和 SARIF 报告以及编辑器诊断——*融入*更广泛的工具链,这样下游工具可以使用其发现,而无需与 VibeGuard 内部耦合。将这些输出视为集成接口:VibeGuard 完成其工作不需要任何下游组件,采用 VibeGuard 也绝不会强制你使用任何其他工具。 ## 贡献 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 了解本地设置、测试命令、分支和提交约定以及如何添加新规则。 有关安全漏洞披露,请参阅 [SECURITY.md](SECURITY.md) — 请勿就漏洞提交公开 Issue。 提交错误、功能请求、规则请求或误报?请使用 [Issue 表单](https://github.com/dgenio/vibeguard/issues/new/choose)。 - **[docs/rules.md](docs/rules.md)** — 自动生成的规则参考(运行 `make docs` 重新生成)。 - **[docs/how-to-add-a-rule.md](docs/how-to-add-a-rule.md)** — 添加内置规则的分步指南。 - **[docs/plugin-api.md](docs/plugin-api.md)** — 用于在自己的包中发布规则的公共插件 API。 - **[docs/policy-packs.md](docs/policy-packs.md)** — 内置策略包(`oss-library`、`web-app`、`strict-ci`)以及针对单体仓库的源测试映射。 - **[docs/pre-commit.md](docs/pre-commit.md)** — 通过 [pre-commit](https://pre-commit.com) 框架在本地运行 VibeGuard。 - **[docs/docker.md](docs/docker.md)** — 在任何 CI 环境中将 VibeGuard 作为容器运行。 ## 许可证 Apache 2.0 — 详见 [LICENSE](LICENSE)。
标签:AI代码安全, DevSecOps, Python, TLS抓取, 上游代理, 代码审查, 代码差异分析, 供应链风险, 依赖项安全, 包发布安全, 安全检查, 安全门控, 开源框架, 持续集成, 数据隔离, 无后门, 源代码扫描, 秘密管理, 结构化查询, 自动化安全, 软件安全, 逆向工具, 配置漂移, 预合并检查