一个用于演示构建管道安全风险的 CI/CD 红队框架。
CI/CD 红队框架
像 Metasploit,但用于 CI/CD 管道。
来自 poutine 构建管道 SAST 扫描器的制造者,BoostSecurity Labs。

警告:此工具仅用于授权的安全测试。
SmokedMeat 的存在是因为 CI/CD 管道威胁被严重低估。传统安全培训很少涵盖供应链攻击,导致防御者面对攻击者积极利用的技术毫无准备。
我们构建此工具是为了让安全团队能够通过逼真的红队演练,学习、实践并验证针对高级 CI/CD 攻击技术的防御措施。
仅对你拥有或获得明确书面许可的系统使用。
SmokedMeat 是一个面向 CI/CD 管道的后利用框架。将其指向一个 GitHub 组织,让它发现易受攻击的工作流,将植入体部署到被攻陷的运行器上,然后通过云提供商横向移动、提取密钥、绘制爆炸半径——全部在终端 UI 中完成。
它能做什么:
理念: 大胆且嘈杂。这不是 EDR 规避工具。它是一个演示框架,展示在触发任何告警之前,CI/CD 被攻陷的程度有多深。
适用人群:
要首次尝试 SmokedMeat,安装 Docker 和 make。不需要 Go。
git clone https://github.com/boostsecurityio/smokedmeat.git
cd smokedmeat
make quickstart
make quickstart 是推荐的首次运行。它会启动本地稳定版快速开始栈,并针对本地 C2 团队服务器(Kitchen)启动操作员 TUI(Counter)。
推荐的首次运行:
whoolipublic_repo 范围的经典 PAT⚠ 建议使用经典 PAT。细粒度 PAT 可能过于严格,可能会阻止测试其他组织中的公开目标,包括 whooli。
whooli 是 SmokedMeat 故意配置为易受攻击的 CI/CD 攻击演练场。它是公开路径下的推荐首个目标。
设置向导会引导你完成:
repo 范围。whooli 或你自己的组织/仓库完整挑战流程请参阅 whooli 指南,或直接访问 whooli GitHub 组织。
完成后:
make quickstart-down # 停止容器
make quickstart-purge # 停止并删除所有数据
如果你想从源代码工作,请参阅 开发。
如果你正在贡献或在本地迭代源代码树,安装 Go 1.26+ 并使用开发快速开始:
make dev-quickstart
make dev-quickstart 会构建本地 smokedmeat-cloud-shell 镜像,启动 cloudflared、nats 和 C2 团队服务器(Kitchen),然后从源代码启动操作员 TUI。
如果你想要先启动基础设施,稍后启动操作员 TUI:
make dev-quickstart-up
make dev-quickstart-counter
完成后:
make dev-quickstart-down # 停止容器
make dev-quickstart-purge # 停止并删除所有数据
更多部署模式和本地开发细节请参阅 docs/deployment.md。
Counter 会在启动时检查是否有更新的 SmokedMeat 版本。可以通过设置环境变量 SMOKEDMEAT_DISABLE_VERSION_CHECK 来禁用。
托管团队服务器将 C2 团队服务器运行在专用主机上,操作员 TUI 则原生运行在每个操作员工作站上。
从高层次看,操作员 TUI(Counter)与 C2 团队服务器(Kitchen)通信,团队服务器管理运行在被攻陷 CI 运行器上的植入体(Brisket),并提供实时攻击图。
┌──────────────┐
│ SSH AGENT │
│ (Auth) │
└──────┬───────┘
│
▼
┌──────────────┐ ┌──────────────┐
│ THE COUNTER │ ───────────────▶│ THE KITCHEN │
│ (Operator) │ WebSocket │ (Teamserver) │
│ Bubbletea │◀─────────────── │ │
│ TUI │ Events/Graph │ ┌──────────┐ │
└──────────────┘ │ │ Database │ │
│ └──────────┘ │
┌──────────────┐ │ │
│ BROWSER │ ───────────────▶│ │
│ Graph View │ WebSocket │ │
│ Visualizer │◀─────────────── │ │
└──────────────┘ Live Updates └──────────────┘
│ ▲
│ │
Creates PR │ │ Stager fetches implant binary
│ │ Implant HTTP Beacon/Commands
▼ │
┌────────────────────────────────────────────┴──────────────────────────────────┐
│ GITHUB.COM │
│ │
│ ┌─────────────────────┐ ┌─────────────────────────────────────────┐ │
│ │ Malicious PR │ triggers │ GitHub Actions Runner │ │
│ │ (Vulnerable │─────────▶│ │ │
│ │ Workflow) │ │ ┌────────────┐ ┌────────────────┐ │ │
│ └─────────────────────┘ │ │ Stager │─────▶│ THE BRISKET │ │ │
│ │ │ │ │ (Implant) │ │ │
│ │ └────────────┘ └────────────────┘ │ │
│ └─────────────────────────────────────────┘ │
└───────────────────────────────────────────────────────────────────────────────┘
完整细节见 docs/FEATURES.md。
make test # 单元测试
make lint # 代码检查
make e2e-smoke # 快速公开利用烟雾路径
make e2e-goat # 完整山羊链到云标志
SmokedMeat 建立在以下研究成果之上:
GNU Affero General Public License v3.0 — 详情见 LICENSE。
为希望理解攻击技术的防御者而构建。
| 标准术语 | SmokedMeat 名称 | 描述 |
|---|
| 操作员 TUI | Counter | 用于分析、载荷投递和后利用工作流的终端界面。 |
| C2 团队服务器 | Kitchen | 用于操作员会话、暂存器、回调和图形状态的 API 和 WebSocket 服务器。 |
| 植入体 | Brisket | 交付给被攻陷的 CI 运行器的代理,用于信标通信、命令执行和横向移动。 |
| 浏览器图形视图 | 浏览器视图 | 由 C2 团队服务器在 /graph 提供的实时攻击图。 |
| 模式 | 使用时机 | 入口点 |
|---|
| 快速开始 | 在固定版本上最快的首次运行 | make quickstart |
| 开发快速开始 | 在本地源代码树上工作 | make dev-quickstart |
| 托管团队服务器 | 运行真实演练,使用稳定域名 | docs/deployment.md |
| 类别 | 能力 |
|---|
| 侦察 | 自动检测 6 个 CI 平台(GitHub Actions、GitLab CI、Azure DevOps、CircleCI、Jenkins、Bitbucket)。分类密钥、探测 OIDC 可用性、收集运行器元数据。 |
| 密钥提取 | 通过 /proc 扫描 Runner.Worker 进程内存,恢复 GitHub 从日志中隐藏的未脱敏 secrets.*、vars.* 和 GITHUB_TOKEN 权限映射。 |
| 漏洞分析 | 嵌入式 poutine SAST,用于注入漏洞、危险触发器和工作流 if: 门分类。Gitleaks 深度扫描 git 历史中的私钥和 PAT。 |
| 投递 | 5 种自动化方法:PR、Issue、评论、LOTP、workflow dispatch——外加仅复制和手动。支持草稿 PR、回调自动关闭、服务器端投递预检。 |
| 注入载荷 | 针对 8 种注入向量(分支名称、PR 标题/正文、提交消息、Issue 标题/正文、github-script、bash run)的上下文感知载荷生成,采用约束感知技术。 |
| LOTP | 利用管道(Living Off The Pipeline)目录:15 种构建工具(npm、pip、cargo、make、docker、gradle、maven 等),以及用于在安装/构建/测试期间执行代码的配置文件载荷。 |
| 缓存投毒 | 写入者/受害者分类、精确缓存键预测、通过 Actions Cache API 进行存档暂存。向导驱动流程,带有植入体武装。 |
| Token 枚举 | 针对 API 端点探测 GitHub Token,枚举 10 个权限范围,识别 Token 类型,列出可访问的仓库和组织。 |
| 云横向移动 | OIDC Token 交换,用于 AWS(sts:AssumeRoleWithWebIdentity)、GCP(Workload Identity Federation)、Azure(AAD)和 Kubernetes。横向移动后资源枚举。 |
| 云 Shell | 持久的本地会话,支持 cloud shell(预配置的 gcloud/aws/az)、cloud export 和提供者快速检查。 |
| SSH 横向移动 | 探测仓库的 SSH 部署密钥访问权限(读/写),ssh shell 带有临时代理,确认的访问权限持久化到图形中。 |
| GitHub 横向移动 | pivot github 用于仓库发现,pivot app 用于 GitHub App PEM 到安装 Token 的交换。发现的仓库自动加入分析队列。 |
| 攻击图 | 持久化的有向图(BBolt),包含组织/仓库/工作流/任务/漏洞/Token/云节点。在 /graph 提供实时 Cytoscape.js 浏览器可视化。 |
| 操作员 TUI | 阶段感知工作流、7 步设置向导、攻击树导航、利用向导、战利品存储、全能搜索栏、Tab 补全、OSC 8 超链接。 |
| 团队服务器 | SSH 或 Token 认证、NATS JetStream 消息总线、GitHub API 代理(Token 保留在服务器端)、通过 Caddy 自动 TLS、操作历史。 |
| 层 | 技术 |
|---|
| 语言 | Go 1.26+ |
| TUI 框架 | Bubbletea v2 + Lipgloss v2 |
| TUI 布局 | Ultraviolet 布局 + ANSI 安全屏幕合成 |
| 消息总线 | NATS JetStream |
| 攻击图 | hmdsefi/gograph |
| 图可视化 | Cytoscape.js |
| 数据库 | BBolt |
| CI/CD 扫描器 | poutine(嵌入式) |
| 密钥扫描器 | gitleaks(嵌入式,自定义规则) |
| 运行器密钥提取 | gump(嵌入式,/proc 内存扫描) |
| 云 SDK | AWS SDK v2、Google Cloud、Azure SDK for Go |
| 反向代理 | Caddy(自动 TLS) |