
21 октября были раскрыты две критические уязвимости PHP — CVE-2026-109618 и CVE-2026-109619, обе с CVSS 9.2. Их эксплуатация позволяет выполнять код без аутентификации с правами веб-сервера.
Уязвимым можно считать PHP с версии 5.4. Что интересно, уязвимости были найдены с помощью ИИшек (Gemini 4 Argon + GPT-5.6 Sol), а размер патча составляет больше 10 тысяч строк кода.
В чем уязвимость
Основная цель атакующего — вызвать фатальную ошибку, например Out-of-memory (OOM), в нужный момент при обработке PHP-интерпретатором входящего веб-запроса.
CVE связаны с тем, что PHP может ошибочно считать новый массив данных, который еще не успел проинициализироваться из-за ошибки OOM, проинициализированным. Это означает, что атакующий, заспамив память PHP специально подготовленными запросами, может добиться освобождения и выделения одного и того же участка памяти для разных массивов.
Как итог — у массива данных из-за ошибки OOM не успели проинициализироваться поля и указатели, в которых оказались данные из предыдущих запросов, управляемые злоумышленником. А при очистке памяти после ошибки PHP вызовет функции очистки массивов по адресам, управляемым злоумышленником. Именно поэтому эксплуатация этих двух уязвимостей требует серьезной подготовки и объемных HTTP-запросов.
Важно: из-за механизма рандомизации адресов ASLR атакующему необходимо добиться утечки памяти, чтобы узнать адрес функции, например,
system().
Как именно происходит эксплуатация
Поскольку источник уязвимости находится глубоко и связан с механизмами освобождения и выделения памяти в PHP, способов ее эксплуатации несколько.
Формы x-www-form-urlencoded
Объем выделяемой памяти в процессе PHP здесь достигается за счет большой глубины вложенности параметров формы
(...[x]). PHP учитывает новый элемент массива еще до его заполнения, а копирование длинного имени при обработке HTTP-запроса может превыситьmemory_limit, вызывая out-of-memory.
При очистке массива PHP принимает подложенные байты за готовый элемент. Разместив поддельный массив в нужной области памяти и подставив в него адрес функции, атакующий может заставить PHP вызвать ее при очистке.Отслеживание загрузки файлов
При multipart-загрузке с включенным при помощи параметра
PHP_SESSION_UPLOAD_PROGRESSотслеживанием прогресса загрузки PHP записывает статус загрузки в сессию — хранилище данных посетителя между запросами. Множество пустых файловых полей с вложенными именами также вызывают выделение огромного объёма памяти и ошибку OOM.
После OOM память может освободиться, а указатель на неё — сохраниться. Следующий запрос через upload progress может обратиться к ней повторно — это use-after-free (UAF). Если запрос попал в тот же процесс, переживший сбой, память уже может содержать данные атакующего.Важно: поскольку злоумышленник может влиять непосредственно на структуру данных PHP-сессии, в одном из запросов ему удается вызвать утечку памяти PHP через заголовок
Set-Cookie: PHPSESSID=, что позволяет довести эксплуатацию до выполнения команд.Отчет о сбое в PHP 8.5.
При включенном флаге
fatal_error_backtraces(включен по умолчанию) PHP сохраняет список функций, выполнявшихся в момент фатальной ошибки. После завершения запроса память списка освобождается, но указатель остается. Сообщение об ошибке в начале следующего запроса заставляет PHP обратиться к нему снова, вызывая еще одинuse-after-free.
Новые репорты и PoC для этих уязвимостей появляются каждый день, из-за чего создавать детекты их эксплуатации становится еще сложнее. Однако для успешной эксплуатации и выполнения вредоносного кода злоумышленнику необходимо узнать точные адреса функций (например,system).
Полный эксплойт, выполняющий вредоносный код, пока известен только для способа с параметромPHP_SESSION_UPLOAD_PROGRESS.

Сетевые артефакты
У пока еще единственной известной полноценной цепочки атаки присутствует очевидный артефакт — параметр PHP_SESSION_UPLOAD_PROGRESS в теле запроса. Об успешной эксплуатации может свидетельствовать необычно длинное значение PHPSESSID в ответе с URL-кодированными байтами памяти.
Несмотря на то что сам параметр PHP_SESSION_UPLOAD_PROGRESS может использоваться и при обычных запросах, на практике этот параметр в сетевых запросах мы не встречали.
Важно: единого обязательного сетевого маркера для всех вариантов эксплуатации нет.
Что известно об атаках
Специалисты Amazon зафиксировали попытки атак еще 17 октября. После раскрытия уязвимостей число попыток атак в сети Cloudflare выросло до миллионов, по словам главы компании.
Как исправить
Обновить PHP до 8.2.35, 8.3.36, 8.4.27, 8.5.12 или более новой исправленной версии своей ветки.
До обновления снизить риск помогут следующие настройки PHP:
session.upload_progress.enabled=0— перекрывает известные цепочки через upload progress;fatal_error_backtraces=0— перекрывает соответствующий путь на PHP 8.5;ограничения размера и сложности запросов на веб-сервере или reverse proxy.
Настройки должны действовать до разбора запроса: задайте их в php.ini или конфигурации сервера.
Для CVE-2026-109618 разработчики PHP также предлагают установить memory_limit=-1 с внешними ограничениями памяти на уровне контейнера/cgroup. Это частичная мера: системный отказ выделения памяти все еще может привести к уязвимому пути.
Полностью исправляет обе уязвимости только обновление PHP.
Suricata-сигнатуры
alert http any any -> any any (msg: "ATTACK [PTsecurity] Possible PHP RCE Exploitation attempt. PHP upload progress in multipart request (PHP2Shell, CVE-2026-109618, CVE-2026-109619)"; flow: established, to_server; http.content_type; content: "multipart/form-data"; startswith; nocase; http.request_body; content: "PHP_SESSION_UPLOAD_PROGRESS"; threshold: type limit, track by_src, count 1, seconds 300; reference: cve, 2026-109618; reference: cve, 2026-109619; reference: url, wiz.io/blog/php2shell-php-rce; classtype: attempted-admin; sid: 10018633; rev: 1;) alert http any any -> any any (msg: "ATTACK [PTsecurity] Successful PHP RCE Exploitation. PHPSESSID memory leak (PHP2Shell, CVE-2026-109619)"; flow: established, to_client; http.header.raw; content: "Set-Cookie|3a|"; nocase; content: "PHPSESSID="; nocase; distance: 0; content: "%"; distance: 0; pcre: "/Set-Cookie\x3a[\x20\x09]*PHPSESSID\x3d(?:[^\x3b\x25\r\n\x20\x09]{0,64}\x25(?:[0189a-f][0-9a-f]|7f)){12}/im"; threshold: type limit, track by_dst, count 1, seconds 300; reference: cve, 2026-109619; reference: url, wiz.io/blog/php2shell-php-rce; classtype: successful-admin; sid: 10018632; rev: 3;)
(Источник: https://t.me/ptescalator)
