PHP2Shell: Иголки в стоге сена

Источник: Fastly•

PHP2Shell: Иголки в стоге сена

В этой статье описывается, как выглядел тот ранний трафик, как отличить настоящий трафик PHP2Shell от двух параллельно работающих похожих кампаний и что делать приложениям вашего бизнеса, работающим на PHP.

Координированный выпуск обновлений PHP для CVE-2026-109618 и CVE-2026-109619 был запланирован на 14:00 UTC 21 октября. В телеметрии нашего межсетевого экрана нового поколения (Next-Gen WAF) инструменты, названные в честь этой уязвимости, начали сканирование более чем за девять часов до этого. К моменту релиза более 100 исходных IP-адресов использовали инструменты с упоминанием PHP2Shell под более чем двумя десятками названий. Одним из таких инструментов был набор эксплойтов, содержавший номер CVE в своем заголовке User-Agent.

В этой статье описывается, как выглядел тот ранний трафик, как отличить настоящий трафик PHP2Shell от двух параллельно работающих похожих кампаний и что делать приложениям вашего бизнеса, работающим на PHP.

Анатомия уязвимостей

PHP2Shell — это название двух критических уязвимостей в PHP. Обе имеют оценку 9.2 по шкале CVSS и могут позволить неавторизованному злоумышленнику выполнить удаленный код:

  • CVE-2026-109618: Состояние нехватки памяти (out-of-memory) может прервать работу PHP в момент, когда данные внутреннего запроса настроены лишь частично, после чего очистка запроса доверяет этим поврежденным данным.

CVE-2026-109618: Состояние нехватки памяти (out-of-memory) может прервать работу PHP в момент, когда данные внутреннего запроса настроены лишь частично, после чего очистка запроса доверяет этим поврежденным данным.

  • CVE-2026-109619: Внутреннее состояние может переживать память, стоящую за ним, и последующий запрос на том же рабочем процессе перехватывает его.

CVE-2026-109619: Внутреннее состояние может переживать память, стоящую за ним, и последующий запрос на том же рабочем процессе перехватывает его.

Всем, кто пытается обнаружить PHP2shell, важно отметить, что здесь нет строки полезной нагрузки для сопоставления. Эксплойт представляет собой условие: сделать так, чтобы запрос завершился с ошибкой в абсолютно неподходящий момент.

По заявлению разработчиков PHP, под угрозой находится любая инсталляция, обрабатывающая веб-запросы, включая PHP-FPM, Apache mod_php, php-cgi, FrankenPHP и LiteSpeed. Наивысшую степень риска имеет mod_php.

Исправленные версии — 8.5.12, 8.4.27, 8.3.36 и 8.2.35. Для PHP 8.1 и более старых версий официальных исправлений не предусмотрено.

Хронология

Дата/Время (UTC)

Событие

20 окт., ~15:00

Идентификаторы CVE начинают распространяться по форумам и социальным сетям с неверным временем релиза и неверной оценкой CVSS 10.0. Технические детали не утекали. (PHP Foundation)

20 окт., 19:30

PHP публикует предварительное объявление и переносит релиз на один день раньше — на 21 октября, 14:00 UTC. (PHP Foundation)

20 окт., ~20:00

Calif по ошибке публикует видео с демонстрацией работы концепт-прототипа (PoC) против нескольких целей. Видео удалено, но его копии распространяются. (PHP Foundation)

20 окт., ~23:00

Рекомендации по смягчению последствий, переданные нескольким ключевым провайдерам инфраструктуры, возможно, утекли. (PHP Foundation)

с 20 окт. 00:00 по 21 окт. 03:59

В нашей телеметрии не было замечено инструментов с именем PHP2shell: около 13 часов тишины после появления идентификаторов CVE. (Телеметрия Fastly)

21 окт., 03:59

Первый запрос от инструмента с именем PHP2shell в нашей телеметрии. (Телеметрия Fastly)

