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).

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:
clase: Ordenamos al contenedor DI que instancieyii\rest\\\IndexAction.checkAccess: Esta es nuestra propiedad peligrosa. En este gadget específico, elcheckAccessestá diseñada para contener una llamada. La establecemos ensistema.- 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 encheckAccesscon argumentos suministrados por el contexto (o atacante). - 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
claseclave. Un escáner estándar no entiende queclasemapas aYii::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.
- 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). - 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. - 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:
- Comprobación estricta de tipos: Nunca pase matrices de entrada de usuario sin procesar a
Yii::createObject. Valide siempre que elclaseestá ausente (codificada en el backend) o estrictamente permitida. - Actualizar Craft CMS: Aplique inmediatamente los últimos parches. Es probable que el proveedor haya reforzado
acciónlógica de procesamiento para rechazar definiciones de clase arbitrarias. - Desactivar funciones peligrosas: En su
php.iniUtilicedesactivar_funcionespara bloquearsistema,exec,paso a través deyproc_openpara 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".

