
PoC em Python e cadeia de exploração para CVE-2026-82531: envenenamento de cache de template Smarty por meio de marcadores SmartyNocache forjados, levando à execução de código PHP, com verificação, payload e laboratório Docker.
PoC em Python 3 para CVE-2026-82531 — smarty-php/smarty — injeção de código (CWE-94) por meio de marcadores SmartyNocache forjados em extends + regeneração do cache de templates → RCE no include() do cache.
| Campo | Valor |
|---|---|
| CVE | CVE-2026-82531 |
| Produto | Smarty mecanismo de templates PHP |
| Afetado | < 4.5.8; 5.0.0 – 5.8.4 |
| Corrigido | 4.5.8, 5.8.5 |
| CWE | CWE-94 — Controle inadequado da geração de código |
| CVSS 4.0 | 9.2 Crítico (CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N) |
| CVSS 3.1 | 8.1 Alto |
| Catálogo PoCbit | https://pocbit.org/pocs/ |
| Página PoCbit | https://pocbit.org/pocs/cve-2026-82531 |
| Marcador de verificação | POCBIT-82531-OK (saída do comando em base64 no corpo HTTP) |
| Avisos | GHSA-3w63-v7pm-cq9x |
Foco do exploit: poc.py exploit executa aquecimento → limpeza de cache → envenenamento (POST name=) → disparo; check, payload, Docker lab/ (Smarty 5.8.4). Saídas: hits.txt, exploited.txt.
O Smarty compila templates para PHP e pode gravar a saída em cache. Quando os templates usam extends: / herança de blocos, a função compilada de nível superior pode deixar nocache_hash não definido após um novo worker PHP carregar os arquivos compilados do disco.
Durante a regeneração do cache, Smarty_Internal_Runtime_UpdateCache constrói uma regex que divide as regiões "nocache". Um hash nulo produz uma alternativa de regex vazia, de modo que dados controlados pelo atacante via assign() podem forjar:
/*%%SmartyNocache:%%*/ <?php ... ?> /*/%%SmartyNocache:%%*/
Esse bloco é copiado literalmente para o arquivo PHP de cache gerado (a neutralização normal de tags PHP é ignorada). A próxima requisição que incluir o arquivo de cache executa o PHP injetado → execução remota de código.
exploit)| Fase | Ação |
|---|---|
| 1 Aquecimento | name=world benigno → compilação + cache inicial |
| 2 Limpeza | Remover apenas os arquivos de cache (os templates compilados permanecem) — o lab expõe ?lab_clear_cache=1 |
| 3 Envenenamento | name=<SmartyNocache forjado + shell_exec PHP> → cache envenenado gravado |
| 4 Disparo | name=benign benigno → include() executa o PHP injetado; o corpo contém POCBIT-82531-OK:<base64> |
Alvos reais precisam de: cache ativado, templates extends, assign controlado pelo usuário, cache miss enquanto o diretório de compilação está populado (TTL, reinício ou flush do admin).
Em aplicações que usam Smarty extends: / herança + cache, quando nocache_hash é null, o bloco falso SmartyNocache atribuído pelo atacante é gravado no arquivo PHP de cache como PHP bruto; na requisição seguinte, include → RCE. Pacote PoCbit: laboratório Docker + cadeia completa de exploit.
cd CVE-2026-82531
pip install -r requirements.txt
docker compose up --build -d
python poc.py check http://127.0.0.1:8088
python poc.py exploit --url http://127.0.0.1:8088 -c "id"
python poc.py exploit -i targets.example.txt -w 10 -c id
python poc.py payload -c "id"
Após a aplicação do patch: exclua/regenere todos os arquivos de cache de template.
Pesquisa de segurança autorizada e sistemas que você possui ou tem permissão para testar apenas.
NocacheHashInjectionTest.php (Smarty 5.8.5)CVE-2026-82531 — Smarty <4.5.8 / 5.x<5.8.5 cache-poisoning RCE (CWE-94, CVSS 4.0 9.2 AT:P). PoCbit PoC: extends+inheritance null nocache_hash → forged SmartyNocache marker in assign() → PHP in cache include. check/exploit/payload, Docker lab 5.8.4, hits.txt & exploited.txt. Fix 4.5.8 / 5.8.5. Marker POCBIT-82531-OK. https://pocbit.org/pocs/cve-2026-82531