21 окт., 05:11

Первый запрос от наиболее распространенного набора эксплойтов (User-Agent: PHP2 shell-109618, граница B7kQpoc618). (Телеметрия Fastly)

21 окт., 07:41

Chainguard публикует готовые образы с исправлением, более чем за шесть часов до координированного релиза. (PHP Foundation)

21 окт., 13:34

Опубликованы бюллетени безопасности GitHub для обеих уязвимостей CVE. (GitHub)

21 окт., 14:00

Координированный релиз (запланированный): PHP 8.5.12, 8.4.27, 8.3.36 и 8.2.35. К этому моменту более 100 исходных IP-адресов использовали инструменты с именем PHP2shell. (PHP Foundation)

Как развивалось раскрытие информации и когда появились инструменты PHP2shell. Все время указано в формате UTC. События раскрытия описаны в постмортеме PHP Foundation и записях бюллетеней безопасности GitHub.

Идентификаторы CVE для PHP2shell (2026-109618 и 109619) утекли без технических деталей, а инструменты с именем PHP2shell появились в нашей телеметрии примерно через восемь часов после видео с эксплойтом. Как первый инструмент с таким именем, так и первый замеченный нами набор эксплойтов появились до раннего релиза исправленных образов. Мы не беремся гадать, что именно спровоцировало появление того или иного инструмента, но к моменту координированного релиза сканирование уже шло полным ходом.

С момента появления первого инструмента с именем PHP2shell и до полудня 22 октября мы зафиксировали около 250 000 запросов от инструментов, содержащих PHP2shell в своем названии, примерно с 3 200 публичных IP-адресов.

Конечно, не все сканеры действуют со злым умыслом. Примерно треть этого трафика идентифицирует себя как защитный: «авторизованная проверка на подверженность уязвимостям», «проверка состояния патчей», «неэксплуатирующая проверка». Множество организаций проверяли собственные среды, и это хорошо. Самоопределение в заголовках — это заявления без доказательств, но они совпадают с тем, что делают эти запросы: небольшие, безобидные зондирования.

Запросы от инструментов с именем PHP2shell по типам (с 21 окт. 03:59 UTC до полудня 22 окт., округленно).

Остальное представляет собой смесь, причем ситуация менялась быстро. Один из инструментов для инвентаризации версий PHP обновился с версии 4.0 до 7.2 примерно за одиннадцать часов.

Инструменты, которые обновляются так быстро, делают сигнатуры на основе строк User-Agent устаревшими всего за день.

Инструменты, которые обновляются так быстро, делают сигнатуры на основе строк User-Agent устаревшими всего за день.

Иголки в стоге сена

Самым надежным способом отделить реальный трафик эксплойтов от всего остального на данный момент оказалась строка разделителя multipart. Каждый обнаруженный нами набор эксплойтов использует фиксированную или шаблонную границу (boundary) в заголовке Content-Type. Таким способом мы выявили более десяти кандидатов в наборы эксплойтов, пять из которых напрямую связаны с PHP2shell по имени, заголовку User-Agent или поведению.

Наиболее распространенный набор выглядит следующим образом:

  • POST /index.php (или /), User-Agent: php2shell-109618

POST /index.php (или /), User-Agent: php2shell-109618

  • Content-Type: multipart/form-data; boundary=B7kQpoc618
  • тело multipart фиксированного размера и минимальный набор заголовков

тело multipart фиксированного размера и минимальный набор заголовков

Он также обращается к целям по конкретному IP-адресу, а не по имени хоста, и отправляет один-два запроса на хост. Это массовое сканирование адресного пространства, а не целевая кампания против конкретных сайтов.

Размеры тел запросов сильно различаются от набора к набору, поэтому не полагайтесь исключительно на пороговые значения размера для обнаружения этого трафика.

Две похожие кампании, которые нужно исключить в первую очередь

