Что такое уязвимости PHP2Shell?21 октября 2026 года команда PHP выпустила экстренный набор обновлений безопасности, закрывающий две критические уязвимости, получившие общее имя PHP2Shell:
•
CVE-2026−109 618 (GHSA-w8hw-w9fx-j79w) — RCE через повреждение памяти при нехватке памяти (out-of-memory). Если запрос упирается в memory_limit в неудачный момент, PHP может оставить внутренние данные запроса частично инициализированными, и последующая очистка трактует их как валидные.
•
CVE-2026−109 619 (GHSA-6wmf-4rv5-p3rp) — RCE через устаревшее глобальное состояние. Фатальная ошибка в неудачный момент может оставить внутреннее состояние, указывающее на уже освобождённую память. Cледующий запрос в том же worker-процессе обращается к ней до штатной инициализации (use-after-free между запросами).
Обе уязвимости относятся к классу проблем безопасности памяти и связаны с тем, как PHP обрабатывает фатальные ошибки во время выполнения запроса. Общий знаменатель — прерванный запрос оставляет повреждённое или устаревшее внутреннее состояние, которое затем переиспользуется в том же долгоживущем worker-процессе. Обе оценены в 9.2 балла по CVSS v4.0.
Уязвимости найдены в рамках скоординированного раскрытия: одну обнаружила команда Calif в ходе аудита PHP по программе OpenAI «Patch the Planet», а компания Wiz независимо нашла и отправила обе. Исправления выпускала команда PHP при поддержке PHP Foundation. Технические подробности — в материалах
PHP, Wiz, Calif и PHP Foundation.Почему PHP2Shell требует немедленных действий?Масштаб определяется распространённостью PHP: на нём работает порядка 70% сайтов, язык которых известен. Уязвимости затрагивают все способы обслуживания web-запросов — PHP-FPM, Apache с mod_php, php-cgi, FrankenPHP и LiteSpeed, причём наибольший риск, по оценке команды PHP, несёт mod_php, где неаутентифицированный запрос может сработать ещё до выполнения прикладного кода. По данным исследователей, затронута практически каждая версия PHP за последнее десятилетие, вплоть до 5.4, а уязвимо даже приложение уровня «Hello World» — проблема лежит ниже уровня прикладного кода.
Дополнительный фактор срочности — то, как быстро после раскрытия появляется работающий эксплойт. Уязвимости выявлены с помощью AI-ассистентов, а за день до планового раскрытия идентификаторы CVE и часть сведений преждевременно попали в публичный доступ. На момент выхода исправлений отдельные исследователи (в частности, watchTowr) сообщали о попытках эксплуатации «в дикой природе». Другие (Huntress) на тот же момент не фиксировали массовой эксплуатации в своей базе, а публично подтверждённых фактов компрометации серверов на момент раскрытия не приводилось. Тем не менее окно между раскрытием и установкой патчей — именно тот период, когда особенно важны средства защиты, не завязанные на сигнатуру конкретной CVE.
Затронут ли Luntry уязвимостью PHP2Shell?Нет. Luntry не использует PHP ни в каком виде — ни напрямую, ни в составе компонентов. Соответственно, использование продуктов Luntry не могло поставить клиентов под угрозу, связанную с PHP2Shell. При этом Luntry помогает обнаруживать и сдерживать эксплуатацию этих уязвимостей в защищаемых контейнерных нагрузках клиента, пока идёт обновление.
Почему одного сканирования уязвимостей недостаточно?Сканирование образов необходимо, но его одного мало. Уязвимая версия PHP может оказаться в кластере в обход проверок — через сторонний образ, быстрое развёртывание или уже работающую нагрузку, которую ещё не успели обновить. Патч может выйти с задержкой или потребовать согласованного окна обслуживания, а в крупных парках обновление растягивается на дни и недели.
Кроме того, PHP-приложения на платформе появляются из множества базовых образов, и неочевидно, какие именно из работающих нагрузок содержат уязвимую версию интерпретатора. Поэтому к сканированию необходимо добавить два уровня: инвентаризацию работающих нагрузок (чтобы понимать, что именно уязвимо прямо сейчас) и контроль поведения в Runtime (чтобы обнаружить и остановить эксплуатацию независимо от того, установлен ли уже патч).
Как мы воспроизводили PHP2Shell в KubernetesЧтобы показать, как эксплуатация выглядит со стороны защиты, мы воспроизвели её на стенде. За основу взяли публичный эксплойт php2shell-bypass-aslr-exp (https://github.com/9bie/php2shell-bypass-aslr-exp/tree/main), нацеленный на официальный образ php:8.4.26-apache (версия до исправления 8.4.27). Под docker-compose он отрабатывает «как есть», однако при прямом переносе в Kubernetes Pod эксплуатация не воспроизводилась.
Причина в том, что цепочка чувствительна к распределению памяти в процессе, а окружение Pod’а отличается от docker-compose. Детали самой эксплуатации мы намеренно опускаем — ниже только изменения окружения, которые потребовались для детерминированного воспроизведения на стенде (без них эксплойт просто не срабатывал). Правки затронули ConfigMap’ы и Deployment: