sameermohan-git/purplegate
GitHub: sameermohan-git/purplegate
面向 Agentic AI 应用的紫队 CI 安全门禁,在 PR 合并前自动拦截 Prompt 注入、密钥泄露、MCP 风险等 AI 原生与传统安全威胁。
Stars: 0 | Forks: 0
# purplegate — 阻止不安全的 Agentic-AI 合并
**Agentic 应用合并的代码经常会导致秘密泄露、缺少 RLS 或遭受 Prompt 注入攻击。**
**purplegate 在每个 PR 上运行红队探测和蓝队防御扫描 —— 并在这些有风险的合并发布前使构建失败。**
uses: sameermohan-git/purplegate@v0.1.0-alpha |
GHCR 镜像 →
|
快速入门 →
## 为什么选择 purplegate
Agentic-AI 应用是一类新的攻击面。传统的 SAST 会遗漏特定于 LLM 的漏洞(Prompt 注入、系统 Prompt 泄露、跨用户数据暴露)。传统的安全 Actions 会遗漏特定于 AI 的供应链(MCP 服务器、第三方 SDK、脆弱的语料库)。这两者你都需要。purplegate 就是这两者的结合。
- **🔴 红队** — 涵盖各类 Agentic 应用风险的八项探测:秘密、SAST、依赖项、IaC / RLS、工作流注入、**Prompt 注入**(隔离的 Claude 作为评判)、MCP 配置风险以及 HTTP 安全标头。
- **🔵 蓝队** — 一个防御扫描器,用于检测运行时防护措施(LLM Guard、Guardrails AI)、速率限制器和允许列表中的发现项 —— 然后针对已缓解的发现项**降低其严重性**。严重性绝不会高于红队的基线评估。
- **🟣 紫队门禁** — 一个 CI Action,一份 SARIF 报告。默认情况下,严重/高危发现会导致构建失败;中/低危仅作报告。完全可配置。
## 它能捕捉到什么(其他工具遗漏的)
| 类别 | 发现示例 | 工具 |
|---|---|---|
| LLM Prompt 注入 | 尽管有金融应用范围守卫,但仍回答了“特朗普是谁?” | 通过 promptfoo 隔离的 Claude 评判 |
| 系统 Prompt 泄露 | 攻击者通过精心构造的 Payload 提取应用的指令 | 相同的评判,3 次重复验证达成一致 |
| 跨用户数据泄露 | 应用在被询问时引用了另一用户的交易记录 | 紫队专用探测 |
| 缺少 Supabase RLS | `CREATE TABLE public.transactions` 未包含 `ENABLE ROW LEVEL SECURITY` | 自定义静态检查 |
| 工作流命令注入 | `run:` 步骤中的 `${{ github.event.issue.title }}` | 封装了 [zizmor](https://github.com/zizmorcore/zizmor) |
| Git 中的真实凭证 | 今天提交的一个真实 `sk_live_...` | [trufflehog](https://github.com/trufflesecurity/trufflehog) `--only-verified` |
| 存在漏洞的 MCP SDK | `mcp-remote` 固定版本 < 0.1.16 (CVE-2025-6514, CVSS 9.7), `@modelcontextprotocol/server-filesystem` < 2025.7.1 (CVE-2025-53109), `mcp` PyPI < 1.23.0 (CVE-2025-66416), 以及另外 7 个 | `src/probes/mcp.py` 中内置的 GHSA/NVD 咨询列表 |
| 通用建议泄露 | 来自一个本应只回答用户数据的金融应用的“RRSP 通常是有益的” | 评判标准 v1 |
每项发现都映射到 **OWASP LLM Top 10 v2025**、**OWASP Agentic 2026** 和 **MITRE ATLAS v5.4.0** —— 在 SARIF `ruleId` 中展示,以便 GitHub Code Scanning 及下游 SIEM 工具按框架进行过滤。
## 快速入门
```
# .github/workflows/security-audit.yml
name: Security Audit
on: [pull_request, workflow_dispatch]
permissions:
contents: read
security-events: write
pull-requests: write
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: step-security/harden-runner@
with: { egress-policy: audit }
- uses: actions/checkout@
with: { fetch-depth: 0, persist-credentials: false }
- uses: sameermohan-git/purplegate@v0.1.0-alpha.4 # or pin by 40-char commit SHA
with:
config: .purplegate/config.yml
fail-on: high
llm-provider: anthropic
llm-api-key: ${{ secrets.AUDIT_ANTHROPIC_KEY }}
target-url: ${{ secrets.STAGING_API_URL }}
# Optional: keep the JSON / SARIF / Markdown reports for offline analysis.
# purplegate writes them to /.purplegate-reports/ during the run.
- uses: actions/upload-artifact@
if: always()
with:
name: purplegate-reports
path: .purplegate-reports/
if-no-files-found: warn
```
然后添加 `.purplegate/config.yml` —— 完整架构请参见 [`docs/CONFIG.md`](docs/CONFIG.md)。完整演练请参见 [`docs/QUICKSTART.md`](docs/QUICKSTART.md)。
## 架构
```
┌─ Consumer repo ─────────────────────────┐
│ .purplegate/config.yml │
│ .purplegate/allowlist.yml │
│ .github/workflows/security-audit.yml ──┼─▶ purplegate Docker image
└─────────────────────────────────────────┘ │
▼
┌───────────────────────────────────────┐
│ Orchestrator │
│ ├─ secrets (gitleaks + th) │
│ ├─ sast (Semgrep + AST) │
│ ├─ deps (osv-scanner) │
│ ├─ iac (Checkov + RLS) │
│ ├─ workflows (zizmor) │
│ ├─ prompt_injection ──▶ isolated │
│ │ Claude judge│
│ ├─ mcp (static scan) │
│ ├─ sbom (Syft) │
│ └─ headers (httpx) │
├───────────────────────────────────────┤
│ Blue-team defense scanner │
│ (severity adjuster — never raises) │
├───────────────────────────────────────┤
│ Report (SARIF + Markdown + JSON) │
│ Gate (fail-on: critical / high / …) │
└───────────────────────────────────────┘
```
## 供应链安全态势
此工具最重要的特性是 **它不会成为它旨在防御的攻击载体**。使用者无需信任我们 —— 他们可以进行验证。
**目前已发布**(已在标签 `v0.1.0-alpha` 上验证,镜像摘要 [`sha256:27ab459c…`](https://github.com/sameermohan-git/purplegate/pkgs/container/purplegate))
- **多架构 Docker 镜像**(`linux/amd64` + `linux/arm64`)发布至 `ghcr.io/sameermohan-git/purplegate`。通过摘要固定版本:
uses: sameermohan-git/purplegate@v0.1.0-alpha # 标签可用,因为标签已签名
# 或者,用于直接使用镜像:
# docker pull ghcr.io/sameermohan-git/purplegate@sha256:27ab459c…
- 每个已发布镜像上的 **Cosign 无密钥签名**(Sigstore + Rekor 透明日志)。
- 通过 `actions/attest-build-provenance` 实现的 **SLSA Level 3 构建来源** —— 现在就可以验证:
gh attestation verify oci://ghcr.io/sameermohan-git/purplegate@sha256:27ab459c… \
--owner sameermohan-git
成功验证可证明该镜像是由 `github-hosted` 运行器上的提交 `fb19d953` 通过 `release.yml@refs/tags/v0.1.0-alpha` 构建的。
- 每次 GitHub 发布都附带 **SBOM(SPDX + CycloneDX)**,文件名为 `sbom.spdx.json` / `sbom.cdx.json`。
- **镜像内的每个扫描器二进制文件都固定到特定版本,并根据上游校验和(gitleaks、trufflehog、syft、actionlint)或任何人都可以复现的本地计算 SHA256(osv-scanner)进行 SHA256 验证**。Python 扫描器(semgrep、checkov、zizmor、pip-audit)通过隔离的 pipx 虚拟环境固定到确切的版本。
- **我们自身工作流中的每个第三方 `uses:` 都通过 40 字符的提交 SHA 固定** —— 从不使用标签。2025 年 3 月(tj-actions)和 2026 年 3 月(trivy-action)的事件教会了我们原因。
- [`LICENSE-3RD-PARTY.md`](LICENSE-3RD-PARTY.md) 中提供了每个捆绑二进制文件的 **许可证清单**,包括 AGPL-3.0 的 trufflehog 安全态势。
**v1.0 的强化目标**
- 强制要求 OSSF Scorecard ≥ 8/10 作为发布门禁。
- `main` 分支的保护要求签名提交 + 2 名审阅者。
- 将 Action 自身的 `uses:` 行迁移到最新的签名 SHA(Dependabot 目前正在提议这些更新)。
- **Scorecard ≥ 8/10** 目标;低于 7 将阻止发布。
- **首次使用前请验证:**
gh attestation verify oci://ghcr.io/sameermohan-git/purplegate:vX.Y.Z \
--repo sameermohan-git/purplegate
完整政策见 [`docs/SUPPLY_CHAIN.md`](docs/SUPPLY_CHAIN.md)。威胁模型见 [`THREAT_MODEL.md`](THREAT_MODEL.md)。
## 严重性与门禁
| 严重性 | 默认门禁 | 示例 |
|---|---|---|
| 🔴 严重 | **CI 失败** | 已验证的真实凭证 · 无 RLS 的公共表 · 工作流命令注入 · 存在漏洞的 MCP SDK · 已验证的系统 Prompt 提取 |
| 🟠 高危 | **CI 失败** | 无身份验证的路由 · 通用建议泄露 · CVE ≥ 7.0 · 缺少运行时 LLM 防护措施 |
| 🟡 中危 | 仅报告 | 缺少 CSP · 未固定的非 MCP 依赖项 |
| 🟢 低危 | 仅报告 | 欠佳的 Referrer-Policy |
通过 `fail-on:` 输入进行覆盖。允许列表条目需要填写原因、`acknowledged_by` 以及在 365 天内的 `expires` 有效期 —— 参见 [`docs/SUPPRESSIONS.md`](docs/SUPPRESSIONS.md)。
## 规避列表
已内置于工具中,因为供应链选择即是安全选择:
| 项目 | 原因 |
|---|---|
| `tj-actions/*` · `reviewdog/action-setup` / `-shellcheck` / `-staticcheck` / `-ast-grep` / `-typos` / `-composite-template` | CVE-2025-30066 / CVE-2025-30154(2025 年 3 月强制推送妥协事件) |
| `aquasecurity/trivy-action` **按标签引用** | 2026 年 3 月标签强制推送事件。Trivy 二进制文件本身没有问题;我们是直接从内置镜像中调用它的。 |
| `tfsec` | 已弃用,并入 Trivy —— 请使用 Checkov。 |
| `protectai/rebuff` | 于 2025 年 5 月归档。 |
| HarmBench / AdvBench 语料库 **在 CI 中** | 采用 MIT 许可证,但包含有害内容。 |
## 路线图
- [x] v0.1 — 脚手架:编排器 + 9 个探测 + 蓝队 + SARIF + 门禁
- [x] v0.2 — 37 项测试固件套件 + 自测 CI
- [ ] v0.3 — 固定 Dockerfile 二进制文件 + 已签名的 GHCR 镜像
- [ ] v0.4 — 带有 `owasp:llm` 预设 + Lakera Mosscap/Gandalf 语料库的 promptfoo 集成
- [ ] v0.5 — Checkov 接入 + 实时的 Supabase 目录漂移检查
- [ ] v0.6 — 面向使用者的 SARIF 抑制辅助工具
- [ ] v1.0 — 发布到 Marketplace,Scorecard ≥ 8,SLSA L3 已签名,文档完善
## 许可证
MIT。详见 [`LICENSE`](LICENSE)。
标签:Agentic AI, CI/CD安全, CISA项目, COSIGN, CycloneDX, DevSecOps, Docker, GitHub Action, IaC安全, Keyless签名, Llama, MCP安全, MITRE ATLAS, OWASP LLM Top 10, Python, RLS, SARIF, SAST, SBOM, Secrets检测, Sigstore, SLSA L3, SPDX, StruQ, TLS抓取, 上游代理, 人工智能安全, 合规性, 大模型安全, 安全合规, 安全网关, 安全防御评估, 工作流注入, 无后门, 智能体安全, 盲注攻击, 硬件无关, 紫队, 网络代理, 自动化安全扫描, 请求拦截, 足迹探测, 软件安全, 逆向工具, 静态应用安全测试