Cabecera Penligente

La clase fantasma: Arma de inyección de contenedores CVE-2025-32432 Yii2 en Craft CMS

En la jerarquía de vulnerabilidades de PHP, Inyección de dependencias (DI) Inyección de contenedores se sitúa en lo más alto: complejo de detectar, elegante de explotar y devastador en su impacto.

La divulgación de CVE-2025-32432 dirigiéndose a CMS artesanal (y, por extensión, el Marco Yii2) sirve como brutal recordatorio: cuando la entrada del usuario controla la instanciación de la clase, la aplicación pertenece al atacante.

Mientras que muchos escáneres de seguridad marcan esto como un "Problema de configuración", los ingenieros de seguridad de élite lo reconocen como lo que realmente es: Ejecución remota de código (RCE) a través de la deserialización insegura de objetos. Este artículo realiza una autopsia técnica de la vulnerabilidad, reconstruyendo la cadena de gadgets y demostrando cómo el análisis basado en IA es la única forma de detectar estos fallos lógicos a escala.

La arquitectura del fracaso: Dentro del contenedor Yii2

Para entender CVE-2025-32432, hay que entender el corazón de Yii2: el módulo yii\di\\\\Contenedor.

Craft CMS se basa en el contenedor DI de Yii2 para gestionar las dependencias de clases. El contenedor permite a los desarrolladores configurar objetos utilizando matrices. Por ejemplo:

PHP

// Uso legítimo $object = Yii::createObject([ 'class' => 'app\\models\\ser', 'name' => 'Admin', ]);

La vulnerabilidad surge cuando un atacante puede influir en este array de configuración. Si una acción de controlador toma una entrada JSON sin procesar y la pasa ciegamente a Yii::createObject() o Yii::$container->set()el atacante puede forzar a la aplicación a instanciar cualquier clase disponible en la ruta de carga automática, con cualquier propiedad valores.

La superficie de ataque

El fallo suele residir en los controladores de los CMS Craft que gestionan las peticiones API o las configuraciones de los plugins, donde la limpieza de las entradas se centra en el XSS (etiquetas HTML) en lugar de en la lógica (definiciones de clases).

  • Fuente: JSON suministrado por el usuario (por ejemplo, POST /actions/vulnerable-plugin/save-config).
  • Fregadero: Yii::createObject($userInput).
La clase fantasma: Arma de inyección de contenedores CVE-2025-32432 Yii2 en Craft CMS

Construir la cadena de muerte: El PdC

La explotación requiere encontrar un Gadget-una clase que realiza operaciones peligrosas (como escritura de archivos o ejecución de comandos) en sus métodos del ciclo de vida (__construir, init, __destructo __despertar).

En el contexto de CVE-2025-32432, aprovechamos una cadena de gadgets común que se encuentra en el ecosistema Yii2 y que incluye yii\rest\\\IndexAction o clases similares con muchas llamadas.

El concepto

Queremos instanciar una clase que nos permita ejecutar una función callback de PHP (como sistema o exec) sobre un argumento suministrado.

Carga útil JSON armada

A continuación se muestra una Prueba de Concepto (PoC) conceptual que demuestra cómo desencadenar RCE inyectando una definición de clase maliciosa.

JSON

{ "rce_trigger": { "class": "yii\\\\rest\\\\IndexAction", "checkAccess": "system", "id": "rce", "controller": { "class": "yii\\\\web\\\\Controller", "id": "dummy" }, "modelClass": "yii\\\\base\\\\Model", "run": "id; uname -a" } }

Desglose de la carga útil:

  1. clase: Ordenamos al contenedor DI que instancie yii\rest\\\IndexAction.
  2. checkAccess: Esta es nuestra propiedad peligrosa. En este gadget específico, el checkAccess está diseñada para contener una llamada. La establecemos en sistema.
  3. Activación de la ejecución: Cuando la aplicación procesa este objeto (a menudo durante el ejecutar() ejecución de métodos o validación de propiedades), invoca la devolución de llamada almacenada en checkAccess con argumentos suministrados por el contexto (o atacante).
  4. Resultado: El servidor ejecuta system('id; uname -a').

Nota: En un entorno reforzado, los atacantes podrían encadenar esto con yii\caching\fileCache para escribir un PHP web shell en el web/ directorio.

Por qué los escáneres tradicionales se lo pierden

Detectar CVE-2025-32432 es notoriamente difícil para las herramientas DAST heredadas.

  • Sin firma: La carga útil es JSON válido. No contiene sintaxis de inyección SQL (OR 1=1) o etiquetas XSS ().
  • Depende del contexto: La vulnerabilidad no está en la entrada en sí, sino en cómo el marco interpreta la clase clave. Un escáner estándar no entiende que clase mapas a Yii::createObject.

Detección basada en IA: La ventaja de Penligent

Aquí es donde Penligent.ai cambia el paradigma. Penligent utiliza Agentes de IA conscientes del contexto que entienden la lógica específica del marco.

  1. Marco de reconocimiento: Los agentes de Penligent identifican que el objetivo está ejecutando Craft CMS / Yii2. Conoce los "Dangerous Sinks" específicos de este framework (e.g., Yii::createObject).
  2. Inferencia lógica: En lugar de realizar una comprobación ciega, la IA analiza el esquema de la API. Si ve un objeto JSON que acepta parámetros similares a los de configuración, inyecta de forma inteligente "cargas útiles de sondeo", como intentar crear instancias de una clase benigna como yii\helpers\\VarDumper-para comprobar si se puede acceder al contenedor.
  3. Verificación automatizada: Si el sondeo tiene éxito (por ejemplo, la aplicación se comporta de forma diferente o devuelve un error específico que indica la instanciación de la clase), Penligent marca el endpoint como vulnerable a Inyección de envases y genera la carga útil RCE específica para la validación de remediación.

Reparación y defensa

Asegurar Craft CMS contra CVE-2025-32432 y ataques DI similares:

  1. Comprobación estricta de tipos: Nunca pase matrices de entrada de usuario sin procesar a Yii::createObject. Valide siempre que el clase está ausente (codificada en el backend) o estrictamente permitida.
  2. Actualizar Craft CMS: Aplique inmediatamente los últimos parches. Es probable que el proveedor haya reforzado acción lógica de procesamiento para rechazar definiciones de clase arbitrarias.
  3. Desactivar funciones peligrosas: En su php.iniUtilice desactivar_funciones para bloquear sistema, exec, paso a través dey proc_open para mitigar el impacto de la RCE.

Conclusión

CVE-2025-32432 es un duro recordatorio de que los frameworks PHP modernos, aunque potentes, introducen complejas superficies de ataque. La inyección en contenedores es la "inyección SQL de la década de 2020", un fallo lógico que otorga un control total.

Para los ingenieros de seguridad, la lección está clara: si dejas que los usuarios definan los objetos, ellos definirán tu destrucción. Ya no basta con validar la "Forma" de los datos; hay que validar el "Tipo".

Referencias fiables

Comparte el post:
Entradas relacionadas
es_ESSpanish