CVE-2026-109618: PHP обрывает запрос по памяти и оставляет дыру
21 октября PHP закрыл ошибку, при которой нехватка памяти обрывала запрос так, что следующий кусок памяти можно было принять за свой. Патч: 8.2.35, 8.3.36, 8.4.27 или 8.5.12.
Если сайт на PHP, эта заметка про ваш сервер, а не про чужой заголовок в ленте. 21 октября проект PHP выпустил исправления для CVE-2026-109618. 26 октября CISA внесла ошибку в каталог известных эксплуатируемых уязвимостей. Оценка PHP в бюллетене - 9.2 из 10. Вход в систему не нужен. Код сайта ещё не начал выполняться, а запрос уже обрабатывает сам интерпретатор.
Простыми словами
У PHP есть потолок памяти на запрос. Когда потолок достигнут, интерпретатор должен остановиться аккуратно: выбросить ошибку и забыть всё, что успел настроить для этого запроса. Здесь остановка была грубой. Часть служебных данных запроса оставалась в таком виде, будто запрос уже настоящий. Дальше PHP мог прочитать их и выполнить то, что подсунул приславший запрос человек. Для владельца сайта это выглядит как «сайт вдруг начал запускать команды». Для хостера - как воркер, который после ошибки памяти ведёт себя не так, как должен.
Что именно сломано
При исчерпании memory_limit PHP долгое время выходил из обработки через longjmp(), то есть прыжком из середины работы, а не штатным возвратом. Если память кончалась в момент, когда запрос ещё не до конца собран, в структурах оставался мусор. При завершении запроса его могли принять за инициализированные данные. Исправление убирает этот прыжок: мягкий отказ откладывается, а при более жёстком пороге процесс просто завершается, не пытаясь «дочитать» сломанное состояние.
Затронуты сборки, которые обслуживают веб-запросы: mod_php, PHP-FPM, php-cgi, FrankenPHP, LiteSpeed. Выше всего риск у mod_php: там процесс веб-сервера и есть процесс PHP, и подтверждённый сценарий не требует входа. FPM тоже в списке. Консольный php на сервере, которым никто не ходит из интернета, этой конкретной дырой не открыт наружу, но обновлять его всё равно стоит вместе с остальным.
Что сделать
- Обновить PHP до 8.5.12, 8.4.27, 8.3.36 или 8.2.35 и перезапустить все воркеры. Пока старый процесс жив, патч не работает.
- PHP 8.1 и старше отдельных релизов не получили. Проект выложил минимальные правки исходников для 7.4, 8.0 и 8.1. Если хостер их не поставил, сайт с интернета лучше снять, пока нет бэкпорта.
- WAF сужает окно, но не закрывает ошибку. CISA прямо пишет: нет патча - выключайте доступный извне PHP.
- После обновления смотрите, не порождает ли воркер оболочки и не появились ли новые файлы в каталоге сайта.
Рядом в том же релизе лежит вторая ошибка, и октябрьские сборки её тоже закрывают. Третья, про прогресс загрузки в сессии, этими сборками не закрыта. Имеет смысл прочитать все три, а не остановиться на номере из первого заголовка.
Связанные услуги Lexora
Проверить, какая PHP стоит на сайте
На типовом хостинге версию часто не видно из панели. Посмотрим, что обслуживает сайт, и что из этого ещё не пропатчено.