Две критические уязвимости PHP, раскрытые 21 октября, стали предметом попыток эксплуатации ещё до публикации сведений о них. Обе получили оценку CVSS 9.2 и позволяют выполнять код без аутентификации с правами веб-сервера. Полная цепочка, доводящая запрос до выполнения команд, известна пока для одного способа доставки, через механизм отслеживания прогресса загрузки файлов. Подтверждений успешного выполнения кода на чужих серверах нет: речь идёт о попытках и об опубликованном эксплойте (вредоносном коде, эксплуатирующем уязвимость).
Описание
Механизм обеих проблем связан с ошибкой при нехватке памяти. Атакующий добивается фатальной ошибки нехватки памяти (out-of-memory) в момент обработки входящего запроса. Тогда PHP ошибочно считает новый массив, который не успел проинициализироваться, готовым к работе. Один и тот же участок памяти освобождается и выделяется под разные массивы, а поля и указатели нового массива сохраняют данные предыдущих запросов. При очистке интерпретатор вызывает функции освобождения по адресам, которые содержатся в этих данных и которыми управляет атакующий. Поэтому эксплуатация требует подготовки и объёмных запросов: лимит памяти нужно превысить в точно выбранный момент.
Путей до опасного состояния несколько. Один использует формы с типом содержимого x-www-form-urlencoded: глубокая вложенность параметров заставляет интерпретатор учитывать новый элемент массива до заполнения, а копирование длинного имени превышает заданный лимит памяти. При очистке PHP принимает подложенные байты за готовый элемент массива, и поддельный массив с адресом функции в нужной области памяти заставляет интерпретатор вызвать её. Второй путь опирается на параметр PHP_SESSION_UPLOAD_PROGRESS: при составной загрузке файлов с включённым отслеживанием прогресса PHP записывает состояние загрузки в сессию, то есть в хранилище данных посетителя между запросами. Множество пустых файловых полей с вложенными именами выделяет большой объём памяти и приводит к той же ошибке. Освобождённая область остаётся доступной по указателю, и следующий запрос попадает в неё повторно, то есть возникает обращение к освобождённой памяти (use-after-free).
Попытки эксплуатации отмечены 17 октября, ещё до раскрытия уязвимостей. По данным Amazon и Cloudflare, после публикации сведений число таких запросов в сети Cloudflare выросло до миллионов. Речь идёт о попытках, а не о подтверждённых взломах.
У единственной полной цепочки есть заметный признак: параметр PHP_SESSION_UPLOAD_PROGRESS в теле запроса. О возможном успехе может говорить необычно длинное значение идентификатора сессии в ответе с закодированными байтами памяти. Сам параметр встречается и в обычных запросах, хотя в наблюдавшихся сетевых данных его не отмечали. Единого обязательного сетевого признака для всех вариантов эксплуатации нет. К тому же без утечки адреса функции, которую скрывает рандомизация адресов памяти (ASLR), цепочка не доходит до выполнения команд.
Уязвим PHP начиная с версии 5.4, а исправление заняло больше 10 тысяч строк кода. Обе проблемы нашли с помощью нейросетей Gemini 4 Argon и GPT-5.6 Sol. Разработчики закрыли их в версиях 8.2.35, 8.3.36, 8.4.27 и 8.5.12. К дополнительным мерам относят отключение отслеживания прогресса загрузки и отключение списка функций при фатальной ошибке; ещё один вариант - ограничение размера и сложности запросов на веб-сервере или обратном прокси. Для CVE-2026-109618 разработчики предлагают снять внутренний лимит памяти PHP и ограничить память на уровне контейнера, хотя эта мера частичная.
Описанные признаки не показывают, чем закончился конкретный запрос. За пределами анализа остались сведения о том, какие именно серверы получали такие запросы и подтверждён ли хотя бы один случай выполнения кода. Демонстрационные эксплойты и сообщения о новых вариантах появляются ежедневно, поэтому распознавание усложняется. Насколько широко развёрнут уязвимый PHP, из этих данных также не следует. Сведений о географии или отраслях затронутых систем в материале нет.