
PoC Python e catena di exploit per CVE-2026-82531: avvelenamento della cache dei template Smarty tramite marcatori SmartyNocache contraffatti che porta all'esecuzione di codice PHP, con check, payload e laboratorio Docker.
PoC in Python 3 per CVE-2026-82531 — smarty-php/smarty — code injection (CWE-94) tramite marcatori SmartyNocache falsificati in extends + rigenerazione della cache dei template → RCE su include() della cache.
| Campo | Valore |
|---|---|
| CVE | CVE-2026-82531 |
| Prodotto | Smarty motore di template PHP |
| Affette | < 4.5.8; 5.0.0 – 5.8.4 |
| Corrette | 4.5.8, 5.8.5 |
| CWE | CWE-94 — Controllo improprio della generazione di codice |
| CVSS 4.0 | 9.2 Critico (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 |
| Catalogo PoCbit | https://pocbit.org/pocs/ |
| Pagina PoCbit | https://pocbit.org/pocs/cve-2026-82531 |
| Marcatore di verifica | POCBIT-82531-OK (output del comando in base64 nel corpo HTTP) |
| Avvisi | GHSA-3w63-v7pm-cq9x |
Focus dell'exploit: poc.py exploit esegue warm → svuotamento cache → poison (POST name=) → trigger; check, payload, Docker lab/ (Smarty 5.8.4). Output: hits.txt, exploited.txt.
Smarty compila i template in PHP e può scrivere output in cache. Quando i template usano extends: / ereditarietà dei blocchi, la funzione compilata di livello superiore può lasciare nocache_hash non impostato dopo che un nuovo worker PHP carica i file compilati dal disco.
Durante la rigenerazione della cache, Smarty_Internal_Runtime_UpdateCache costruisce una regex che separa le regioni "nocache". Un hash null produce un'alternativa regex vuota, quindi i dati controllati dall'attaccante tramite assign() possono falsificare:
/*%%SmartyNocache:%%*/ <?php ... ?> /*/%%SmartyNocache:%%*/
Quel blocco viene copiato alla lettera nel file PHP della cache generato (la normale neutralizzazione dei tag PHP viene saltata). La richiesta successiva che include il file di cache esegue il PHP iniettato → esecuzione di codice remoto.
exploit)| Fase | Azione |
|---|---|
| 1 Riscaldamento | name=world benigno → compilazione + cache iniziale |
| 2 Pulizia | Rimuove solo i file di cache (i template compilati restano) — il lab espone ?lab_clear_cache=1 |
| 3 Avvelenamento | name=<SmartyNocache falsificato + PHP shell_exec> → cache avvelenata scritta |
| 4 Attivazione | name=benign benigno → include() esegue il PHP iniettato; il corpo contiene POCBIT-82531-OK:<base64> |
I target reali richiedono: caching attivo, template extends, assegnazione controllata dall'utente, cache miss mentre la directory di compilazione è popolata (TTL, riavvio o flush da parte dell'amministratore).
Nelle applicazioni che utilizzano Smarty con extends: / ereditarietà + cache, quando nocache_hash è null, il blocco falso SmartyNocache assegnato dall'attaccante viene scritto nel file PHP della cache come PHP grezzo; alla richiesta successiva include → RCE. Pacchetto PoCbit: lab Docker + catena completa 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"
Dopo la patch: eliminare/rigenerare tutti i file di cache dei template.
Solo ricerca sulla sicurezza autorizzata e sistemi di tua proprietà o per i quali hai il permesso di eseguire test.
NocacheHashInjectionTest.php upstream (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