
BloodHound向けのOpenGraphコレクターで、DevOpsからMLOpsインフラへの攻撃経路をマッピングし、CI/CDパイプライン、サービスプリンシパル、MLプラットフォームリソースを収集して横方向移動の分析を行います。
BloodHound用の概念実証OpenGraphコレクター。DevOpsからMLOpsインフラストラクチャへの攻撃パスをマッピングします。
Pipelines of Privilege: Attack Paths from DevOps to MLOps Infrastructure(Brett Hawkins (@h4wkst3r) 著)に基づいています。
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は研究で特定された5つの重要な信頼境界をモデル化します:
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呼び出しを行い、トークンが有効であることを収集開始前に確認します。
### Collector Aliases
`--collectors` を使用して、完全なクラス名の代わりに短い名前を使用できます。
| Alias | Collector |
|-------|-----------|
| `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]
| Option | Description |
|---|---|
-o, --output FILE | 出力ファイルパス (デフォルト: dop2mop_output.json) |
--zip | 出力をZIPファイルに圧縮 |
--config FILE | YAML/JSON設定ファイルへのパス |
--validate | 収集前に資格情報を検証 |
--collectors LIST | カンマ区切りのコレクターまたはエイリアスのリスト(例:github,sm) |
--max-items N | タイプごとに収集する最大アイテム数 |
--no-secrets | シークレット/認証情報の列挙をスキップ |
| Option | Description |
|---|---|
--github-token TOKEN | GitHub個人アクセストークン |
--github-org ORG | GitHub組織名 |
--github-enterprise-url URL | GitHub Enterprise ServerのURL |
| Option | Description |
|---|---|
--azure-devops-token TOKEN | Azure DevOps個人アクセストークン (PAT) |
--azure-devops-access-token TOKEN | Azure DevOpsアクセストークン (Bearer認証、オプション) |
--azure-devops-org ORG | Azure DevOps組織名 |