
Verificador de prova de conceito apenas local para CVE-2026-100671, reproduzindo a divulgação e a reprodução de cookies de sessão do cache de páginas Twig do Grav contra alvos de loopback.
Verificador mínimo, apenas local, para a tomada de controle de sessão via
content-Twig/page-cache do Grav, corrigida no Grav 2.0.25.
Avisos:
O exploit.py é deliberadamente restrito a alvos de loopback:
127.0.0.1::1localhostEle recusa hosts remotos, segue apenas redirecionamentos de loopback, usa clientes HTTP da biblioteca padrão do Python, aplica timeouts de requisição e nunca imprime bearer tokens, cookies ou corpos de resposta.
Use apenas contra uma instância do Grav que você possui ou está explicitamente autorizado a testar. O script cria uma página de prova pública no laboratório local. Remova essa página após o teste se o laboratório mantiver conteúdo entre execuções.
get_cookie() lê o cookie de sessão do administrador visitante no lado do servidor.A conta de escrita de páginas precisa apenas do caminho de escrita de baixo
privilégio documentado. Ela não precisa de api.pages.read, admin.* ou acesso
de super-admin. O admin vítima só precisa visitar a página pública uma vez.
2.0.19 até 2.0.24: vulnerável com a configuração padrão de content-Twig
fornecida.2.0.0 até 2.0.18, e 1.7.x: afetado apenas quando o Twig de conteúdo
foi explicitamente habilitado.2.0.25: corrigido.Execute um laboratório local do Grav com:
Este repositório de dois arquivos não provisiona Grav, PHP, plugins ou contas.
Defina as credenciais por meio de variáveis de ambiente para que nunca entrem no controle de versão:
export GRAV_BASE_URL=http://127.0.0.1:8080
export GRAV_WRITER_USERNAME=low
export GRAV_WRITER_PASSWORD='local-writer-password'
export GRAV_ADMIN_USERNAME=admin
export GRAV_ADMIN_PASSWORD='local-admin-password'
python3 exploit.py
A URL base deve permanecer em loopback. A rota padrão é aleatória. Uma rota fixa pode ser selecionada ao comparar execuções:
python3 exploit.py --route /cookie-proof-24
Resultado vulnerável esperado:
page_create_status=201
admin_login_status=200
victim_page_status=200
attacker_page_status=200
cached_victim_cookie_visible_to_attacker=yes
admin_cookie_value_match=yes
replayed_cookie_api_status=200
result=VULNERABLE
O comando sai com 0 quando o resultado esperado é reproduzido, 1 quando não
é reproduzido, e 2 para um erro de configuração ou transporte.
Execute o mesmo comando contra o Grav 2.0.25:
python3 exploit.py --expect fixed
Comportamento corrigido esperado: nenhum valor de sessão visível ao atacante e
nenhuma reprodução de sessão bem-sucedida. Um resultado corrigido limpo sai com
0 com --expect fixed.
Atualize para o Grav 2.0.25 ou posterior. Para implantações mais antigas, o
aviso lista estes controles temporários:
security.twig_content.process_enabled: false; ousystem.pages.never_cache_twig: true;Não trate HttpOnly, Secure ou SameSite como uma correção: a leitura
vulnerável do cookie ocorre no lado do servidor durante a renderização do Twig.
Reportado por canhieu. Este repositório é um auxílio de reprodutibilidade para o aviso já público, não um scanner remoto nem uma ferramenta de coleta de credenciais.