En la jerarquía de las vulnerabilidades web, pocas cosas llaman la atención inmediata de un operador del Equipo Rojo como una Inyección de Objetos en PHP (POI) expuesto a usuarios no autenticados.
CVE-2025-32432 es exactamente eso. Con un Puntuación CVSS v3.1 de 10,0Sin embargo, esta vulnerabilidad en Craft CMS no es sólo un error más; es una clase magistral de cómo los contenedores modernos de Inyección de Dependencia (DI) pueden ser utilizados como armas contra las aplicaciones que soportan.
Para el ingeniero de seguridad empedernido, lo interesante aquí no es sólo el RCE, sino el mecanismo. Pone de relieve un fallo fundamental en la forma en que el Marco Yii2 (que alimenta a Craft) maneja matrices de configuración pasadas a través de la entrada del usuario. Este análisis diseccionará el rastro de pila de la vulnerabilidad, las cadenas de gadgets específicas requeridas para la explotación y por qué esta CVE específica representa el punto de ruptura para los escáneres DAST tradicionales, necesitando el surgimiento de agentes ofensivos impulsados por IA.
El fallo arquitectónico: cuando el bricolaje sale mal
Para entender CVE-2025-32432, uno debe entender la arquitectura de Craft CMS. Craft se basa en gran medida en los patrones Service Locator y Dependency Injection de Yii2.
La vulnerabilidad reside en el AssetsControllerEn concreto actionGenerateTransform método. Este endpoint está diseñado para permitir al frontend solicitar transformaciones de imagen (recorte, redimensionamiento) sobre la marcha.
El fregadero vulnerable
El flujo de código sigue un camino peligroso desde la entrada del usuario directamente hasta la instanciación del objeto.
- Ingestión: El controlador acepta una solicitud POST que contiene un
transformarmatriz. - Normalización: Los datos se pasan a
Craft::$app->getAssetTransforms()->normalizeTransform(). - Ejecución (El sumidero): Al final, el método llama a
Craft::createObject($config).
En Yii2, createObject es un potente envoltorio. Si el $config contiene una matriz clase Yii2 intentará instanciar esa clase específica, rellenando sus propiedades públicas con el resto de claves del array.
PHP
`// Flujo de vulnerabilidad simplificado public function actionGenerateTransform() { $transformId = Craft::$app->getRequest()->getBodyParam('transformId'); // El atacante controla todo el array de configuración $transformConfig = Craft::$app->getRequest()->getBodyParam('transform');
// FATAL FLAW: No hay validación de la lista blanca en el parámetro 'class
$object = Craft::createObject($transformConfig);
return $object->transform();
}`
Esta es la definición de Deserialización insegura (CWE-502), aunque utiliza la configuración JSON/Array en lugar de la nativa deserializar(). El resultado es idéntico: el atacante dicta el flujo de control.

La cadena de explotación: Creación del artilugio
Script kiddies fallará en este CVE porque simplemente apuntando una carga útil en el punto final devuelve un 400 Solicitud errónea. Una explotación exitosa requiere una comprensión matizada del estado de la aplicación.
Fase 1: Reconocimiento contextual (identificación de activos)
En actionGenerateTransform tiene una dependencia dura: requiere una función assetId (un número entero que representa una imagen cargada en el CMS).
Si el assetId no existe, el código lanza una excepción antes de llega a los vulnerables createObject llamar.
- La trampa: Los escáneres tradicionales (Nessus, Nuclei) disparan cargas útiles a ciegas. Utilizan ID aleatorios o no utilizan ID. Reciben errores y marcan el objetivo como "Seguro".
- El Bypass: Un atacante sofisticado (o Agente) raspa el código fuente HTML público, buscando patrones típicos de activos Craft (por ejemplo,
/assets/images/1042/logo.png). El número entero1042es la clave para desbloquear la ruta de ejecución.
Fase 2: La cadena de artilugios
Una vez desbloqueada la puerta con un ID de activo válido, el atacante debe suministrar la carga útil. Dado que podemos instanciar cualquier necesitamos un "Gadget", una clase que desencadena una actividad maliciosa durante su ciclo de vida (normalmente __construir, __destructo init).
En el contexto de CVE-2025-32432, los investigadores han identificado cadenas que utilizan \\bozalHttp\Cliente (si está instalado) o clases de caché nativas de Yii2.
Un vector común consiste en utilizar el yii\rbac\\PhpManager o abusar de la Ver para incluir archivos locales. Sin embargo, el método RCE más directo consiste en aprovechar la función Craft\Config combinado con envolturas de protocolo PHP.
La estructura de la carga útil del exploit:
JSON
{"assetId": "1042", "transform": { "class": "craft\\\\base\\\\ImageTransform", "width": "100", "height": "100", "format": "php", "quality": {"class": "yii\\\\rest\\\\IndexAction", "checkAccess": "system", "id": "whoami" } } }
Nota: La cadena de gadgets real puede variar en función de las dependencias específicas de Composer instaladas en el servidor, lo que requiere un ajuste dinámico de la carga útil.

