Collecteur OpenGraph pour BloodHound qui cartographie les chemins d'attaque de l'infrastructure DevOps à l'infrastructure MLOps, en collectant les ressources de pipeline CI/CD, de principal de service et de plateforme ML pour l'analyse des mouvements latéraux.
Un collecteur OpenGraph de preuve de concept pour BloodHound qui cartographie les chemins d'attaque entre l'infrastructure DevOps et MLOps.
Basé sur Pipelines of Privilege: Attack Paths from DevOps to MLOps Infrastructure par Brett Hawkins (@h4wkst3r).
Dop2Mop collecte des données provenant des plateformes DevOps et MLOps afin d'identifier les chemins d'attaque permettant un mouvement latéral depuis les pipelines CI/CD vers l'infrastructure d'entraînement de machine learning. Il génère du JSON OpenGraph compatible avec BloodHound pour la visualisation et l'analyse.
| Plateformes DevOps | Plateformes MLOps | Fournisseurs d'identité |
|---|---|---|
| GitHub (Actions, Repos, Secrets) | Azure Machine Learning | Principaux de service Azure AD |
| Azure DevOps (Pipelines, Service Connections) | Amazon SageMaker | Rôles IAM AWS Identité OIDC/Fédérée |
Dop2Mop modélise les cinq périmètres de confiance critiques identifiés dans la recherche :
git clone https://github.com/h4wkst3r/dop2mop.git cd dop2mop pip install -r requirements.txt pip install -e .
## Ce qui est collecté
Chaque collecteur rassemble des ressources spécifiques à la plateforme et cartographie les limites de confiance entre elles :
| Collecteur | Ressources collectées |
|-----------|-------------------|
| **GitHub** | Organisations, dépôts, workflows, secrets, règles de protection de branches, configurations OIDC, références d'images de conteneurs, références de buckets S3 |
| **Azure DevOps** | Organisations, projets, pipelines (YAML), connexions de service (avec détails de portée), groupes de variables, pools d'agents, dépôts |
| **Azure ML** | Espaces de travail, clusters/instances de calcul, magasins de données, environnements ML, modèles enregistrés, jobs/expériences, endpoints en ligne et par lots |
| **SageMaker** | Jobs d'entraînement, modèles, endpoints, domaines, instances de notebooks, rôles d'exécution IAM (avec analyse de politique), dépôts/images ECR, buckets S3 (filtrés pour le ML) |
## Démarrage rapide
### Générer des données de démonstration
Le moyen le plus rapide de voir Dop2Mop en action est de générer des données de démonstration montrant les scénarios d'attaque issus de la recherche :```bash
dop2mop demo -o demo.json
Ouvrir BloodHound CE (v8.0+)
Naviguer vers Administration → Import de fichiers
Télécharger le fichier JSON généré
Interroger avec Cypher :
MATCH (g:Group {highvalue: true})
OPTIONAL MATCH (g)-[:Contains*1..]->(n:User)
RETURN g.name, COUNT(n) AS MemberCount
``````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
---
## Configuration
### Fichier de configuration
Au lieu de passer les identifiants à chaque exécution, vous pouvez les sauvegarder dans un fichier de configuration. Copiez l'exemple inclus et remplissez vos valeurs :```bash
cp dop2mop.yaml.example dop2mop.yaml
# Edit dop2mop.yaml with your credentials
Dop2Mop vérifie ces emplacements dans l'ordre :
--configdop2mop.yaml / dop2mop.yml / .dop2mop.yaml dans le répertoire courant~/.dop2mop.yamlNote :
dop2mop.yamlest dans.gitignorepour éviter de commettre accidentellement des informations d'identification. Le fichier d'exemple (dop2mop.yaml.example) peut être commité en toute sécurité.