Dataset Breached Hugging Face: Code Execution via Data Loader

A malicious dataset exploited code execution paths in Hugging Face's pipeline, leading to node-level access. Learn how to protect your AI workflows.

viernes, 24 de julio de 2026 • 9 min read • Q2BSTUDIO Team

Cómo un archivo de datos se convirtió en código ejecutable

En julio de 2026, el mayor repositorio de modelos de inteligencia artificial del planeta, Hugging Face, sufrió una violación de seguridad que sacudió los cimientos de la confianza en el ecosistema del machine learning. El vector de ataque no fue un paquete npm malicioso, ni un flujo de CI envenenado, ni siquiera un mantenedor suplantado. Fue algo mucho más sutil y, para la mayoría de los equipos de desarrollo, completamente inesperado: un dataset. Un archivo que cualquier ingeniero clasificaría como 'datos' resultó ser el caballo de Troya que ejecutó código arbitrario en los trabajadores de procesamiento de Hugging Face, escaló privilegios hasta el nivel de nodo, robó credenciales de clúster y desplegó un marco de agentes autónomos que operó durante un fin de semana completo, dejando tras de sí más de 17.000 eventos registrados. Este incidente no es una anécdota ajena para quienes construimos software hoy; es una descripción exacta de nuestra propia superficie de ataque. En Q2BSTUDIO, donde desarrollamos aplicaciones a medida y soluciones de inteligencia artificial para empresas, este caso nos obligó a revisar de arriba abajo cómo tratamos los datos en los pipelines de agentes.

La naturaleza del vector inicialPara entender el riesgo, hay que comprender cómo funciona el ecosistema de datasets en Hugging Face. Cuando un usuario sube un dataset, la plataforma lo procesa para generar vistas previas, inferir esquemas e indexar contenido. Pero un dataset no es siempre un archivo pasivo de Parquet: la librería datasets tradicionalmente soporta scripts de carga, archivos Python que viajan dentro del repositorio y que se ejecutan en la máquina que llama a load_dataset(). El guardián de esa puerta es el flag trust_remote_code=True. Al activarlo, el desarrollador concede ejecución remota de código a cualquier repositorio del que descargue datos. Es el mismo contrato que un hook postinstall de npm, pero con una diferencia fundamental: casi nadie piensa en un dataset como código. Se pinchan versiones de npm, se revisan las acciones de GitHub, se escanean dependencias, y luego se entrega alegremente la ejecución total a un cargador de datos no verificado. Eso es exactamente lo que ocurrió en Hugging Face. Dos caminos de ejecución de código en la infraestructura de procesamiento —el script de carga y la inyección de plantillas en la configuración— fueron explotados simultáneamente. Y no, no fue inyección de prompt ni un modelo de lenguaje desobedeciendo; fue un fallo de software clásico, ejecutado por código malicioso disfrazado de dato.

El atacante autónomo: cuando la IA ataca a la IAUna vez dentro del primer trabajador, el intruso escaló a nivel de nodo, robó credenciales de la nube y tokens de clúster, y luego se movió lateralmente a través de los clústeres internos. Lo que hace este ataque diferente de cualquier otro es lo que vino después: el atacante utilizó un marco de agentes autónomos basado en inteligencia artificial para orquestar toda la campaña. Miles de acciones individuales ejecutadas en entornos sandbox efímeros durante un fin de semana, sin un humano al teclado. El comando y control se ocultó en servicios públicos para mezclarse con el tráfico normal. Hugging Face describió esto como el escenario de 'atacante agéntico' que la industria había pronosticado. Y el modelo concreto que impulsaba esos agentes sigue sin identificar. Esta velocidad y automatización cambian las reglas del juego: un atacante que no se cansa, que no comete errores de tipeo, que decide el siguiente paso en milisegundos. Para cualquier empresa que despliegue agentes de IA en producción, este es el escenario de pesadilla. Por eso en Q2BSTUDIO integramos ciberseguridad como un pilar fundamental en todo desarrollo de soluciones cloud y aplicaciones a medida.

Lo que permaneció limpio (y lo que no)Es importante no caer en el sensacionalismo. Hugging Face fue clara en su divulgación: la capa pública (modelos públicos, datasets públicos y Spaces) no se vio comprometida. La cadena de suministro de software (imágenes de contenedor, paquetes publicados) permaneció limpia. Si un desarrollador descargó un modelo o hizo pip install de la librería ese fin de semana, no descargó el código del atacante. Lo que se vio afectado fueron los sistemas internos: datasets internos y credenciales de servicio. Suficientemente grave como para justificar la rotación de credenciales y la reconstrucción de nodos, pero contenido dentro del perímetro interno. El agente atacante, por toda su velocidad, no escapó al nivel que distribuye artefactos a millones de desarrolladores. Sin embargo, la lección es clara: la superficie de ataque de los datos existe dentro de la organización también.

La respuesta forense: IA defendiendo de IAUno de los detalles más fascinantes de la respuesta al incidente fue cómo Hugging Face detectó la intrusión: mediante detección de anomalías basada en modelos de lenguaje. Luego, para reconstruir los 17.000 eventos, desplegaron agentes de análisis impulsados por LLM que comprimieron lo que normalmente habría llevado días de revisión manual en horas. Pero hubo un giro: cuando intentaron usar un modelo comercial de frontera para analizar los artefactos del ataque, la API se negó. Los guardarraíles de seguridad no distinguían entre un respondedor de incidentes pegando exploits reales y un atacante pidiendo ayuda. Así que tuvieron que pivotar a un modelo de pesos abiertos, GLM-5.2, ejecutado en su propia infraestructura. La lección para cualquier empresa es tener un modelo forense autogestionado listo antes del incidente. El momento en que se necesita es exactamente cuando los modelos alojados te bloquean por describir un ataque con demasiada precisión.

