
CVE-2026-4372: Modelo de amenaza, análisis de causa raíz, replicación y detección
Análisis defensivo de un error crítico de ejecución remota de código (RCE) en
transformersde Hugging Face.
| Campo | Valor |
|---|---|
| Identificador | CVE-2026-4372 / GHSA-29pf-2h5f-8g72 |
| Componente | transformers de Hugging Face |
| Clase | Ejecución remota de código (CWE-94, inyección de código) |
| Punto de entrada | AutoModelForCausalLM.from_pretrained(), cuando se carga un modelo |
| Mecanismo | Un ajuste de atención en el config.json del modelo (attn_implementation / _attn_implementation_internal) hace que la biblioteca descargue y ejecute código del atacante |
| Propiedad clave | Omite trust_remote_code=False, el ajuste en el que los usuarios confían para impedir exactamente esto |
| Corregido en | transformers 5.3.0 |
Un usuario que deliberadamente dejó trust_remote_code=False para mantenerse seguro seguía estando expuesto.
Verifique los detalles a continuación contra las fuentes oficiales antes de tratarlos como definitivos:
Hay dos descripciones del desencadenante en circulación:
config.json (_attn_implementation_internal).kernels, a menudo instalado mediante transformers[all].Lo más probable es que sean la misma ruta: el campo de atención nombra un repositorio del Hub, y el paquete kernels descarga y ejecuta código desde él. Trate los nombres de campo aquí como provisionales hasta que el commit de corrección los confirme.
[ Model repo on the Hub ] untrusted source
│ config.json, tokenizer, weights, (code)
▼
[ Download to local cache ]
▼
[ Read config.json ] settings become a config object
▼
[ Pick model class + attention type ]
▼
[ Build model, load weights ]
▼
[ Model runs in the user's process, with the user's permissions ]
| # | Límite | Protección que debería aplicarse |
|---|---|---|
| TB-1 | Hub → disco local | Repositorios de confianza, fijación a un commit concreto |
| TB-2 | Archivo de configuración → objeto de configuración | Permitir solo valores conocidos y seguros |
| TB-3 | Objeto de configuración → código en ejecución | trust_remote_code |
| TB-4 | Modelo → sistema operativo | Sandbox, mínimo privilegio |
El fallo es una vulneración en TB-3: un valor del archivo de configuración llegó a la ejecución de código
sin pasar la comprobación de trust_remote_code.
En todos los casos la víctima solo ejecuta la llamada normal,
AutoModelForCausalLM.from_pretrained("<repo-id>").
trust_remote_code protege una forma de ejecutar código del repositorio: los archivos personalizados modeling_*.py.
La configuración de atención era una segunda forma que nunca pasaba por esa protección.
untrusted config.json attention setting
│
▼
"pick attention type" logic
│ never checks:
✗ ─────────────▶ trust_remote_code
▼
download + run code from the Hub (via `kernels`)
_) aún podía establecerse desde un archivo no confiable.kernels) habilitaba silenciosamente el ataque cuando estaba instalado, por ejemplo mediante transformers[all].Protege la acción peligrosa, no una sola ruta hacia ella. Cada ruta que pueda conducir a "ejecutar código" debe pasar por la misma comprobación.
La defensa es un único script autocontenido, defence/safe_load.py.
Su función safe_from_pretrained() reemplaza a from_pretrained() y ejecuta cuatro comprobaciones
antes de que se cargue ningún modelo. Si una falla, lanza UnsafeModelLoad y no se carga nada.
| # | Comprobación | Qué hace |
|---|---|---|
| 1 | Versión | Rechaza si transformers es anterior a 5.3.0. Esta es la solución real. |
| 2 | Kernels | En una versión antigua, rechaza si el paquete kernels está instalado, ya que el ataque lo necesita. |
| 3 | Configuración | Lee los archivos de configuración del modelo y rechaza si contienen una configuración riesgosa (ver abajo). Los modelos del Hub se comprueban y cargan en el mismo commit. |
| 4 | Código remoto | Siempre establece trust_remote_code=False. Solo es una buena práctica: este CVE lo omite. |
Una versión antigua se rechaza en la comprobación 1. Las comprobaciones 2 y 3 solo se ejecutan en una versión antigua si
la opción exclusiva de laboratorio allow_vulnerable_env=True está establecida.
Qué bloquea la comprobación 3:
attn_implementation, _attn_implementation,
_attn_implementation_internal) que no esté integrada. Solo se permiten eager, sdpa,
flash_attention_2, flash_attention_3 y flex_attention, por lo que un valor
como attacker-org/evil-kernel queda bloqueado, incluso dentro de una subconfiguración anidada._attn_implementation_internal, auto_map y custom_pipelines.config=, ya que omitiría la comprobación.Para los modelos del Hub, solo se descargan los archivos de configuración, nunca los pesos ni el código. Se
descargan en un commit fijo, y el modelo se carga luego desde ese mismo commit,
por lo que los archivos no pueden intercambiarse entre la comprobación y la carga. Tras revisar las
advertencias, una persona puede anular la comprobación 3 con accept_findings=True.
| Situación | Qué detiene el ataque |
|---|---|
transformers 5.3.0 o posterior | Comprobación 1 |
Versión antigua, kernels instalado | Comprobación 2 |
| Versión antigua, configuración riesgosa en el config | Comprobación 3 |
| Repositorio modificado después de ser comprobado | Comprobación 3 (mismo commit comprobado y cargado) |
Limitación: la comprobación 3 solo conoce las configuraciones enumeradas arriba, por lo que no puede detectar un nuevo
ataque. Actualizar a transformers>=5.3.0 es la única solución completa.