Если вы ищете следы PHP2shell в собственных логах, вам будут мешать две другие кампании.

React2Shell (CVE-2025-55182). Две циркулирующие сигнатуры для PHP2shell — это фрагментированные (chunked) запросы multipart без заголовка Content-Length и тела, заполненные длинными последовательностями буквы A. За исследованный нами час на долю React2Shell приходилось соответственно 98,6% и 99,9% таких совпадений. Сигнатура с заполнением уже почти полностью принадлежала React2Shell за день до релиза. React2Shell бомбардирует все пути, включая /xmlrpc.php и /wp-login.php. Простой способ фильтрации — заголовок запроса Next-Action, который используют Server Actions в Next.js и который никогда не используется в PHP.

Процент каждой циркулирующей сигнатуры «PHP2shell», которая на самом деле является React2Shell, измеренный по заголовку Next-Action при POST-запросах к эндпоинтам PHP, 21 октября с 21:00 до 22:00 UTC. В тот же час за день до релиза сигнатура с заполнением уже на 99,7% состояла из запросов React2Shell.

wp2shell. Это совершенно другая уязвимость: удаленное выполнение кода (RCE) без аутентификации в ядре WordPress, раскрытая в июле 2026 года. Ее набор эксплойтов отправляет большие тела multipart на index.php сайта WordPress с разделителем, начинающимся с ----wp2shell. Она была активна задолго до того, как PHP2shell стал достоянием общественности, поэтому учет ее запросов создал бы несуществующую историю о «предупредительном» появлении php2shell.

Общий урок из обоих случаев: сигнатура формы запроса описывает тип запроса, а не злоумышленника. Выполните сравнение с базовым уровнем до момента раскрытия информации и разделите любой прирост по идентифицирующему заголовоку или разделителю, прежде чем делать выводы.

Общий урок из обоих случаев: сигнатура формы запроса описывает тип запроса, а не злоумышленника. Выполните сравнение с базовым уровнем до момента раскрытия информации и разделите любой прирост по идентифицирующему заголовоку или разделителю, прежде чем делать выводы.

Что можно и чего нельзя увидеть с периметра

Попытки эксплойтов видны на периметре, но их успешность — нет. PHP2shell работает путем аварийного завершения или повреждения рабочего процесса PHP, поэтому успешная попытка и неудачная могут выглядеть извне одинаково. Если вы считаете, что стали мишенью, подтверждение следует искать на сервере-источнике:

  • Журналы ошибок PHP-FPM

Журналы ошибок PHP-FPM

  • Журналы ошибок Apache, показывающие сбои рабочих процессов (например, записи AH00051 "child pid … exit signal")

Журналы ошибок Apache, показывающие сбои рабочих процессов (например, записи AH00051 "child pid … exit signal")

  • Неожиданные исходящие соединения от рабочих процессов PHP, поскольку шелл с обратным подключением является исходящим трафиком источника

Неожиданные исходящие соединения от рабочих процессов PHP, поскольку шелл с обратным подключением является исходящим трафиком источника

Что PHP2Shell говорит об ИИ

ИИ, безусловно, помогает в обнаружении уязвимостей, и делает это гораздо быстрее, чем в прошлом. Примерно через день после появления первого инструмента мы увидели десятки названных инструментов с примерно 3200 IP-адресов, а один инструмент перешел с версии 4.0 на 7.2 примерно за одиннадцать часов.

Мы не можем с уверенностью сказать, были ли какие-либо из них написаны с помощью ИИ. Что мы действительно наблюдаем, так это то, что сам трафик является обычным: наборы отправляют фиксированное тело multipart на сырые IP-адреса, один или два запроса на хост, из тех же видов VPN- и хостинг-инфраструктуры, которые стоят за большинством сканирований. Независимо от степени помощи ИИ, мы видим ландшафт угроз, который становится шире и движется быстрее.

