Recolector OpenGraph para BloodHound que mapea rutas de ataque desde infraestructura DevOps a MLOps, recopilando recursos de pipeline CI/CD, service principal y plataforma ML para análisis de movimiento lateral.
Un recolector OpenGraph de prueba de concepto para BloodHound que mapea rutas de ataque desde infraestructura DevOps hasta MLOps.
Basado en Pipelines of Privilege: Attack Paths from DevOps to MLOps Infrastructure de Brett Hawkins (@h4wkst3r).
Dop2Mop recolecta datos de plataformas DevOps y MLOps para identificar rutas de ataque que permiten movimiento lateral desde pipelines CI/CD hasta infraestructura de entrenamiento de machine learning. Genera JSON OpenGraph compatible con BloodHound para visualización y análisis.
| Plataformas DevOps | Plataformas MLOps | Proveedores de Identidad |
|---|---|---|
| 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 modela los cinco límites de confianza críticos identificados en la investigación:
git clone https://github.com/h4wkst3r/dop2mop.git cd dop2mop pip install -r requirements.txt pip install -e .
## Lo que se recopila
Cada recopilador reúne recursos específicos de la plataforma y mapea los límites de confianza entre ellos:
| Recopilador | Recursos Recopilados |
|-----------|-------------------|
| **GitHub** | Organizaciones, repositorios, flujos de trabajo, secretos, reglas de protección de ramas, configuraciones OIDC, referencias de imágenes de contenedores, referencias de buckets S3 |
| **Azure DevOps** | Organizaciones, proyectos, pipelines (YAML), conexiones de servicio (con detalles de ámbito), grupos de variables, pools de agentes, repositorios |
| **Azure ML** | Espacios de trabajo, clústeres/instancias de cómputo, almacenes de datos, entornos de ML, modelos registrados, trabajos/experimentos, endpoints en línea y por lotes |
| **SageMaker** | Trabajos de entrenamiento, modelos, endpoints, dominios, instancias de notebook, roles de ejecución de IAM (con análisis de políticas), repositorios/imágenes de ECR, buckets de S3 (filtrados para relevantes de ML) |
## Inicio Rápido
### Generar Datos de Demostración
La forma más rápida de ver Dop2Mop en acción es generar datos de demostración que muestren los escenarios de ataque de la investigación:```bash
dop2mop demo -o demo.json
MATCH (n) RETURN n LIMIT 100
``````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
En lugar de pasar credenciales en cada ejecución, puedes guardarlas en un archivo de configuración. Copia el ejemplo incluido y completa tus valores:```bash cp dop2mop.yaml.example dop2mop.yaml
Dop2Mop comprueba estas ubicaciones en orden:
1. Ruta especificada por `--config`
2. `dop2mop.yaml` / `dop2mop.yml` / `.dop2mop.yaml` en el directorio actual
3. `~/.dop2mop.yaml`
> **Nota:** `dop2mop.yaml` está en `.gitignore` para evitar confirmar credenciales accidentalmente. El archivo de ejemplo (`dop2mop.yaml.example`) es seguro para confirmar.
Consulta [dop2mop.yaml.example](https://github.com/h4wkst3r/dop2mop/blob/main/dop2mop.yaml.example) para conocer todas las opciones disponibles con comentarios.
**Orden de prioridad:** Argumentos de CLI > archivo de configuración > variables de entorno.
### Validación de credenciales
Prueba las credenciales antes de ejecutar una recolección completa:```bash
# Validate all configured collectors
dop2mop collect --validate -v