В открытом доступе появился эксплойт для PHP 8.4.26 с выполнением команд на сервере

PHP2shell

Исследователь под псевдонимом KillaBoi опубликовал в открытом репозитории на GitHub демонстрационный эксплойт (PoC, proof of concept) для двух уязвимостей PHP, которые вместе называют PHP2Shell. Код проводит атаку на PHP 8.4.26: вызывает повреждение памяти, извлекает внутренние адреса процесса и выполняет команды на сервере. Затронуты ветки PHP 8.2, 8.3, 8.4 и 8.5, для каждой вышел отдельный выпуск с исправлением. По описанию уязвимостей, выполнение кода не требует учётных данных, если установка уязвима.

Две уязвимости PHP2Shell и цепочка из четырёх этапов

Обе проблемы получили идентификаторы CVE-2026-109618 и CVE-2026-109619, а также оценку 9,2 из 10 по CVSS v4.0 (общая система оценки уязвимостей). Они допускают удалённое выполнение кода без аутентификации: атака идёт по сети, учётные данные не нужны. Нужно ли участие пользователя, источник не уточняет, поэтому детали остаются в самом уведомлении и в описании производителя PHP.

Цепочка опирается на обработку хода загрузки файла в сессии и на управление памятью PHP. PHP поддерживает отслеживание такой загрузки и складывает промежуточные сведения в сессию; разбор начинается ещё до того, как запрос обработан целиком. Специально собранный запрос с множеством вложенных имён полей заставляет PHP выделить памяти заметно больше, чем весит сам запрос. При исчерпании лимита в 128 МиБ в рабочем процессе остаётся устаревшее состояние сессии. Следующий запрос попадает в тот же процесс и получает через идентификатор сессии PHPSESSID содержимое памяти, включая адреса.

Демонстрация проходит четыре этапа. Сначала скрипт проверяет версию PHP на сервере. Затем двумя сериями запросов он добывает адрес кучи (области памяти для значений запроса) и адрес кода. Оба адреса нужны из-за рандомизации адресного пространства (ASLR): эта защита независимо размещает код и данные в памяти при каждом запуске процесса. На последнем этапе подделанная внутренняя структура PHP при очистке вызывает системную функцию, а её аргументом становится команда.

Проверка на стенде и живой прогон

В изолированной среде Docker (платформа для запуска контейнеров) исследователь воспроизвёл выполнение команд и получил вывод тестового файла. Скрипт работает на Python 3.11 или новее и не требует сторонних библиотек. На один прогон уходит не больше двадцати запросов к веб-серверу: проверка версии, две серии запросов на утечку адресов и финальный запрос с поддельной структурой. Успех скрипт подтверждает по ответу: в нём должен быть свежий случайный маркер, вывод системной команды и хеш исполняемого файла. Семь из десяти запусков на стенде завершились успешно; сбои связаны с гонкой за нужный рабочий процесс и с различиями в раскладке памяти.

Скрипт откалиброван под Alpine PHP 8.4.26 с четырьмя рабочими процессами, поэтому на других сборках жёстко заданные смещения не совпадут. Автор предупреждает, что проверка доводит PHP до предела памяти и допустима только в санкционированной среде; сам скрипт обращается лишь к площадке испытания или к локальному стенду.

Живой прогон прошёл 25 октября 2026 года в 15:47 UTC. Последний запрос вернул ошибку исчерпания памяти и ключ в формате WIF (Wallet Import Format, способ записи приватного ключа Bitcoin). Ключ не подошёл к адресу, указанному на сайте испытания, и создатель задания это признал. Полный исходящий запрос того прогона не сохранился: его восстановили позже по коду, поэтому автор не выдаёт запись за оригинальный перехват трафика.

Исправленные версии и наблюдение за запросами

Исправления вышли в PHP 8.4.27, 8.3.36, 8.2.35 и 8.5.12. Номер зависит от поддерживаемой ветки, поэтому сначала определяют, какая ветка работает на сервере.

Администраторам предлагают следить за необычными составными запросами (multipart, которыми передают файлы), повторяющимися ошибками исчерпания памяти PHP, нестандартными идентификаторами сессий и командами, которые запускают рабочие процессы PHP. Официальных обходных мер источник не называет: кроме обновления, он предлагает только наблюдение.

Сведений об эксплуатации в реальных атаках нет. Публикация кода означает, что техника стала доступна, но не подтверждает её применение. Цепочка переводит исчерпание памяти в утечку адресов и выполнение команд, причём учётные данные для этого не нужны; пока исправление не установлено, следы попытки видны в журналах PHP как ошибки памяти и необычные составные запросы.

Ссылки

Комментарии: 0