И пока что защита по-прежнему остается в первую очередь заслугой людей. Специалисты по защите проверяли свои собственные системы и маркировали трафик. Охотники за угрозами делились сигнатурами, которые оказались практически полностью другой кампанией. Установка патчей, создание базовых профилей и анализ журналов источника — это по-прежнему в значительной степени работа, выполняемая людьми (даже если она поддерживается ИИ), которая требует от людей выработки стратегии по внедрению правильных многоуровневых средств защиты в нужных местах.

Что делать дальше

  • Установите патчи. Обновитесь до версий 8.5.12, 8.4.27, 8.3.36 или 8.2.35 либо используйте исправленный пакет вашего дистрибутива. Если вы используете версию 8.1 или более старую, обратитесь к дистрибутиву вашего пакета по поводу бэкпортов или выполните обновление.

Установите патчи. Обновитесь до версий 8.5.12, 8.4.27, 8.3.36 или 8.2.35 либо используйте исправленный пакет вашего дистрибутива. Если вы используете версию 8.1 или более старую, обратитесь к дистрибутиву вашего пакета по поводу бэкпортов или выполните обновление.

  • Не гонитесь за ложными целями. User-Agent, IP-адрес и размеры тела запроса могут ввести вас в заблуждение при поиске угроз. Настоящая улика кроется в строке разделителя multipart.

Не гонитесь за ложными целями. User-Agent, IP-адрес и размеры тела запроса могут ввести вас в заблуждение при поиске угроз. Настоящая улика кроется в строке разделителя multipart.

  • Исключите React2Shell и wp2shell, прежде чем считать что-либо за PHP2shell.

Исключите React2Shell и wp2shell, прежде чем считать что-либо за PHP2shell.

  • Будьте осторожны с черными списками IP-адресов. Несколько IP-адресов из списков, распространяемых для этой уязвимости, являются выходными узлами VPN, выходными узлами Tor или адресами жилых и мобильных сетей, передающими обычный трафик. Их блокировка вредит реальным пользователям.

Будьте осторожны с черными списками IP-адресов. Несколько IP-адресов из списков, распространяемых для этой уязвимости, являются выходными узлами VPN, выходными узлами Tor или адресами жилых и мобильных сетей, передающими обычный трафик. Их блокировка вредит реальным пользователям.

  • Клиенты Fastly Next-Gen WAF: для приложений, защищенных Next-Gen WAF, включите сигнал, охватывающий как CVE-2026-109618, так и CVE-2026-109619. Это шаблонное правило для конкретной CVE, которое работает как виртуальный патч, ища структурные признаки эксплуатации. Дополнительные сведения см. в публикации Fastly о проактивной защите.

Клиенты Fastly Next-Gen WAF: для приложений, защищенных Next-Gen WAF, включите сигнал, охватывающий как CVE-2026-109618, так и CVE-2026-109619. Это шаблонное правило для конкретной CVE, которое работает как виртуальный патч, ища структурные признаки эксплуатации. Дополнительные сведения см. в публикации Fastly о проактивной защите.

Примечание: Мы также рекомендуем рассмотреть наш переключатель автоматического создания виртуальных патчей CVE в конфигурации рабочего пространства, показанный ниже:

Индикаторы

Как мы это измерили

Эти данные получены на основе телеметрии запросов Fastly Next-Gen WAF в период с 20 по 22 октября 2026 года. Время раскрытия информации взято из постмортема PHP Foundation и записей рекомендаций GitHub. Подсчеты представляют собой нижние границы: мы можем сообщать только о тех запросах, которые наш WAF видел и записал, а некоторые показатели на уровне заголовков получены из сопоставленных выборочных часов, а не полных дней.

Читайте статью Fastly «Proactive Protection for PHP2Shell, Critical PHP RCE CVE-2026-109618 and CVE-2026-109619» для получения более актуальной информации.

О чём эта статья

Ещё в разделе «Облака и инфраструктура»

Все →

Ещё от Fastly