El fracaso de las herramientas de seguridad estáticas
Esta vulnerabilidad pone al descubierto las limitaciones de la actual generación de herramientas de seguridad.
- Apátridas: Los escáneres tradicionales son apátridas. No "recuerdan" que han encontrado un Asset ID en la página de inicio y "deciden" utilizarlo en una petición POST 10 minutos más tarde.
- Ceguera contextual: No pueden inferir la lógica empresarial. Consideran que un ID de imagen es sólo un número, no una clave necesaria para una cadena de explotación.
Hacia ahí está pivotando la industria Seguridad Agenética.
Razonamiento automatizado: El enfoque penligente
Cuando analizamos CVE-2025-32432 en PenligenteHemos comprobado que el fuzzing estándar tiene una tasa de éxito de 0%. Para validar esta vulnerabilidad de forma fiable, tuvimos que desplegar un agente de IA capaz de razonar en varios pasos.
En Penligente El flujo de trabajo para este CVE demuestra la diferencia entre "escaneo" y "pruebas de penetración":
- Huellas dactilares: El Agente identifica el
X-Powered-By: Craft CMSde cabeza. - Análisis semántico: En lugar de hacer fuzzing, el Agente analiza el DOM de la página de destino. Identifica
<img src="...">y compara la estructura de la URL para extraer posibles ID de activos. - Prueba de hipótesis: El Agente intenta una petición de transformación benigna con el ID extraído. Si recibe un
200 OKo unExcepción lógica(en lugar de un404), confirma que el ID es válido. - Mutación de la carga útil: El Agente construye la carga JSON. Si el servidor está ejecutando una versión más reciente de PHP que desaprueba ciertas envolturas, el Agente modifica la cadena de gadgets en tiempo real para intentar inyectar objetos alternativos.
Esta capacidad de lógica de cadena-encontrar una clave en el paso A y utilizarla en el paso B- es lo que separa a los hackers humanos (y agénticos) de los scripts automatizados.
Reparación y defensa
Si está defendiendo una instalación de Craft CMS, es necesario actuar de inmediato.
1. Parcheado
El proveedor ha publicado una validación estricta en las siguientes versiones. Asegúrese de que está ejecutando:
- Craft CMS 3.x -> 3.9.15+
- Craft CMS 4.x -> 4.14.15+
- Craft CMS 5.x -> 5.6.17+
2. Configuración WAF
Si no es posible aplicar parches de forma inmediata (debido a la congelación del código heredado), debe bloquear el vector de ataque específico en el nivel WAF.
Ejemplo de regla ModSecurity:
Apache
SecRule REQUEST_URI "@contains /actions/assets/generate-transform" \\ "id:100001,phase:2,t:none,t:lowercase,deny,status:403,msg:'Block Craft CMS RCE CVE-2025-32432', \\\ cadena" SecRule ARGS_POST:transform "@rx class"
Esta regla bloquea cualquier petición al endpoint de transformación que intente definir un parámetro 'class' en el cuerpo POST.
Comparación de vulnerabilidades de alto impacto (2024-2025)
Para contextualizar la CVE-2025-32432, resulta útil compararla con otros fallos de arquitectura recientes en los principales frameworks.
| ID CVE | Objetivo | Vector | Complejidad | Por qué es importante |
|---|---|---|---|---|
| CVE-2025-32432 | CMS artesanal | Inyección de objetos | Medio | Demuestra el fracaso de los contenedores DI no validados. |
| CVE-2024-21626 | runc | Escape de contenedores | Alta | Fallo fundamental en el aislamiento del tiempo de ejecución del contenedor. |
| CVE-2024-23897 | Jenkins | Lectura arbitraria de archivos | Bajo | Abuso de las características del analizador CLI (args4j). |
| CVE-2024-3400 | Palo Alto PAN-OS | Inyección de comandos | Bajo | RCE no autenticado en dispositivos de seguridad periféricos. |
Conclusión
CVE-2025-32432 es un recordatorio de que en el desarrollo web moderno, "rico en características" a menudo significa "rico en superficie de ataque". La conveniencia de Yii2 createObject proporcionaba flexibilidad a los desarrolladores, pero entregaba a los atacantes un arma cargada.
Para el ingeniero de seguridad, esta vulnerabilidad subraya el fin de la era de la exploración de "apuntar y disparar". Las vulnerabilidades son cada vez más lógicas, más contextuales y más dependientes del estado. Defenderse contra ellas requiere herramientas que puedan pensar, razonar y adaptarse tan rápido como los atacantes.
Referencias y lecturas complementarias:

