
DevOps에서 MLOps 인프라로 이어지는 공격 경로를 매핑하는 BloodHound용 OpenGraph 수집기로, CI/CD 파이프라인, 서비스 주체 및 ML 플랫폼 리소스를 수집하여 측면 이동 분석을 수행합니다.
BloodHound를 위한 개념 증명 OpenGraph 수집기로, DevOps에서 MLOps 인프라로 이어지는 공격 경로를 매핑합니다.
Brett Hawkins(@h4wkst3r)의 Pipelines of Privilege: Attack Paths from DevOps to MLOps Infrastructure를 기반으로 합니다.
Dop2Mop은 DevOps 및 MLOps 플랫폼에서 데이터를 수집하여 CI/CD 파이프라인에서 기계 학습 훈련 인프라로의 측면 이동을 가능하게 하는 공격 경로를 식별합니다. 시각화 및 분석을 위해 BloodHound와 호환되는 OpenGraph JSON을 출력합니다.
| DevOps 플랫폼 | MLOps 플랫폼 | ID 공급자 |
|---|---|---|
| GitHub (Actions, Repos, Secrets) | Azure Machine Learning | Azure AD Service Principals |
| Azure DevOps (Pipelines, Service Connections) | Amazon SageMaker | AWS IAM Roles OIDC/Federated Identity |
Dop2Mop은 연구에서 식별된 다섯 가지 중요한 신뢰 경계를 모델링합니다:
git clone https://github.com/h4wkst3r/dop2mop.git cd dop2mop pip install -r requirements.txt pip install -e .
## 수집되는 정보
각 수집기는 플랫폼별 리소스를 수집하고 그들 사이의 신뢰 경계를 매핑합니다:
| 수집기 | 수집된 리소스 |
|-----------|-------------------|
| **GitHub** | 조직, 리포지토리, 워크플로우, 시크릿, 브랜치 보호 규칙, OIDC 구성, 컨테이너 이미지 참조, S3 버킷 참조 |
| **Azure DevOps** | 조직, 프로젝트, 파이프라인 (YAML), 서비스 연결 (범위 세부 정보 포함), 변수 그룹, 에이전트 풀, 리포지토리 |
| **Azure ML** | 작업 영역, 컴퓨트 클러스터/인스턴스, 데이터 저장소, ML 환경, 등록된 모델, 작업/실험, 온라인 및 배치 엔드포인트 |
| **SageMaker** | 훈련 작업, 모델, 엔드포인트, 도메인, 노트북 인스턴스, IAM 실행 역할 (정책 분석 포함), ECR 리포지토리/이미지, S3 버킷 (ML 관련으로 필터링됨) |
## 빠른 시작
### 데모 데이터 생성
Dop2Mop을 실제로 확인하는 가장 빠른 방법은 연구에서 나온 공격 시나리오를 보여주는 데모 데이터를 생성하는 것입니다:```bash
dop2mop demo -o demo.json
MATCH (n:Group {name: "DOMAIN [email protected]"})
CALL {
WITH n
OPTIONAL MATCH (n)-[:MemberOf]->(g:Group)
RETURN collect(g.name) AS groupMembership
}
CALL {
WITH n
OPTIONAL MATCH (n)-[:AdminTo]->(c:Computer)
RETURN collect(c.name) AS adminTo
}
CALL {
WITH n
OPTIONAL MATCH (n)-[:HasSession]->(c:Computer)
RETURN collect(c.name) AS hasSession
}
RETURN n.name AS groupName, groupMembership, adminTo, hasSession
``````cypher
// Azure DevOps to Azure ML Lateral Movement
MATCH p=(repo)-[:TriggersPipeline]->(pipeline)-[:UsesServiceConnection]->(svcconn)-[:AuthenticatesAs]->(workspace)-[:CodeExecution]->(compute)
RETURN p
// Container Image Poisoning (Supply Chain Attack)
MATCH p=(workflow)-[:CanPoisonImage]->(image)<-[:PullsImage]-(job)
RETURN p
// OIDC/Federated Identity Abuse (confirmed edges)
MATCH p=(workflow)-[:OIDCTrust]->(oidc)-[:CanAssumeRole]->(role)-[:SubmitsJob]->(job)
RETURN p
// OIDC abuse including inferred paths
MATCH p=(workflow)-[:OIDCTrust]->(oidc)-[:InferredCanAssumeRole]->(role)
RETURN p
// Dataset Poisoning via Pickle Deserialization
MATCH p=(workflow)-[:CanPoisonDataset]->(dataset)<-[:LoadsDataset]-(job)
RETURN p
// Find repos with weak/no branch protection (TB1 exploitable)
MATCH (repo)-[:BypassesProtection]->(repo)
RETURN repo.name, repo.default_branch
// Find overprivileged SageMaker IAM roles
MATCH (role:IAMRole) WHERE role.is_admin = true OR role.has_s3_full_access = true
RETURN role.name, role.attached_policies
// Find SageMaker notebooks with root + internet access
MATCH (nb:SMNotebook) WHERE nb.root_access = 'Enabled' AND nb.direct_internet_access = 'Enabled'
RETURN nb.name, nb.status
// Find self-hosted ADO agent pools
MATCH (agent:ADOAgent) WHERE agent.is_hosted = false
RETURN agent.name, agent.pool_type
매번 실행할 때마다 자격 증명을 전달하는 대신, 설정 파일에 저장할 수 있습니다. 포함된 예제를 복사하여 값을 입력하세요:```bash cp dop2mop.yaml.example dop2mop.yaml
Dop2Mop은 다음 위치를 순서대로 확인합니다:
1. `--config`로 지정된 경로
2. 현재 디렉토리의 `dop2mop.yaml` / `dop2mop.yml` / `.dop2mop.yaml`
3. `~/.dop2mop.yaml`
> **참고:** `dop2mop.yaml`은 실수로 자격 증명을 커밋하는 것을 방지하기 위해 `.gitignore`에 있습니다. 예제 파일(`dop2mop.yaml.example`)은 커밋해도 안전합니다.
모든 옵션과 설명은 [dop2mop.yaml.example](https://github.com/h4wkst3r/dop2mop/blob/main/dop2mop.yaml.example)을 참조하세요.
**우선순위:** CLI 인수 > 구성 파일 > 환경 변수.
### 자격 증명 검증
전체 수집을 실행하기 전에 자격 증명을 테스트하세요:```bash
# Validate all configured collectors
dop2mop collect --validate -v
# Validate specific collectors
dop2mop collect --validate --collectors github,sagemaker -v
이는 각 플랫폼에 대해 경량 API 호출을 수행하여 수집을 시작하기 전에 토큰이 유효한지 확인합니다.
--collectors와 함께 전체 클래스 이름 대신 짧은 이름을 사용할 수 있습니다:
| 별칭 | 수집기 |
|---|---|
github, gh | GitHubCollector |
ado, azuredevops, azure-devops | AzureDevOpsCollector |
azureml, azure-ml | AzureMLCollector |
sagemaker, sm | SageMakerCollector |
dop2mop collect --collectors GitHubCollector,SageMakerCollector dop2mop collect --collectors github,sagemaker dop2mop collect --collectors gh,sm
---
## CLI 참조
### 명령어 개요```
dop2mop <command> [options]
Commands:
collect Collect data from DevOps/MLOps platforms
demo Generate demo data with attack scenarios
| 옵션 | 설명 |
|---|---|
-v, --verbose | 자세한 출력 활성화 (INFO 수준 로깅) |
--debug | 디버그 출력 활성화 (DEBUG 수준 로깅) |
dop2mop collect구성된 DevOps 및 MLOps 플랫폼에서 데이터를 수집합니다.```bash dop2mop collect [OPTIONS]
#### 일반 옵션
| 옵션 | 설명 |
|--------|-------------|
| `-o, --output FILE` | 출력 파일 경로 (기본값: `dop2mop_output.json`) |
| `--zip` | 출력을 ZIP 파일로 압축 |
| `--config FILE` | YAML/JSON 설정 파일 경로 |
| `--validate` | 수집 전 자격 증명 검증 |
| `--collectors LIST` | 쉼표로 구분된 수집기 또는 별칭 목록 (예: `github,sm`) |
| `--max-items N` | 유형별 최대 수집 항목 수 |
| `--no-secrets` | 비밀/자격 증명 열거 건너뛰기 |
#### GitHub 옵션
| 옵션 | 설명 |
|--------|-------------|
| `--github-token TOKEN` | GitHub 개인 액세스 토큰 |
| `--github-org ORG` | GitHub 조직 이름 |
| `--github-enterprise-url URL` | GitHub Enterprise Server URL |
#### Azure DevOps 옵션
| 옵션 | 설명 |
|--------|-------------|
| `--azure-devops-token TOKEN` | Azure DevOps 개인 액세스 토큰 (PAT) |
| `--azure-devops-access-token TOKEN` | Azure DevOps 액세스 토큰 (Bearer 인증, 선택 사항) |
| `--azure-devops-org ORG` | Azure DevOps 조직 이름 |