Экстренный релиз PHP: две критические RCE-уязвимости исправлены в 8.2.35–8.5.12
PHP выпустил внеплановый безопасностный релиз, закрывающий две критические уязвимости типа use-after-free в ядре языка — обе эксплуатируются для удалённого исполнения кода без аутентификации, обе с оценкой 9,2 по шкале CVSS v4.0. Исправленные версии — PHP 8.5.12, 8.4.27, 8.3.36 и 8.2.35, опубликованные сегодня и перечисленные в архиве релизов проекта. Минимальные бэкпорты исходного кода для давно не поддерживаемых веток 7.4, 8.0 и 8.1 доступны только на GitHub — официальных бинарников для них нет.
Релизу предшествовало необычайно хаотичное окно преждевременного раскрытия. 20 октября проект объявил экстренный выпуск на сегодня 14:00 UTC, не назвав уязвимые версии и функции; как задокументировало OX Security, скриншоты инструмента эксплуатации ходили по сети ещё до выхода патчей, а сам проект предупреждал, что proof-of-concept-код, циркулирующий в этом окне, часто оказывается замаскированной вредоносной программой. Теперь, когда патчи и advisory опубликованы, техническая картина яснее, чем обещал тизерный цикл.Путь от нехватки памяти к исполнению кода
CVE-2026-109618, учтённая как GHSA-w8hw-w9fx-j79w, эксплуатирует обработку исчерпания памяти в PHP. Когда выделение терпит неудачу, движок разматывает запрос через longjmp() — и если это происходит, когда память запроса инициализирована лишь частично, фаза завершения позже читает или ветвится по памяти в недопустимом состоянии. Advisory описывает семейство приёмов давления на аллокатор, делающих это достижимым из обычного HTTP-запроса: multipart-тела без пригодного content-length, проскальзывающие мимо post_max_size; части с тысячами заголовков, чьё представление в памяти многократно превышает размер «на проводе»; пустые файловые контролы, создающие массивы метаданных, ни разу не учтя их в max_file_uploads. SAPI mod_php в Apache подтверждён как эксплуатируемый: исследователи воспроизвели неаутентифицированное удалённое исполнение кода от имени учётной записи веб-воркера по обычному HTTP на дефолтных конфигурациях prefork — с высокой сложностью атаки и, возможно, несколькими попытками. PHP-FPM считается уязвимым через специфичные для приложения пути выделения; FrankenPHP и LiteSpeed — вероятно, тоже. Патч заменяет сырой longjmp на «мягкую» ловушку нехватки памяти в ближайшей безопасной точке VM плюс жёсткий отказ, немедленно завершающий воркер.Устаревшее состояние в процессах-воркерах
CVE-2026-109619 (GHSA-6wmf-4rv5-p3rp) — тихая сестра: процессы-воркеры несут глобальное состояние — обработчики ошибок, данные сессий, учёт объектов и расширений, — которое может начать указывать на память, принадлежащую одному запросу. Если фатальная ошибка, прерывание по нехватке памяти или поздняя диагностика записывают такое состояние и ничто его не сбрасывает до освобождения памяти запроса, глобальные переменные воркера повисают в воздухе. Всё, что коснётся их до инициализации нового запроса, прочтёт освобождённую память. Подтверждены два продакшн-пути: фатальные трассировки стека, появившиеся в PHP 8.5, под mod_php и механизм session upload progress под mod_php и FPM. Производитель и потребитель должны попасть на один и тот же процесс-воркер, что делает пулы FPM с множеством воркеров сложнее — но не невозможно — для поражения.Стратегически сконструированная раскладка heap может дать полноценное удалённое исполнение кода (RCE). — Security-advisory PHP, GHSA-6wmf-4rv5-p3rp
Что администраторам делать сейчас
Обновление — единственная полная мера, и это не «пропатчил и забыл»: оба advisory подчёркивают необходимость перезапустить все PHP-воркеры после обновления, потому что устаревшее состояние может пережить апгрейд в долгоживущих процессах. Поддерживаемые ветки получают бинарники релиза; сайты, прикованные к EOL-веткам, должны накладывать исходные бэкпорты самостоятельно.- Обновиться до 8.2.35, 8.3.36, 8.4.27 или 8.5.12 (или наложить GitHub-бэкпорты для 7.4/8.0/8.1), затем перезапустить все процессы-воркеры.
- Если обновиться сегодня невозможно: установить session.upload_progress.enabled=0 и, на PHP 8.5, fatal_error_backtraces=0, перезапустить воркеры.
- Для OOM-уязвимости принудительно выставить memory_limit=-1 централизованно и проверить, что ни один override пула или .htaccess не вернёт конечный лимит.
- Держать консервативный post_max_size, блокировать multipart-запросы на фронтенде, если приложение их не использует, и ограничивать входные переменные, заголовки и загрузки.
- Использовать лимиты памяти контейнера/cgroup вместо RLIMIT_AS или RLIMIT_DATA — advisory прямо предупреждает, что RLIMIT-механизмы толкают сбои выделения на уязвимый путь.
- Опционально ограничить рециклинг воркеров через pm.max_requests, сократив окно для переноса состояния.










