WorldwideTradeX — торговая компания из Стамбула: мы поставляем, экспортируем и доставляем.

ИТ-решения · бюллетень безопасности

Обновление безопасности PHP 2026: руководство по устранению уязвимостей PHP2Shell (CVSS 9.2)

21 октября 2026 года вышли версии PHP 8.5.12, 8.4.27, 8.3.36 и 8.2.35, закрывающие две уязвимости удаленного выполнения кода, эксплуатируемые без аутентификации. Если PHP работает на вашем сервере, на сервере вашего клиента или на shared-хостинге вашего агентства, это задача уровня «обновить сегодня», а не пункт дорожной карты.

21 октября 2026 г.  ·  11 минут чтения  ·  технологическая редакция WorldwideTradeX
Коротко. Это две ошибки в самом PHP, отслеживаемые как CVE-2026-109618 и CVE-2026-109619 и получившие широкую известность под именем PHP2Shell: они позволяют запросу без аутентификации выполнить код на сервере. Обе оцениваются как CVSS v4.0 9.2. Исправленные версии: PHP 8.5.12, 8.4.27, 8.3.36, 8.2.35. Под угрозой любой PHP, обслуживающий веб-трафик — PHP-FPM, Apache с mod_php, php-cgi, LiteSpeed и FrankenPHP — причем наибольший риск у mod_php. Полное решение только одно — обновление; временные настройки из бюллетеня лишь сужают окно атаки. Мы сопровождаем боевые PHP-серверы и выполняем миграции, поэтому, если вы хотите передать окно обновления специалистам, запросите коммерческое предложение или свяжитесь с нами.

Само раскрытие было нетипичным. 20 октября команда безопасности PHP опубликовала предварительное уведомление, назначила выпуск на 21 октября на 14:00 UTC и оставила за собой право выпустить релиз раньше. Идентификаторы CVE утекли за день до раскрытия — вместе с завышенными заявлениями о серьезности и затронутых версиях. Вендоры дистрибутивов получили заплатки заранее, а национальные CERT начали публиковать рекомендации еще до того, как код стал общедоступным. Иначе говоря: после выхода релиза ни у кого не было уважительной причины тянуть.

Две уязвимости, один экстренный релиз

Ни одна из этих ошибок не является логической ошибкой в приложении. Обе находятся в том, как PHP готовит запрос к обработке и завершает его, и потому ни обновление фреймворка, ни обновление плагинов, ни правило на WAF не заменят обновление интерпретатора.

CVE-2026-109618 — RCE через повреждение данных при исчерпании памяти. Когда память у PHP заканчивается, он прерывает запрос, а не продолжает работу. В бюллетене описан путь, при котором такое прерывание останавливает PHP в момент, когда внутренние данные запроса инициализированы лишь частично, и на шаге очистки запроса недопустимые данные затем принимаются за допустимые. Злоумышленник, способный довести потребление памяти до предела, может влиять на то, что произойдет дальше. Именно из-за этой уязвимости рекомендации по защите выглядят настолько контринтуитивно: вендор просит администраторов не позволять PHP упираться в собственный потолок памяти, а не зажимать лимит сильнее.

CVE-2026-109619 — RCE через устаревшее глобальное состояние. Внутреннее состояние, принадлежавшее одному запросу, может сохраниться и после освобождения памяти, в которой оно находилось. Следующий запрос, обработанный тем же рабочим процессом, может обратиться к этому устаревшему состоянию раньше, чем штатная инициализация его сбросит. Для долго живущего воркера — а PHP-FPM, mod_php и LiteSpeed именно таковы — повторное использование памяти является нормальным и постоянным режимом, так что это не экзотический редкий случай.

