
빌드 파이프라인 보안 위험을 시연하기 위한 CI/CD 레드팀 프레임워크.
CI/CD 레드팀 프레임워크
메타스플로이트와 같지만, CI/CD 파이프라인용입니다.
BoostSecurity Labs에서 poutine 빌드 파이프라인 SAST 스캐너를 만든 팀이 제작했습니다.

경고: 이 도구는 승인된 보안 테스트 용도로만 사용하세요.
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+를 설치하고 dev 퀵스타트를 사용하세요:
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 환경 변수를 설정하여 비활성화할 수 있습니다.
Hosted Teamserver는 전용 호스트에서 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 러너에 전달되어 비콘, 명령 실행, 피벗을 수행하는 에이전트. |
| 브라우저 그래프 뷰 | Browser View | C2 팀서버가 /graph에서 제공하는 실시간 공격 그래프. |
| 모드 | 사용 시기 | 시작점 |
|---|
| Quickstart | 고정 릴리스에서 가장 빠른 첫 실행 | make quickstart |
| Dev Quickstart | 소스 트리에서 로컬 작업 | make dev-quickstart |
| Hosted Teamserver | 안정적인 도메인으로 실제 작전 실행 | 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, 이슈, 코멘트, LOTP, workflow dispatch - 복사 전용 및 수동 포함. 초안 PR 지원, 콜백 시 자동 종료, 서버 측 dispatch 사전 점검. |
| 주입 페이로드 | 8가지 주입 벡터(브랜치 이름, PR 제목/본문, 커밋 메시지, 이슈 제목/본문, github-script, bash run)에 대한 컨텍스트 인식 페이로드 생성, 제약 조건 인식 기술 포함. |
| LOTP | Living Off The Pipeline 카탈로그: 15개 빌드 도구(npm, pip, cargo, make, docker, gradle, maven 등)와 설치/빌드/테스트 중 코드 실행을 위한 설정 파일 페이로드. |
| 캐시 포이즈닝 | Writer/victim 분류, 정확한 캐시 키 예측, Actions Cache API를 통한 아카이브 스테이징. 임플란트 장착을 위한 마법사 기반 흐름. |
| 토큰 열거 | API 엔드포인트에 대해 GitHub 토큰을 프로브하여 10개 권한 범위 열거, 토큰 유형 식별, 접근 가능한 리포지토리 및 조직 나열. |
| 클라우드 피벗 | AWS(sts:AssumeRoleWithWebIdentity), GCP(Workload Identity Federation), Azure(AAD), Kubernetes에 대한 OIDC 토큰 교환. 피벗 후 리소스 열거. |
| 클라우드 셸 | cloud shell(사전 구성된 gcloud/aws/az), cloud export, 공급자 빠른 확인을 통한 지속적인 로컬 세션. |
| SSH 피벗 | 리포지토리에서 SSH 배포 키 접근(읽기/쓰기) 프로브, ssh shell with temporary agent, 확인된 접근을 그래프에 유지. |
| GitHub 피벗 | pivot github for repo discovery, pivot app for GitHub App PEM-to-installation-token exchange. 발견된 리포지토리는 자동으로 분석 대기열에 추가. |
| 공격 그래프 | 조직/리포지토리/워크플로/작업/취약점/토큰/클라우드 노드가 있는 지속적인 방향 그래프(BBolt). /graph에서 실시간 Cytoscape.js 브라우저 시각화. |
| 운영자 TUI | 단계 인식 워크플로, 7단계 설정 마법사, 공격 트리 탐색, 익스플로잇 마법사, 전리품 저장소, 옴니박스 검색, 탭 완성, OSC 8 하이퍼링크. |
| 팀서버 | SSH 또는 토큰 인증, NATS JetStream 메시지 버스, GitHub API 프록시(토큰은 서버 측에 유지), 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) |