
Prueba de concepto (PoC) en Python y cadena de explotación para CVE-2026-82531: envenenamiento de la caché de plantillas de Smarty mediante marcadores SmartyNocache falsificados que conduce a la ejecución de código PHP, con comprobación, payload y laboratorio Docker.
PoC en Python 3 para CVE-2026-82531 — smarty-php/smarty — inyección de código (CWE-94) mediante marcadores SmartyNocache falsificados en extends + regeneración de la caché de plantillas → RCE en el include() de la caché.
| Campo | Valor |
|---|---|
| CVE | CVE-2026-82531 |
| Producto | Motor de plantillas PHP Smarty |
| Afectados | < 4.5.8; 5.0.0 – 5.8.4 |
| Corregido | 4.5.8, 5.8.5 |
| CWE | CWE-94 — Control inadecuado de la generación de código |
| CVSS 4.0 | 9.2 Crítica (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 Alta |
| Catálogo de PoCbit | https://pocbit.org/pocs/ |
| Página de PoCbit | https://pocbit.org/pocs/cve-2026-82531 |
| Marcador de verificación | POCBIT-82531-OK (salida del comando en base64 en el cuerpo HTTP) |
| Avisos | GHSA-3w63-v7pm-cq9x |
Enfoque del exploit: poc.py exploit ejecuta calentamiento → limpieza de caché → envenenamiento (POST name=) → activación; check, payload, Docker lab/ (Smarty 5.8.4). Salidas: hits.txt, exploited.txt.
Smarty compila las plantillas a PHP y puede escribir la salida en caché. Cuando las plantillas usan extends: / herencia de bloques, la función compilada de nivel superior puede dejar nocache_hash sin establecer después de que un nuevo worker de PHP cargue los archivos compilados desde el disco.
Durante la regeneración de la caché, Smarty_Internal_Runtime_UpdateCache construye una regex que divide las regiones "nocache". Un hash nulo produce una alternativa de regex vacía, por lo que los datos controlados por el atacante mediante assign() pueden falsificar:
/*%%SmartyNocache:%%*/ <?php ... ?> /*/%%SmartyNocache:%%*/
Ese bloque se copia literalmente en el archivo PHP de caché generado (se omite la neutralización normal de etiquetas PHP). La siguiente solicitud que incluya el archivo de caché ejecuta el PHP inyectado → ejecución remota de código.
exploit)| Fase | Acción |
|---|---|
| 1 Calentar | name=world benigno → compilar + caché inicial |
| 2 Limpiar | Eliminar solo los archivos de caché (las plantillas compiladas permanecen) — el laboratorio expone ?lab_clear_cache=1 |
| 3 Envenenar | name=<SmartyNocache falsificado + shell_exec de PHP> → caché envenenada escrita |
| 4 Disparar | name=benign benigno → include() ejecuta el PHP inyectado; el cuerpo contiene POCBIT-82531-OK:<base64> |
Los objetivos reales necesitan: caché activada, plantillas extends, asignación controlada por el usuario, fallo de caché mientras el directorio de compilación está poblado (TTL, reinicio o vaciado por el administrador).
En aplicaciones que usan Smarty extends: / herencia + caché, cuando nocache_hash es null, el bloque falso SmartyNocache que el atacante assigna se escribe como PHP en bruto en el archivo PHP de caché; en la siguiente petición, include → RCE. Paquete PoCbit: laboratorio Docker + cadena 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"
Tras la aplicación de parches: elimine/regenerar todos los archivos de caché de plantillas.
Solo investigación de seguridad autorizada y sistemas de su propiedad o para los que tenga permiso de prueba.
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