Dans la hiérarchie des vulnérabilités du web, peu de choses attirent l'attention immédiate d'un opérateur de l'équipe rouge comme un Injection d'objets en PHP (POI) exposé à des utilisateurs non authentifiés.
CVE-2025-32432 est exactement cela. Avec un Score CVSS v3.1 de 10.0Cette vulnérabilité dans Craft CMS n'est pas un simple bogue ; il s'agit d'un cours magistral sur la façon dont les conteneurs modernes d'injection de dépendance peuvent être utilisés comme arme contre les applications qu'ils supportent.
Pour l'ingénieur en sécurité pur et dur, l'intérêt ici n'est pas seulement le RCE, mais le mécanisme. Il met en évidence une défaillance fondamentale dans la manière dont le Cadre Yii2 (qui alimente Craft) traite les tableaux de configuration transmis par l'entrée de l'utilisateur. Cette analyse dissèque la trace de la pile de la vulnérabilité, les chaînes de gadgets spécifiques nécessaires à l'exploitation et la raison pour laquelle cette CVE spécifique représente le point de rupture pour les scanners DAST traditionnels, nécessitant la montée en puissance d'agents offensifs pilotés par l'IA.
Le défaut d'architecture : quand le bricolage tourne mal
Pour comprendre CVE-2025-32432, il faut comprendre l'architecture de Craft CMS. Craft s'appuie fortement sur les modèles de localisation de service et d'injection de dépendance de Yii2.
La vulnérabilité réside dans le Contrôleur des actifs, en particulier le actionGenerateTransform méthode. Ce point d'accès est conçu pour permettre au frontend de demander des transformations d'images (recadrage, redimensionnement) à la volée.
L'évier vulnérable
Le flux de code suit un chemin dangereux depuis l'entrée de l'utilisateur jusqu'à l'instanciation de l'objet.
- Ingestion : Le contrôleur accepte une requête POST contenant un
transformerde la gamme. - Normalisation : Les données sont transmises à
Craft::$app->getAssetTransforms()->normalizeTransform(). - Exécution (l'évier) : La méthode appelle finalement
Craft::createObject($config).
Dans Yii2, créerObjet est une enveloppe puissante. Si le $config contient un classe Yii2 tentera d'instancier cette classe spécifique, en remplissant ses propriétés publiques avec les clés restantes du tableau.
PHP
`// Flux de vulnérabilité simplifié public function actionGenerateTransform() { $transformId = Craft::$app->getRequest()->getBodyParam('transformId') ; // L'attaquant contrôle l'ensemble du tableau de configuration $transformConfig = Craft::$app->getRequest()->getBodyParam('transform') ;
// FATAL FLAW : No whitelist validation on the 'class' parameter
$object = Craft::createObject($transformConfig) ;
return $object->transform() ;
}`
C'est la définition de Désérialisation non sécurisée (CWE-502), même s'il utilise la configuration JSON/Array plutôt que la configuration native unserialize(). Le résultat est identique : c'est l'attaquant qui dicte le flux de contrôle.

La chaîne des exploits : La fabrication du gadget
Les script kiddies échoueront à ce CVE parce que le simple fait de pointer une charge utile vers le point de terminaison renvoie un 400 Mauvaise demande. Une exploitation réussie nécessite une compréhension nuancée de l'état de l'application.
Phase 1 : Reconnaissance contextuelle (identification des actifs)
Les actionGenerateTransform a une dépendance stricte : elle nécessite un assetId (un nombre entier représentant une image téléchargée sur le CMS).
Si le assetId n'existe pas, le code lève une exception avant il atteint les personnes vulnérables créerObjet appel.
- Le piège : Les scanners traditionnels (Nessus, Nuclei) envoient des charges utiles à l'aveugle. Ils utilisent des identifiants aléatoires ou n'en utilisent pas. Ils reçoivent des erreurs et marquent la cible comme "sûre".
- Le contournement : Un attaquant sophistiqué (ou un agent) scrute le code source HTML public, à la recherche de modèles typiques d'actifs Craft (par ex,
/assets/images/1042/logo.png). Le nombre entier1042est la clé qui permet de débloquer le chemin d'exécution.
Phase 2 : La chaîne des gadgets
Une fois la porte déverrouillée à l'aide d'un numéro d'identification valide, l'attaquant doit fournir la charge utile. Puisque nous pouvons instancier tous nous avons besoin d'un "Gadget" - une classe qui déclenche une activité malveillante au cours de son cycle de vie (généralement le __construire, __destructou init).
Dans le cadre de CVE-2025-32432, les chercheurs ont identifié des chaînes utilisant \N- Casse-têteHttp\NClient (s'il est installé) ou les classes de cache natives de Yii2.
Un vecteur courant consiste à utiliser le yii\rbac\\NPhpManager ou d'abuser de la Voir pour inclure des fichiers locaux. Cependant, la méthode RCE la plus directe consiste à tirer parti de la fonction Craft\NConfig combiné à des enveloppes de protocole PHP.
La structure de la charge utile de l'exploit :
JSON
{"assetId" : "1042", "transform" : {"class" : "craft\\\\base\\\\ImageTransform", "width" : "100", "height" : "100", "format" : "php", "quality" : {"class" : "yii\\\\rest\\\\IndexAction", "checkAccess" : "system", "id" : "whoami" } } }
Note : La chaîne de gadgets réelle peut varier en fonction des dépendances spécifiques de Composer installées sur le serveur, ce qui nécessite un ajustement dynamique de la charge utile.

L'échec des outils de sécurité statique
Cette vulnérabilité met en évidence les limites de la génération actuelle d'outils de sécurité.
- L'apatridie : Les scanners traditionnels sont sans état. Ils ne se "souviennent" pas qu'ils ont trouvé un numéro d'identification d'actif sur la page d'accueil et ne "décident" pas de l'utiliser dans une requête POST dix minutes plus tard.
- Cécité du contexte : Ils ne peuvent pas déduire la logique commerciale. Ils considèrent l'identifiant d'une image comme un simple numéro, et non comme une clé indispensable à une chaîne d'exploitation.
C'est là que l'industrie s'oriente Sécurité agentique.
Raisonnement automatisé : L'approche pénligente
Lorsque nous avons analysé CVE-2025-32432 à PenligentNous avons constaté que le fuzzing standard avait un taux de réussite de 0%. Pour valider cette vulnérabilité de manière fiable, nous avons dû déployer un agent d'intelligence artificielle capable de raisonner en plusieurs étapes.
Les Penligent pour ce CVE montre la différence entre "analyse" et "test de pénétration" :
- Prise d'empreintes digitales : L'agent identifie le
X-Powered-By : Craft CMSl'en-tête. - L'analyse sémantique : Au lieu de procéder à un fuzzing, l'agent analyse le DOM de la page d'atterrissage. Il identifie
<img src="...">et effectue une correspondance regex de la structure de l'URL afin d'extraire les identifiants potentiels des actifs. - Test d'hypothèse : L'agent tente une demande de transformation bénigne avec l'identifiant extrait. S'il reçoit un
200 OKou unException logique(plutôt qu'un404), il confirme que l'identifiant est valide. - Mutation de la charge utile : L'agent construit la charge utile JSON. Si le serveur utilise une version plus récente de PHP qui supprime certains wrappers, l'agent modifie la chaîne de gadgets en temps réel pour tenter d'autres injections d'objets.
Cette capacité à logique de la chaîne-trouver une clé à l'étape A et l'utiliser à l'étape B - est ce qui distingue les pirates humains (et agentiques) des scripts automatisés.
Remédiation et défense
Si vous défendez une installation Craft CMS, une action immédiate est nécessaire.
1. Patching
Le fournisseur a mis en place une validation stricte dans les versions suivantes. Assurez-vous que vous êtes en cours d'exécution :
- Craft CMS 3.x -> 3.9.15+
- Craft CMS 4.x -> 4.14.15+
- Craft CMS 5.x -> 5.6.17+
2. Configuration du WAF
Si l'application de correctifs n'est pas possible dans l'immédiat (en raison du gel du code existant), vous devez bloquer le vecteur d'attaque spécifique au niveau du WAF.
Exemple de règle 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', \\N chain" SecRule ARGS_POST:transform "@rx class"
Cette règle bloque toute demande adressée au point final de transformation qui tente de définir un paramètre "class" dans le corps du message POST.
Comparaison de la vulnérabilité à fort impact (2024-2025)
Pour replacer CVE-2025-32432 dans son contexte, il est utile de le comparer à d'autres défaillances architecturales récentes dans des cadres majeurs.
| ID CVE | Cible | Vecteur | Complexité | Pourquoi c'est important |
|---|---|---|---|---|
| CVE-2025-32432 | Artisanat CMS | Injection d'objets | Moyen | Démontre l'échec des conteneurs DI non validés. |
| CVE-2024-21626 | runc | Évasion de conteneurs | Haut | Défaut fondamental dans l'isolation de l'exécution du conteneur. |
| CVE-2024-23897 | Jenkins | Lecture arbitraire d'un fichier | Faible | Abus des fonctionnalités de l'analyseur CLI (args4j). |
| CVE-2024-3400 | Palo Alto PAN-OS | Injection de commande | Faible | RCE non authentifié sur les dispositifs de sécurité en périphérie. |
Conclusion
CVE-2025-32432 est un rappel que dans le développement web moderne, "riche en fonctionnalités" signifie souvent "riche en surface d'attaque". La commodité de l'interface de Yii2 créerObjet offrait aux développeurs une certaine flexibilité, mais donnait aux attaquants un pistolet chargé.
Pour l'ingénieur en sécurité, cette vulnérabilité souligne la fin de l'ère de l'analyse "point-and-shoot". Les vulnérabilités deviennent plus logiques, plus contextuelles et plus dépendantes de l'état. Pour s'en prémunir, il faut des outils capables de penser, de raisonner et de s'adapter aussi rapidement que les attaquants.
Références et lectures complémentaires :