Идентификатор Суть уязвимости Критичность Исправлено в
CVE-2026-109618
GHSA-w8hw-w9fx-j79w
Обработка исчерпания памяти прерывает PHP при частично инициализированных данных запроса; при очистке недопустимые данные принимаются за допустимые CVSS v4.0 9.2 8.5.12 · 8.4.27 · 8.3.36 · 8.2.35
CVE-2026-109619
GHSA-6wmf-4rv5-p3rp
Состояние запроса переживает освобождение памяти; следующий запрос того же воркера использует его до повторной инициализации CVSS v4.0 9.2 8.5.12 · 8.4.27 · 8.3.36 · 8.2.35

Название PHP2Shell не является официальным ярлыком проекта PHP: его придумали исследователи и вендоры средств защиты, и оно прижилось, поэтому именно с ним — в привязке к этим двум CVE — вы будете сталкиваться в выводе сканеров, бюллетенях хостеров и уведомлениях CERT.

Кто действительно под угрозой

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

Конфигурация Риск Почему
Apache с mod_php Максимальный В бюллетене описан продемонстрированный эксплойт, в котором запрос без аутентификации запускает атаку до того, как выполнится хоть какая-то строка кода приложения
PHP-FPM (nginx, Apache в роли прокси) Высокий Долго живущие воркеры повторно используют состояние запросов; воркер обычно работает от того же пользователя, что и сайт
LiteSpeed, php-cgi, FrankenPHP Высокий Прямо названы в бюллетене среди затронутых конфигураций, обслуживающих запросы
Управляемый хостинг и shared-хостинг По-разному — уточняйте Обычно исправления устанавливаются на уровне платформы, но вы этого не видите; ваша задача — получить встроенную версию и дату установки заплатки в письменном виде
Задачи cron и CLI-скрипты Ниже, но обновиться все равно нужно Не имеют публичной поверхности запросов, но используют тот же бинарный файл и часто хранят учетные данные

Если вы размещаете WordPress, WooCommerce, Laravel, Magento, ERP-системы на базе Magento или любой PHP-портал бронирования для вашей торговой компании, вы попадаете в первые три строки таблицы, даже если код приложения безупречен. О том, кому вообще стоит доверить сопровождение среды исполнения, подробнее рассказывает наш материал об ИТ-аутсорсинге в Турции.

Проверьте свою версию за две минуты

Ловушка здесь — арифметика версий. Дистрибутивы годами поставляют PHP 8.3.6 или 8.2.x, перенося исправления безопасности в тот же видимый номер версии, поэтому одной команды php -v недостаточно, чтобы понять, защищены ли вы. Сравните три вещи.

1. Видимая версия PHP и SAPI, обслуживающая трафик.

php -v
php -i | grep -E 'PHP Version|memory_limit|session.upload_progress.enabled|fatal_error_backtraces'
systemctl list-units --type=service --state=running | grep -Ei 'php|apache|nginx|litespeed'

2. Версия пакета из дистрибутива, а не апстримная. В Debian и Ubuntu честный ответ даст changelog; в RPM-системах запросите changelog пакета.

dpkg -l | grep -E 'php8\.[0-9]-(fpm|cli)|libapache2-mod-php'
zcat /usr/share/doc/php8.3-cli/changelog.Debian.gz | grep -iE 'CVE-2026-10961[89]'
apt-cache policy php8.3-fpm | head -4
# RPM-based hosts
rpm -q php && rpm -q --changelog php | grep -iE 'CVE-2026-10961[89]'

Если в changelog установленной версии упомянуты обе CVE, вы защищены, даже если php -v по-прежнему показывает 8.3.6. В этом и разница между настоящим ответом на вопрос безопасности и верой в магию номера версии.

3. Перегрузил ли запущенный процесс пропатченный бинарный файл. Обновление пакета без последующего рестарта оставляет старый код в памяти. Сравните время запуска сервиса со временем установки пакета:

systemctl show php8.3-fpm -p ActiveEnterTimestamp -p MainPID
stat -c '%y %n' /usr/sbin/php-fpm8.3