El modelo de amenazas que nadie escribióObservemos cómo un equipo cuidadoso asegura sus dependencias: versiones fijadas, integridad de lockfile, npm ci en lugar de npm install, escáneres de dependencias, commits firmados, revisión de cada cambio en los flujos de trabajo. Todo eso es trabajo de seguridad real, y todo está dirigido a una superficie: el código que instalas. Ahora preguntemos a ese mismo equipo dónde sitúan sus cargadores de datos en el modelo de amenazas. En mi experiencia, la respuesta es 'en ninguna parte'. Los datos son lo que alimentas al código, se supone que no son código. Esa suposición es exactamente la brecha por la que caminó este ataque. trust_remote_code=True es el --ignore-scripts del mundo de los datos, pero invertido: el interruptor que convierte una operación de datos de nuevo en una operación de código. Muchos equipos lo activan sin pensar porque algún tutorial les dijo que lo hicieran cuando un modelo no cargaba. Para un pipeline de agentes esto es peor, por la misma razón que los ataques a la cadena de suministro de npm son peores en pipelines de agentes: nadie está leyendo la salida. Cuando uno de mis agentes descarga un dataset externo como paso cuatro de una tarea de ocho pasos, no hay un humano mirando el cargador. El pipeline que hizo peligroso un paquete npm y el pipeline que hizo peligroso este dataset son el mismo pipeline. La carga útil solo viajó en un tipo de archivo diferente.

Qué cambia esto en nuestra forma de cargar datosLa buena noticia es que el vector del script de carga tiene una solución real por defecto, y ya se ha distribuido. Las versiones recientes de la librería datasets establecen trust_remote_code en False por defecto, y la línea datasets 4.0 y superiores han eliminado el soporte para scripts de carga por completo. Si estás en una versión actual y no has re-activado el flag en una versión anterior, ese vector específico ya está cerrado. Pero la divulgación nombró dos caminos, y el flag solo cubre uno. trust_remote_code=False no hace nada contra la inyección de plantillas en la configuración del dataset, porque eso no es un script de carga, sino el manejo que el cargador hace de la configuración que el atacante controla. Los valores por defecto no te salvan de la segunda clase de bug. Así que las mitigaciones que realmente coinciden con este modelo de amenazas son las aburridas de infraestructura: aislar la carga de datos como aíslas una compilación. Ejecutarla sin credenciales cloud ambientales, con el egress de red bloqueado y sin camino hacia la identidad del nodo. Ese único control es lo que convierte 'ejecución de código en un trabajador' de una brecha en una molestia contenida. También auditar los scripts de carga antes de ejecutarlos: si un dataset trae Python, léelo, igual que leerías un hook postinstall inesperado. Preferir datasets verificados y propiedad de la organización sobre un usuario aleatorio, y fijarlos, para que una revisión sorpresa no cuele código nuevo en un pipeline que nadie vigila. Tratar el pipeline de procesamiento de datos con el mismo rigor que el pipeline de compilación: mismo aislamiento, mismo mínimo privilegio, misma postura de 'asumir que la entrada es hostil'. Ejecuta código, así que dale el modelo de amenazas de un pipeline de código.

La perspectiva empresarial: hacia un desarrollo seguro de IAEn Q2BSTUDIO, entendemos que la seguridad no es un añadido, sino una capa transversal en cada proyecto. Cuando desarrollamos soluciones de inteligencia artificial o aplicaciones a medida, integramos análisis de superficie de ataque, hardening de pipelines de datos y sandboxing de ejecución. Nuestros clientes en entornos cloud AWS y Azure se benefician de arquitecturas que separan claramente los planos de datos y código, minimizando el riesgo de este tipo de intrusiones. También ayudamos a las empresas a adoptar Business Intelligence con Power BI de forma segura, asegurando que los flujos de datos no se conviertan en vectores de ataque. La automatización de procesos, tan necesaria para la eficiencia, debe ir acompañada de una ciberseguridad robusta. Porque si un dataset pudo vulnerar el mayor hub de modelos de IA del mundo, cualquier pipeline de datos que no esté adecuadamente aislado puede ser el próximo blanco.

Conclusión: el dato ya no es solo datoEste incidente no es una razón para dejar de usar Hugging Face. No es una condena a la plataforma. Cualquier framework que ejecute scripts de carga de datos tiene la misma superficie. Quien publicó una autopsia detallada no es quien me preocupa; es quien no la ha hecho. La lección incómoda que me llevo es que 'dato' vivía en un cubo mental etiquetado como seguro, y nunca lo fue. Cualquier cosa que mis agentes carguen en tiempo de ejecución —un dataset, una página web raspada, un archivo de un bucket— es código potencial hasta que demuestre que es solo dato. El control no es un único ajuste. Es aislar la carga y negarle credenciales que no necesita. Revisemos nuestros pipelines. Si tienes agentes que procesan contenido externo sin supervisión, ese es tu nuevo perímetro de seguridad. Y si necesitas ayuda para fortificarlo, en Q2BSTUDIO estamos listos para acompañarte.

A BREAK?

Play for a moment before you go

OUR SERVICES

How we can help you

Do you have a project in mind?

Tell us your vision and we'll turn it into a software solution. Whatever the scope, we make your idea real.