Cabecera Penligente

La Clase Fantasma: Utilizando CVE-2025-32432 (Yii2 Container Injection) en Craft CMS

En la jerarquía de las vulnerabilidades web modernas, Inyección de dependencias (DI) Inyección de contenedores se sitúa en la cúspide de la cadena alimentaria. Es más difícil de detectar que la inyección SQL, más elegante que la corrupción de memoria y devastador en su impacto.

La reciente revelación de CVE-2025-32432 dirigiéndose a CMS artesanal-y, por extensión, la Marco Yii2-sirve como brutal recordatorio: cuando la entrada del usuario controla la instanciación de clases, la aplicación pertenece al atacante. Mientras que muchos escáneres automatizados inicialmente clasificaron esto como una "Asignación masiva" o un "Problema de configuración" de baja gravedad, los ingenieros de seguridad de élite lo reconocen como lo que realmente es: Ejecución remota de código (RCE) a través de una lógica de deserialización de objetos insegura.

Este artículo realiza una autopsia técnica de la vulnerabilidad. Iremos más allá del aviso del proveedor para reconstruir la cadena de gadgets, analizar los métodos mágicos de PHP subyacentes y demostrar por qué el análisis semántico basado en IA es la única forma viable de detectar estos fallos lógicos a escala.

La Clase Fantasma: Utilizando CVE-2025-32432 (Yii2 Container Injection) en Craft CMS

La arquitectura del fracaso: Dentro del Localizador de Servicios Yii2

Para entender CVE-2025-32432, primero debes entender el corazón arquitectónico del framework Yii2: yii\di\\\\Contenedor.

Craft CMS se basa en gran medida en el patrón Service Locator de Yii2 y el contenedor Dependency Injection para gestionar las dependencias de clases. Para hacer el desarrollo flexible, el contenedor permite a los desarrolladores configurar objetos usando matrices de configuración. Esta característica es la causa principal de la vulnerabilidad.

El sumidero "CreateObject

El sumidero crítico en esta clase de vulnerabilidad es Yii::createObject(). Este método acepta una matriz de configuración en la que clase dicta qué clase PHP instanciar, y las claves subsiguientes definen las propiedades públicas de esa instancia.

PHP

// Uso legítimo en código backend de Craft CMS $object = Yii::createObject([ 'class' => 'app\\models\\ser', 'username' => 'admin', 'role' => 'superuser' ]);

La vulnerabilidad (CVE-2025-32432) surge porque determinadas acciones de controlador en Craft CMS (a menudo relacionadas con el guardado de la configuración de plugins o la gestión de borradores) aceptan la entrada JSON sin procesar de la solicitud HTTP y la pasan ciegamente a este sumidero.

El fallo de la lógica:

  1. Fuente: El usuario envía POST /api/v1/plugin-config con cuerpo JSON.
  2. Flujo: El controlador decodifica el JSON en un array PHP.
  3. Fregadero: La matriz se pasa a Yii::createObject($requestData).
  4. Resultado: El atacante define el clasetransformando la inyección de datos en Inyección de objetos.
Utilizando CVE-2025-32432 (Yii2 Container Injection) en Craft CMS

Construyendo la cadena de la muerte: La caza del artilugio

En la explotación de PHP, ser capaz de instanciar una clase es inútil a menos que esa clase hace algo interesante durante su ciclo de vida. Necesitamos un Gadget.

Un Gadget es una clase que realiza operaciones sensibles (escrituras de archivos, ejecución de comandos, consultas a bases de datos) en sus métodos mágicos (__construir, __destruct, __despertar, __aCadena) o métodos de inicialización (init). Dado que Craft CMS incluye todo el ecosistema Yii2 y librerías masivas de proveedores (Guzzle, Monolog, etc.), el panorama de gadgets es fértil.

El artilugio principal: yii\rest\\\IndexAction

En el contexto de CVE-2025-32432, la cadena de gadgets más fiable aprovecha yii\rest\\\IndexAction. Esta clase está diseñada para listar modelos para una API REST, pero tiene una propiedad específica: checkAccess.

En checkAccess está pensada para contener una función invocable para la comprobación de permisos. Sin embargo, como controlamos los valores de la propiedad a través del contenedor DI, podemos convertir esto en una función Primitiva de ejecución de devolución de llamada.

La carga útil armada (PoC)

A continuación se muestra un payload de prueba de concepto (PoC) reconstruido. Esta estructura JSON, al ser procesada por el endpoint vulnerable, desencadena RCE.

JSON

{ "acción": "save-config", "config": { "class": "yii\\\\rest\\\\IndexAction", "id": "rce_trigger", "controller": { "class": "yii\\\\web\\\\Controller", "id": "dummy_controller" }, "modelClass": "yii\\\\base\\\\Model", "checkAccess": "system", "run": "id; uname -a; cat /etc/passwd" } }

Flujo de ejecución paso a paso:

  1. Instanciación: El contenedor DI ve Clase: yii\rest\\\IndexAction. Utiliza Reflection para crear una instancia de esta clase.
  2. Población de la propiedad: El contenedor itera a través de las claves.
    • Establece $indexAction->checkAccess = 'system'.
    • Instaura recursivamente un dummy_controller (requerido por IndexAction).
  3. Desencadenar la trampa: La mayoría de los componentes de Yii2 llaman a init() o ejecutar() durante su ciclo de vida. En esta ruta específica del exploit, la lógica de la aplicación invoca finalmente la acción.
  4. Ejecución de devolución de llamada: En IndexAction::ejecutar()el código comprueba si checkAccess PHP // Lógica interna de yii\rest\\IndexAction if ($this->checkAccess) { call_user_func($this->checkAccess, $this->id, $params); }
  5. RCE: PHP ejecuta system('rce_trigger', ...)? No, el atacante debe alinear los argumentos. Manipulando las propiedades internas que se pasan como argumentos a la llamada de retorno, el atacante consigue system('id; ...').