На cPanel, Plesk, DirectAdmin или управляемой платформе эквивалентом будут селектор версий PHP и собственный бюллетень хостера: выясните встроенную версию, которая фактически назначена вашему сайту, а не самую новую из рекламируемых в панели. Если хостер не может назвать дату установки заплатки, считайте сайт непропатченным. Наши услуги цифровой инфраструктуры охватывают и этот аудит, и само обновление; можно также просто связаться с нами, описав ваш стек, — и мы скажем, что проверили бы на вашем месте.

Исправленные версии и обрыв EOL

PHP поддерживает каждую ветку два года активной разработки и еще два года — исправлениями безопасности. Именно эта политика дала четыре одновременных исправления 21 октября — и она же оставляет старые ветки предоставленными самим себе.

Ветка Исправленный релиз Статус после этого бюллетеня
PHP 8.5 8.5.12 Активно поддерживается
PHP 8.4 8.4.27 Активно поддерживается
PHP 8.3 8.3.36 Фаза только исправлений безопасности
PHP 8.2 8.2.35 Поддержка безопасности заканчивается 31 декабря 2026 года — планируйте переход уже сейчас
PHP 8.1 и старше Апстрим-релиза нет Только бэкпорты вендоров; проект PHP опубликовал минимальные бэкпорты в исходном коде для 7.4, 8.0 и 8.1 для тех, кто собирает PHP из исходников

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

Пропатчить боевой сервер без инцидента

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

  1. Сначала снапшот. Снапшот гипервизора или тома, восстановление из которого вы действительно проверяли, возвращает систему за минуты — и делает решение об обновлении дешевым.
  2. Воспроизведите версию на стейджинге. Та же ветка, те же расширения, те же конфигурационные файлы PHP, копия боевых данных. Прогоните оформление заказа, запрос коммерческого предложения и оплату, а не только главную страницу.
  3. Обновляйте набор пакетов целиком. Смешение обновленного CLI со старым бинарником FPM — типичный способ получить пропатченный php -v и непропатченный веб-путь: apt-get update && apt-get install --only-upgrade 'php8.3-*' или dnf update --security 'php*' на RPM-хостах.
  4. Перезапустите процесс, обслуживающий запросы, и проверьте, что он перезапустился. systemctl restart php8.3-fpm (или reload Apache / рестарт LiteSpeed), затем снова сверьте время запуска сервиса и повторите запросы версии и changelog.
  5. Час наблюдайте за логом ошибок. Сообщения OOM, новые сигнатуры фатальных ошибок и необычная доля ответов 5xx — это признаки того, что описанные ниже защитные настройки, возможно, придется донастроить, а не причины откладывать обновление.
  6. Зафиксируйте доказательства. Версия пакета, строка changelog с обеими CVE, время рестарта. Именно это запрашивают клиенты, аудиторы и проверки контролей по образцу ISO 27001, а на сохранение уходит десять секунд.

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

Временные меры защиты: сузить окно, а не закрыть его

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

Против CVE-2026-109618 (сценарий исчерпания памяти)

  • Пусть PHP исчерпывает память машины, а не собственный лимит: memory_limit = -1, в идеале — как php_admin_value memory_limit = -1, чтобы код приложения не мог вернуть потолок на место.
  • Ограничивайте размер тел запросов на уровне интерпретатора: рекомендация бюллетеня — примерно 8 МБ, если загрузка файлов не используется, и примерно 32 МБ, если используется, причем upload_max_filesize должен быть меньше post_max_size.
  • Ограничения, отсекающие ресурсоемкие запросы, вводите на прокси, потому что ущерб заложен в декодированном запросе, а не в его размере на линии: суммарный размер декодированного тела, количество полей ввода, количество частей multipart, количество заголовков, глубина вложенности — и не забудьте запросы, которые приходят без пригодного Content-Length.
  • Ограничивайте радиус поражения лимитом памяти контейнера или cgroup, подобранным так, чтобы убитый воркер означал событие уровня доступности, а не уровня всего хоста. Не заменяйте это на RLIMIT_AS или RLIMIT_DATA: они как раз провоцируют ту ошибку выделения памяти, которая лежит в уязвимом пути.

