Introducción
En entornos de Machine Learning en la nube, la automatización de flujos de trabajo mediante SDKs es crítica. Sin embargo, cuando estos componentes interactúan con recursos compartidos como buckets de Google Cloud Storage (GCS), pueden introducir riesgos no evidentes. Un caso paradigmático es la vulnerabilidad descubierta por Unit 42 en el SDK de Python de Vertex AI, donde una combinación de bucket squatting y deserialización insegura de archivos pickle permitía a un atacante con acceso a otro proyecto de Google Cloud comprometer modelos de víctimas completamente ajenas a su infraestructura.
El ataque no requería credenciales ni acceso inicial al proyecto víctima. Solo bastaba con predecir el nombre del bucket temporal que Vertex AI genera automáticamente al subir un modelo, crearlo en el propio proyecto del atacante y reemplazar los artefactos subidos con una versión maliciosa. Este vector, denominado por los investigadores como «Pickle in the Middle», ilustra cómo fallos en la lógica de validación de recursos compartidos pueden escalar a compromisos críticos en entornos de IA/ML.
Qué ocurrió
Google Cloud Vertex AI es una plataforma para entrenar e implementar modelos de Machine Learning. El SDK de Python (google-cloud-aiplatform) es la herramienta principal que los desarrolladores usan para interactuar con Vertex AI de manera programática. Cuando un usuario sube un modelo al Model Registry de Vertex AI, el SDK primero estabiliza los artefactos del modelo en un bucket de GCS antes de registrarlos en el servicio.
La vulnerabilidad afectó a las versiones 1.139.0 y 1.140.0 del SDK, donde el código responsable de esta lógica —ubicado en el archivo gcs_utils.py y específicamente en la función stage_local_data_in_gcs()— presentaba dos fallos críticos:
- Generación predecible del nombre del bucket: El SDK construía el nombre del bucket temporal usando un patrón determinista basado en el project ID y la región (ejemplo:
my-project-vertex-staging-us-central1). No se validaba si el bucket existía en el proyecto del usuario ni se verificaba su propiedad.
- Falta de verificación de propiedad del bucket: La función
staging_bucket.exists()devolvíaTruesi el bucket existía en cualquier proyecto, sin importar su dueño. Esto permitía a un atacante, que conociera el project ID de la víctima, crear ese bucket en su propio proyecto (técnica conocida como bucket squatting) antes de que la víctima subiera su modelo.
Una vez que la víctima intentaba subir su modelo, los artefactos se subían silenciosamente al bucket controlado por el atacante. En una ventana de 2.5 segundos, el atacante podía reemplazar los artefactos legítimos con un modelo malicioso que contenía un payload en formato pickle. Cuando Vertex AI desplegaba el modelo, el SDK de inferencia cargaba los artefactos mediante pickle.load() o joblib.load(), ejecutando el código arbitrario definido en el método __reduce__ del modelo malicioso.
> Nota técnica: El ataque dependía de que el modelo estuviera serializado con pickle o joblib, lo cual es común en el ecosistema Python de ML. La deserialización de pickle en Python no valida el origen del archivo, lo que convierte a estos formatos en un vector de ejecución de código conocido.
Impacto para DevOps / Infraestructura / Cloud / Seguridad
Para equipos de Cloud y DevOps
- Riesgo de RCE en entornos de producción: El ataque culminaba con ejecución de código arbitrario en los contenedores de inferencia de Vertex AI, lo que podría llevar a:
– Movimiento lateral dentro del entorno de la víctima (si el contenedor tenía permisos adicionales).
– Persistencia mediante la modificación de modelos en uso.
- Afectación a pipelines automatizados: Empresas que usaban el SDK para subir modelos a Vertex AI sin especificar un bucket personalizado estaban expuestas. Según datos de Unit 42, muchas implementaciones en producción dependían de este flujo automático.
- Impacto en Kubernetes y GCP: Vertex AI usa tenant projects de Google Cloud para alojar recursos como clústeres de Kubernetes, contenedores y cuentas de servicio (P4SA). El servicio agente de Vertex AI (
[email protected]) tenía permisos para leer los artefactos desde el bucket temporal. Esto convertía a los modelos comprometidos en una puerta trasera potencial hacia la infraestructura gestionada por Google.
Para equipos de Seguridad
- Vulnerabilidad de tipo supply chain en IA/ML: El ataque no explotaba un fallo en el modelo en sí, sino en la herramienta que lo subía a la plataforma. Esto lo hace especialmente peligroso, ya que los modelos suelen considerarse de confianza por su origen.
- Vector de ataque silencioso: No se requerían interacciones con la víctima ni credenciales. Solo era necesario conocer el project ID de la víctima (a menudo público o deducible) y actuar en una ventana de tiempo muy reducida (2.5 segundos).
- CVE y scoring: Aunque Unit 42 reportó el fallo a Google, no hay un CVE público asignado aún. Sin embargo, el vector de ejecución remota de código (RCE) y la falta de validación de recursos compartidos lo acercan a un CVSS score de 7.5-8.5 (dependiendo del contexto de impacto).
Detalles técnicos
Componentes afectados
| Componente | Versiones afectadas | Afectación |
|---|---|---|