Nota: Los atacantes avanzados encadenarán esto con yii\caching\fileCache gadgets para escribir un webshell PHP persistente (por ejemplo, shell.php) en la raíz web pública (/web/activos/), saltándose los límites de ejecución efímera.

Por qué fallan los escáneres heredados

Detectar CVE-2025-32432 es una pesadilla para las herramientas tradicionales de pruebas dinámicas de seguridad de aplicaciones (DAST).

  • Ceguera sintáctica: La carga útil es JSON sintácticamente válido. No contiene tokens SQL (OR 1=1) o vectores XSS (<script>). Los WAFs configurados para OWASP Top 10 por defecto normalmente dejarán pasar esto.
  • Ceguera contextual: Un escáner ve un objeto JSON. No entiende que la clave clase tiene un significado semántico para el framework PHP backend. Para un escáner, clase es simplemente otro campo de datos como nombre de usuario o correo electrónico. No puede inferir la Instanciación de objetos efecto secundario.

Detección basada en IA: La ventaja de Penligent

Aquí es donde Penligent.ai representa un cambio de paradigma en las pruebas de seguridad ofensivas. Penligent va más allá de la concordancia de patrones para emplear Análisis semántico consciente del contexto.

  1. Huella digital del marco y mapa lógico

Los agentes de IA de Penligent identifican primero la pila tecnológica subyacente (Craft CMS / Yii2). Fundamentalmente, la IA "conoce" los sumideros peligrosos específicos de este marco. Entiende que en Yii2, Yii::createObject es un punto de control crítico, igual que pickle.load lo es para Python o unserialize lo es para PHP genérico.

  1. Sondeo inteligente (Fuzzing con intención)

En lugar de pulverizar ciegamente caracteres aleatorios, Penligent construye Sondas Lógicas.

  • Sonda 1: Inyectar {"clase": "yii\\\\helpers\\\\VarDumper"}.
  • Observación: ¿Cambia el tiempo de respuesta? ¿El mensaje de error hace referencia a "VarDumper"?
  • Inferencia: Si la aplicación intenta cargar la clase, la IA confirma que la clase clase está siendo interpretado por el contenedor DI.
  1. Verificación no destructiva

Una vez confirmado el vector de inyección, Penligent no necesita ejecutar rm -rf / para demostrar la vulnerabilidad. Puede generar una cadena de gadgets benigna (por ejemplo, una que simplemente realice una búsqueda DNS a un oyente fuera de banda) para demostrar la capacidad de RCE con una certeza 100% y riesgo cero para la infraestructura de producción. Esto permite a los equipos de seguridad validar los parches CVE-2025-32432 sin interrumpir las operaciones empresariales.

Vulnerabilidades de alto impacto relacionadas

Para comprender plenamente el panorama de las amenazas, los ingenieros de seguridad deben correlacionar CVE-2025-32432 con precedentes históricos. La mecánica de Inyección de envases no son exclusivas de Craft CMS.

ID CVESoftware de destinoMecanismo técnico
CVE-2023-41892CMS artesanalRCE a través de ImageMagick lógica de instanciación de objetos en el condiciones parámetro.
CVE-2019-15488Marco Yii2Deserialización insegura en yii\db\\BatchQueryResult __despertar método.

Estas vulnerabilidades comparten un ADN común: La confianza de los tipos de entrada.

Reparación y defensa en profundidad

La mitigación de CVE-2025-32432 requiere un enfoque multicapa que incluye correcciones de código, endurecimiento de la configuración y protección en tiempo de ejecución.

1. Arreglo a nivel de código (la causa raíz)

La solución definitiva es aplicar Comprobación estricta de tipos. Los desarrolladores nunca deben pasar matrices de entrada de usuario sin procesar directamente a Yii::createObject.

  • Lista de denegados: Desactivar explícitamente el clase de las matrices de entrada antes de procesarlas.
  • Lista de permitidos: Si la instanciación dinámica es necesaria, valide la clase solicitada contra una estricta lista blanca de clases seguras.

PHP

// Implementación segura $config = json_decode($json, true); unset($config['class']); // Evitar la inyección de objetos $object = Yii::createObject(array_merge(['class' => SafeClass::class], $config));

2. Fortalecimiento en tiempo de ejecución (php.ini)

Aunque un atacante instancie una clase, el RCE es imposible si las funciones subyacentes del sistema están neutralizadas. Configure su php.ini para desactivar las funciones de ejecución peligrosas:

Ini, TOML

disable_functions = system, exec, shell_exec, passthru, proc_open, popen, pcntl_exec

3. Parcheo inmediato

Aplique inmediatamente la última actualización de Craft CMS. El parche del proveedor para CVE-2025-32432 probablemente introduce un filtro a nivel de marco que impide la clase en acciones específicas del controlador.

Conclusión

CVE-2025-32432 es un claro recordatorio de que a medida que los frameworks se vuelven más abstractos y potentes, introducen complejas superficies de ataque lógico. La inyección de contenedores es el "Inyección SQL de la década de 2020"-un fallo no en el código que escribes, sino en cómo configuras la magia del framework.

Para el ingeniero de seguridad empedernido, la lección está clara: Validación de entradas debe extenderse más allá de los valores de los datos tipos y estructuras. Si permite que un usuario defina el estructura de un objeto, ya has perdido la partida.

Referencias fiables

Comparte el post:
Entradas relacionadas
es_ESSpanish