Против CVE-2026-109619 (сценарий устаревшего состояния)

  • Отключите механизм session upload progress: session.upload_progress.enabled = 0, заданный в php.ini, пуле FPM или конфигурации сервера — там, где настройка применяется до разбора запроса. Затем перезапустите каждый воркер: FPM передает уже инициализированное состояние модулей от запроса к запросу. ini_set() и .user.ini срабатывают слишком поздно, чтобы помочь.
  • На PHP 8.5 установите fatal_error_backtraces = 0 и перезапустите процесс.
  • Уберите настройки уровня запроса, которые недопустимы или устарели и потому выдают диагностические сообщения при ранней инициализации. Подавление сообщения через error_reporting, display_errors или @ не убирает сам путь исполнения кода.
  • Поищите достижимые для злоумышленника фатальные ошибки и долгие таймауты в обработчиках загрузки и импорта, коде колбэков и процедурах очистки — там же, где живут обе ошибки.

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

Что спросить у хостинг-провайдера уже сегодня

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

  • Встроенная версия PHP, назначенная нашему аккаунту, и является ли она пакетом дистрибутива или сборкой вендора.
  • Дата, когда исправления CVE-2026-109618 и CVE-2026-109619 дошли до вашего парка серверов, вместе со строкой внутренней версии пакета.
  • Распространяется ли исправление на SAPI, обслуживающую наш сайт (FPM, LiteSpeed, mod_php), и на стейджинг- или резервные узлы, с которых мы можем восстановиться.
  • Если платформа еще не пропатчена: какой компенсирующий контроль действует и до какого срока.
  • Ваша действующая политика для EOL-веток: что случится с моим сайтом 1 января 2027 года, когда прекратится поддержка безопасности PHP 8.2.

Провайдер, который отвечает на все пять вопросов одним письмом, заслуживает того, чтобы остаться вашим провайдером. Тот, кто в ответ присылает маркетинговый текст, — уже повод для разговора о миграции; та же строгость применяется в нашей работе по анализу пробелов по ISO 27001, где результат — доказательства, а не заверения.

Стоит ли считать, что вас взломали?

Не автоматически — но проверьте, а не гадайте, особенно если сервер был открыт в публичный интернет в окне до установки вашей заплатки.

  • Поищите процессы, слушающие порты и записи cron, которые вы не создавали, а также исходящие соединения от пользователя PHP-воркера.
  • Сверьте доступные на запись каталоги приложения с эталонным источником деплоя: новые PHP-файлы, измененные каталоги загрузок, неожиданно исполняемые временные папки.
  • Просмотрите веб-логи: всплески запросов в часы раскрытия, необычно большие multipart-тела или запросы, вернувшие 500 с сигнатурами OOM в логе ошибок PHP.
  • Убедитесь, что реально запущен пропатченный бинарный файл — на это отвечает описанное выше сравнение времени рестарта.
  • Если что-то выглядит подозрительно, действуйте как при инциденте: сохраните диск и логи, смените все учетные данные, которые приложение может прочитать, и пересоберите систему из заведомо исправного образа. Переустановка пакета PHP поверх скомпрометированного хоста не является устранением последствий.

Разобранный пример из нашей собственной инфраструктуры

Мы обслуживаем worldwidetradex.com на Ubuntu 24.04 LTS с nginx и PHP-FPM, поэтому 22 октября прогнали описанные выше проверки на самих себе. Результаты — наглядная иллюстрация того, почему арифметика версий важна:

php -v показал PHP 8.3.6 — число, которое в сравнении с апстримным PHP выглядит устаревшим на три года и вызывает тревогу.

dpkg -l сообщил 8.3.6-0ubuntu0.24.04.13, а Debian-changelog именно этой версии перечисляет CVE-2026-109618 и CVE-2026-109619 с примененной заплаткой вендора. apt-cache policy показал, что установленная версия совпадает с кандидатом, то есть более нового ничего не ожидалось.

