Как Fastly обнаружила уязвимость PHP2Shell и выстроила скоординированный ответ

Источник: Fastly•

Как Fastly обнаружила уязвимость PHP2Shell и выстроила скоординированный ответ

Координированный выпуск исправлений 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, важно учитывать, что здесь нет строки полезной нагрузки (payload), по которой можно было бы выполнить сопоставление. Эксплойт представляет собой условие: добиться сбоя запроса в абсолютно неудачный момент времени.

По заявлению разработчиков 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 по ошибке публикует видео работы концепта эксплойта против нескольких целей. Видео удаляется, но копии продолжают распространяться. (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 в своем названии, примерно с 3200 публичных IP-адресов.

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

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

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

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

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

Поиск иголки

Надежнейшим способом отделить реальный трафик эксплойтов от всего остального на данный момент стала строка разделителя (boundary) в запросах multipart. Каждый найденный нами эксплойт-пакет использует фиксированный или структурированный разделитель в своем заголовке 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-адресу, а не по имени хоста, и отправляет один или два запроса на хост. Это массовое сканирование всего адресного пространства IP, а не целенаправленная кампания против конкретных сайтов.

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

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

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

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

Неожиданные исходящие соединения от PHP-воркеров, поскольку обратная оболочка (connect-back shell) представляет собой исходящий трафик источника

Что 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 (multipart boundary).

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

  • Исключите 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 шаблонное правило (Templated Rule), которое работает как виртуальный патч, выявляя структурные признаки эксплуатации. Дополнительную информацию см. в публикации Fastly о проактивной защите.

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

Примечание: мы также рекомендуем рассмотреть возможность включения функции автоматического применения виртуальных патчей CVE (Automatic CVE Virtual Patching) в настройках конфигурации рабочей среды (Workspace Configuration), как показано ниже:

Индикаторы

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

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

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

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

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

Все →

Ещё от Fastly