Ядро языка PHP получило скоординированные обновления безопасности для всех поддерживаемых версий. Поводом для экстренных релизов стала критическая уязвимость, получившая в сообществе кодовое имя php2shell, которая ставит под удар миллионы веб-серверов по всему миру.
Брешь затрагивает механизм работы встроенных потоковых оберток (Stream Wrappers) и фильтров данных, присутствующий в языке с незапамятных времен.
Давай разберем, как устроена уязвимость и как защитить свои боевые серверы.
В чем суть атаки через потоковые фильтры?
В PHP встроен мощный механизм потоков, позволяющий налету трансформировать данные при операциях ввода-вывода с помощью псевдо-протокола php://filter.
Например, разработчик может прочитать файл, автоматически перекодировав его из одной кодировки в другую:
php://filter/read=convert.iconv.utf-8.utf-16le/resource=input.txt.
Уязвимость php2shell эксплуатирует тонкий дефект в связке встроенного декодера iconv и механизма выделения буферов памяти в куче (Zend Memory Manager):
- Цепочки фильтров: атакующий выстраивает длинную цепочку фильтров перекодирования.
- Некорректный расчет емкости буфера: при передаче специально подобранной последовательности невалидных байтов декодер ошибается в оценке размера выходного буфера памяти.
- Переполнение кучи (Heap Buffer Overflow): происходит перезапись указателей системных функций в куче процесса PHP-FPM, что приводит к перехвату потока управления и исполнению произвольного shell-кода.
Особая опасность заключается в том, что для эксплуатации уязвимости злоумышленнику достаточно найти любое место в приложении, где путь к файлу контролируется пользователем (например, невалидированный вызов file_get_contents($path), include($file) или механизм обработки временных файлов при загрузке картинок).
Экстренные версии и защитные меры
Команда мейнтейнеров ядра PHP выпустила корректирующие обновления:
- PHP 8.2.27
- PHP 8.3.16
- PHP 8.4.2
- Патчи для ветки в разработке PHP 8.5
В коде движка были внедрены жесткие лимиты:
- Ограничена максимальная глубина вложенности цепочек потоковых фильтров.
- Добавлена строгая проверка границ буферов при конвертации кодировок через библиотеку iconv.
- Заблокирована возможность бесконечного раздувания памяти при обработке поврежденных байтовых последовательностей.
Что делать разработчикам и DevOps?
- Немедленно обновите системные пакеты PHP: на всех серверах с PHP-FPM или Apache обновите установленные пакеты до версий 8.2.27, 8.3.16 или 8.4.2.
- Аудит файловых операций: проверьте кодовую базу на предмет использования конструкций вида
include $pageилиfile_get_contents($url). Никогда не передавайте пользовательские строки напрямую в файловые функции без валидации по строгому белому списку (allowlist). - Отключение неиспользуемых оберток: если приложению не требуются сетевые обертки, отключите директивы
allow_url_fopenиallow_url_includeв файлеphp.ini.
Своевременная установка системных обновлений — единственный надежный щит против автоматизированных эксплойтов.