Вывод: пропатчены через бэкпорт дистрибутива, трафик обслуживает PHP-FPM, а не mod_php, сервис FPM перезапущен после обновления пакета. То же упражнение, пять команд — и мы можем показать доказательства клиенту, который спросит.

Урок переносится на любой стек: ваша реальная защищенность — это версия пакета плюс changelog плюс рестарт, а не маркетинговая строка версии в панели хостинга.

Сделайте патчирование рутиной, а не подвигом

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

  • Автоматическая установка обновлений безопасности интерпретатора с автоматической же фиксацией версии и факта перезапуска.
  • Инвентаризация, которая знает, какая SAPI и какая ветка PHP используется на каждом сайте, включая стейджинг, резервные копии и тот самый WordPress 2019 года.
  • Отработанный путь восстановления, чтобы «патчим сейчас» никогда не уравновешивалось «мы не можем откатиться».
  • План по веткам: ничего не остается на релизе PHP, чья поддержка безопасности закончится в ближайшие двенадцать месяцев.
  • Один поименованный ответственный на каждый сервер и письменный маршрут эскалации для дней, когда заплатка выходит в 14:00 UTC в среду.

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

Часто задаваемые вопросы

Мой сайт точно взломан, если на нем непропатченная версия PHP?

Не обязательно. Непропатченная установка PHP с выходом в интернет уязвима, а сканирование началось примерно во время раскрытия, но уязвимость — еще не компрометация. Сначала обновите, затем выполните описанные выше шаги проверки; считайте хост скомпрометированным только при наличии признаков — и, если они найдутся, пересобирайте систему, а не чистите.

Хостер говорит, что у меня PHP 8.3.6. Это пропатченная версия или нет?

Зависит от сборки. Пакеты дистрибутивов несут исправления CVE, сохраняя апстримный номер версии, поэтому PHP 8.3.6 из Ubuntu 24.04 или Debian уже может включать оба исправления. Запросите полную версию пакета и строку changelog с CVE-2026-109618 и CVE-2026-109619; на управляемых платформах вместо этого просите дату установки заплатки.

Защищают ли от PHP2Shell обновления плагинов, тем или фреймворка?

Нет. Обе уязвимости находятся в подготовке и завершении запроса внутри интерпретатора PHP, а не в коде приложения. Обновлять приложение — по-прежнему полезная гигиена, WAF замедляет оппортунистический трафик, но убирает уязвимость только обновление интерпретатора.

Можно ли просто снизить лимит памяти, чтобы заблокировать ошибку исчерпания памяти?

Наоборот. Промежуточная рекомендация бюллетеня для CVE-2026-109618 — не давать PHP прерываться на собственном потолке памяти (memory_limit = -1, заданный так, чтобы код приложения не мог его переопределить), затем ограничить сложность запросов на прокси и обособить воркер лимитом контейнера или cgroup. Более жесткий лимит PHP находится внутри того самого режима отказа, который эксплуатируется.

У нас PHP 8.1 или старше, апстрим-релиза для них не было. Что делать?

Если возможно, переходите на поддерживаемую ветку — это прочное решение. Если нет, возьмите исправление из своего дистрибутива или у вендора (это единственный реалистичный источник) либо примените минимальные бэкпорты в исходном коде, опубликованные проектом PHP для 7.4, 8.0 и 8.1, если вы собираете из исходников. Зафиксируйте это решение письменно: каждый месяц, который вы на нем остаетесь, меняет ваш профиль риска.

Опасно ли обновление PHP 8.3 до 8.3.36 для работающего магазина?

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

Источники

Хотите доверить обновление специалистам? Чтобы обсудить патчирование, аудит версий, миграцию на управляемую и пропатченную PHP-платформу или инфраструктуру вокруг нее, свяжитесь с нами или позвоните по номеру +7 968 927 78 03.