OpenGraph 收集器,用于 BloodHound,可映射从 DevOps 到 MLOps 基础设施的攻击路径,收集 CI/CD 管道、服务主体和 ML 平台资源,以进行横向移动分析。
一个概念验证的OpenGraph收集器,用于BloodHound,映射从DevOps到MLOps基础设施的攻击路径。
基于Brett Hawkins(@h4wkst3r)的《从DevOps到MLOps基础设施的攻击路径:特权管道》。
Dop2Mop从DevOps和MLOps平台收集数据,以识别能够实现从CI/CD管道横向移动到机器学习训练基础设施的攻击路径。它输出兼容BloodHound的OpenGraph JSON,用于可视化和分析。
| DevOps平台 | MLOps平台 | 身份提供商 |
|---|---|---|
| GitHub(Actions、仓库、机密) | Azure机器学习 | Azure AD服务主体 |
| Azure DevOps(管道、服务连接) | Amazon SageMaker | AWS IAM角色 OIDC/联合身份 |
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
// 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
# Edit dop2mop.yaml with your credentials
Dop2Mop 按顺序检查以下位置:
--config 指定的路径dop2mop.yaml / dop2mop.yml / .dop2mop.yaml~/.dop2mop.yaml注意:
dop2mop.yaml已加入.gitignore,以防止意外提交凭据。示例文件 (dop2mop.yaml.example) 可安全提交。
请参阅 dop2mop.yaml.example 查看所有可用选项及注释。
优先级顺序: CLI 参数 > 配置文件 > 环境变量。
在运行完整收集之前,先测试凭据:```bash
dop2mop collect --validate -v
dop2mop collect --validate --collectors github,sagemaker -v
这会为每个平台进行轻量级 API 调用,以在开始收集前验证令牌是否有效。
### 收集器别名
你可以使用短名称代替完整的类名与 `--collectors` 参数配合使用:
| 别名 | 收集器 |
|-------|-----------|
| `github`, `gh` | GitHubCollector |
| `ado`, `azuredevops`, `azure-devops` | AzureDevOpsCollector |
| `azureml`, `azure-ml` | AzureMLCollector |
| `sagemaker`, `sm` | SageMakerCollector |```bash
# These are equivalent:
dop2mop collect --collectors GitHubCollector,SageMakerCollector
dop2mop collect --collectors github,sagemaker
dop2mop collect --collectors gh,sm
dop2mop [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-token TOKEN | GitHub 个人访问令牌 |
--github-org ORG | GitHub 组织名称 |
--github-enterprise-url URL | GitHub 企业版服务器 URL |
| 选项 | 描述 |
|---|---|
--azure-devops-token TOKEN | Azure DevOps 个人访问令牌 (PAT) |
--azure-devops-access-token TOKEN | Azure DevOps 访问令牌(Bearer 认证,可选) |
--azure-devops-org ORG | Azure DevOps 组织名称 |
| 选项 | 描述 |
|---|---|
--azure-subscription-id ID | Azure 订阅 ID |
--azure-tenant-id ID | Azure AD 租户 ID |
--azure-client-id ID | 服务主体客户端 ID(可选) |
--azure-client-secret SECRET | 服务主体客户端密钥(可选) |
--azure-access-token TOKEN | Azure ML 认证所用的 Azure 访问令牌(可选) |
| 选项 | 描述 |
|---|---|
--aws-access-key-id KEY | AWS 访问密钥 ID |
--aws-secret-access-key SECRET | AWS 秘密访问密钥 |
--aws-region REGION | AWS 区域(默认:us-east-1) |
--aws-profile PROFILE | AWS CLI 配置文件名称 |
| 收集器名称 | 平台 | 所需凭据 |
|---|---|---|
GitHubCollector | GitHub | --github-token, --github-org |
AzureDevOpsCollector | Azure DevOps | --azure-devops-token 或 --azure-devops-access-token, --azure-devops-org |
AzureMLCollector | Azure ML | --azure-subscription-id, --azure-tenant-id |
SageMakerCollector | AWS SageMaker | --aws-profile 或 --aws-access-key-id |
dop2mop demo生成演示数据,展示研究中的四种攻击场景。```bash dop2mop demo [OPTIONS]
| Option | 描述 |
|--------|------|
| `-o, --output FILE` | 输出文件路径(默认:`dop2mop_demo.json`) |
---
### `dop2mop icons`
为 BloodHound 节点类型生成自定义图标配置。```bash
dop2mop icons [OPTIONS]
| 选项 | 描述 |
|---|---|
-o, --output FILE | 输出文件路径(默认:dop2mop_icons.json) |