
Python PoC и цепочка эксплойта для CVE-2026-82531: отравление кэша шаблонов Smarty через поддельные маркеры SmartyNocache, приводящее к выполнению PHP-кода, с проверкой, полезной нагрузкой и Docker-лабораторией.
Python 3 PoC для CVE-2026-82531 — smarty-php/smarty — внедрение кода (CWE-94) через поддельные маркеры SmartyNocache в extends + регенерацию кэша шаблонов → RCE при include() кэша.
| Поле | Значение |
|---|---|
| CVE | CVE-2026-82531 |
| Продукт | Smarty — шаблонизатор PHP |
| Уязвимые версии | < 4.5.8; 5.0.0 – 5.8.4 |
| Исправлено в | 4.5.8, 5.8.5 |
| CWE | CWE-94 — Improper Control of Code Generation |
| CVSS 4.0 | 9.2 Critical (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 High |
| Каталог PoCbit | https://pocbit.org/pocs/ |
| Страница PoCbit | https://pocbit.org/pocs/cve-2026-82531 |
| Маркер проверки | POCBIT-82531-OK (вывод команды в base64 в теле HTTP-ответа) |
| Рекомендации | GHSA-3w63-v7pm-cq9x |
Фокус эксплойта: poc.py exploit выполняет прогрев → очистку кэша → отравление (POST name=) → срабатывание; check, payload, Docker lab/ (Smarty 5.8.4). Выходные файлы: hits.txt, exploited.txt.
Smarty компилирует шаблоны в PHP и может записывать кэшированный вывод. Когда шаблоны используют extends: / наследование блоков, скомпилированная функция верхнего уровня может оставить nocache_hash неустановленным после того, как новый PHP-воркер загрузит скомпилированные файлы с диска.
Во время регенерации кэша Smarty_Internal_Runtime_UpdateCache строит регулярное выражение, разделяющее области «nocache». Нулевой хеш порождает пустую альтернативу в регулярном выражении, поэтому контролируемые атакующим данные assign() могут подделать:
/*%%SmartyNocache:%%*/ <?php ... ?> /*/%%SmartyNocache:%%*/
Этот блок копируется дословно в сгенерированный кэш-файл PHP (обычная нейтрализация PHP-тегов пропускается). Следующий запрос, который включает кэш-файл, выполняет внедрённый PHP → удалённое выполнение кода.
exploit)| Этап | Действие |
|---|---|
| 1 Прогрев | Безобидный name=world → компиляция + начальный кэш |
| 2 Очистка | Удалить только файлы кэша (скомпилированные шаблоны остаются) — лаборатория предоставляет ?lab_clear_cache=1 |
| 3 Отравление | name=<поддельный SmartyNocache + PHP shell_exec> → записывается отравленный кэш |
| 4 Срабатывание | Безобидный name=benign → include() выполняет внедрённый PHP; тело содержит POCBIT-82531-OK:<base64> |
Реальным целям требуется: включённое кэширование, шаблоны с extends, управляемое пользователем присваивание, промах кэша при заполненном каталоге компиляции (TTL, перезапуск или сброс администратором).
В приложениях, использующих Smarty extends: / наследование + кэширование, при nocache_hash null поддельный блок SmartyNocache, присвоенный (assign) атакующим, записывается в кэш-файл PHP как сырой PHP; при следующем запросе include → RCE. Пакет PoCbit: Docker-лаборатория + 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"
После патчинга: удалите/перегенерируйте все файлы кэша шаблонов.
Только авторизованные исследования безопасности и системы, которыми вы владеете или на тестирование которых у вас есть разрешение.
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