En-tête négligent

Anatomie de CVE-2025-32432 : Injection d'un conteneur Yii2 dans le CMS Craft

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.

  1. Ingestion : Le contrôleur accepte une requête POST contenant un transformer de la gamme.
  2. Normalisation : Les données sont transmises à Craft::$app->getAssetTransforms()->normalizeTransform().
  3. 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.

Anatomie de CVE-2025-32432 : Injection d'un conteneur Yii2 dans le CMS Craft

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 entier 1042 est 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.

Injection de conteneurs Yii2 dans le CMS Craft

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

  1. 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.
  2. 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" :

  1. Prise d'empreintes digitales : L'agent identifie le X-Powered-By : Craft CMS l'en-tête.
  2. 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.
  3. Test d'hypothèse : L'agent tente une demande de transformation bénigne avec l'identifiant extrait. S'il reçoit un 200 OK ou un Exception logique (plutôt qu'un 404), il confirme que l'identifiant est valide.
  4. 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 CVECibleVecteurComplexitéPourquoi c'est important
CVE-2025-32432Artisanat CMSInjection d'objetsMoyenDémontre l'échec des conteneurs DI non validés.
CVE-2024-21626runcÉvasion de conteneursHautDéfaut fondamental dans l'isolation de l'exécution du conteneur.
CVE-2024-23897JenkinsLecture arbitraire d'un fichierFaibleAbus des fonctionnalités de l'analyseur CLI (args4j).
CVE-2024-3400Palo Alto PAN-OSInjection de commandeFaibleRCE 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 :

Partager l'article :
Articles connexes
fr_FRFrench