Уязвимость PHP: патч PHP2Shell и проверка версии PHP (WordPress)

PHP2Shell — так называют две уязвимости PHP (CVE-2026-109618 · CVE-2026-109619), патчи для которых вышли 21 октября 2026 года. Это уязвимости удалённого выполнения кода: даже запрос без входа в систему может запустить код на сервере, поэтому первым делом стоит проверить, какую версию PHP использует ваш сайт, и обновить её до версии с патчем. Ниже — проверка версии PHP через «Здоровье сайта» на сервере Nginx + Apache с WordPress 7.1.3, обновление только пакетов php до версии с патчем и повторная проверка.
1️⃣ Уязвимость PHP PHP2Shell: как устроены уязвимости и кого они затрагивают
Уязвимости находятся внутри движка PHP, который читает запрос ещё до выполнения кода WordPress, поэтому даже при актуальных плагинах и темах они никуда не денутся, пока PHP не обновлён. По данным предупреждения CERT-EU, обе уязвимости получили 9,2 балла по CVSS; технические подробности опубликованы и обсуждаются, а ранний код proof of concept уже начал распространяться.
CVE-2026-109618 — уязвимость, при которой, если запрос превышает лимит памяти (memory_limit) и прерывается, процесс очистки принимает данные запроса, инициализированные лишь наполовину, за корректные. CVE-2026-109619 — уязвимость, при которой состояние памяти, освобождённой после фатальной ошибки, сохраняется и повторно используется до инициализации следующим запросом, который обрабатывает тот же воркер.
Согласно объявлению php.net, затронуты все установки PHP, обрабатывающие веб-запросы, а самой опасной конфигурацией названа Apache mod_php. Дело в том, что на mod_php была показана атака, которую один запрос без входа в систему запускает ещё до выполнения кода приложения.
| Способ запуска PHP | Влияние | Примечание |
|---|---|---|
| Apache mod_php | 🔴 Уязвим · наибольший риск | Демонстрация: один запрос без входа в систему запустил атаку до выполнения кода приложения |
| PHP-FPM | 🔴 Уязвим | — |
| php-cgi | 🔴 Уязвим | — |
| FrankenPHP | 🔴 Уязвим | — |
| LiteSpeed | 🔴 Уязвим | — |
Исправленные версии — 8.2.35, 8.3.36, 8.4.27 и 8.5.12, а все более ранние версии веток 8.2–8.5 уязвимы. PHP 8.1 и более ранние версии — ветки, которые проект PHP больше не поддерживает, поэтому официальных версий с патчем для них нет; их защищают исправления, перенесённые дистрибутивами и хостинг-провайдерами (бэкпорты).
На момент публикации сообщения CISA 21 октября реальных случаев эксплуатации подтверждено не было, но CISA сочла опасным оставлять системы без патча и рекомендовала обновить их немедленно, начиная с систем, доступных из интернета. CERT-EU в предупреждении того же дня пришёл к выводу, что с появлением кода proof of concept выросла вероятность того, что злоумышленники уже используют эти уязвимости.
2️⃣ Проверка версии PHP: Здоровье сайта › Информация › Сервер
Даже зная об уязвимостях, нельзя решить, что делать, пока неизвестно, на какой версии PHP работает ваш сайт. В панели администратора откройте [Инструменты › Здоровье сайта] и разверните раздел [Сервер] на вкладке [Информация]: в строке [Версия PHP] указана версия PHP, которая на самом деле обрабатывает запросы сайта.
Строка [PHP SAPI] сразу под [Версия PHP] показывает способ запуска PHP; fpm-fcgi означает конфигурацию PHP-FPM. Здесь достаточно двух строк раздела [Сервер] — [Версия PHP] и [PHP SAPI].
Атака начинается с запроса без входа в систему. На этапе, когда PHP читает специально подготовленный запрос раньше кода WordPress, запрос задевает одну из двух уязвимостей, и дело доходит до выполнения кода на сервере. Исправленные версии перекрывают этот путь, поэтому задача — поднять PHP сайта до исправленной версии или новее.
[php -v] в терминале показывает только версию PHP командной строки по умолчанию. В конфигурациях, где на одном сервере установлено несколько версий PHP, например EA-PHP в cPanel или alt-php в CloudLinux, она может отличаться от версии, которую использует сайт. Поэтому ориентиром служит значение [Версия PHP] в «Здоровье сайта».
php -vPHP 8.3.xx (cli) (built: Jun 3 2025 17:17:57) (NTS gcc x86_64)3️⃣ Ниже PHP 8.2: уточните у хостинга, применён ли бэкпорт, и попросите его, если нет
Если [Версия PHP] в «Здоровье сайта» ниже 8.2 (7.x · 8.0 · 8.1), официальной версии с патчем от php.net нет. Согласно таблице поддерживаемых версий на php.net (проверено 22 октября 2026 года), поддерживаются только четыре ветки — 8.2, 8.3, 8.4 и 8.5, а для официальных версий 8.1 и ниже патчи безопасности не выходят.
Вместо этого дистрибутивы и хостинг-провайдеры иногда выпускают пакеты, которые сохраняют номер версии и переносят только исправление (бэкпорты). Пример — пакеты 7.4.33 · 8.0.30 · 8.1.34 на тестовом сервере одного управляемого хостинга. В их журнале изменений была строка [Backported from 8.2.35 — CVE-2026-109618, CVE-2026-109619].
Даже при том же номере версии наличие исправления проверяют поиском номера CVE в журнале изменений пакета. В семействе Debian · Ubuntu ищут командой вида [zcat /usr/share/doc/php8.2-cli/changelog.Debian.gz | grep 109618]. В семействе RPM — [rpm -q --changelog php-common | grep 109618]; номер версии в имени пакета подставляют под версию, которую использует сайт.
Поэтому при версии ниже 8.2 сначала уточните у хостинг-провайдера, применён ли бэкпорт, а если нет или подтвердить это не удаётся, попросите перевести сайт на поддерживаемую версию (8.2 или выше). После обновления снова проверьте значение [Версия PHP] в «Здоровье сайта».
CISA рекомендовала организациям, которые используют 8.1 или более ранние версии и не могут обновиться сразу, держать системы на PHP офлайн до установки патча или обновления.
Если вы сами администрируете сервер и используете 8.1 или более раннюю версию, можно установить пакеты с бэкпортом из дистрибутива или применить патчи исходного кода для 7.4 · 8.0 · 8.1 от команды безопасности PHP. Но это ветки без поддержки, поэтому настоящее решение — переход на поддерживаемую версию.
4️⃣ PHP 8.2 и выше: обновите до версии с патчем и проверьте снова
Если у вас 8.2 или выше, но ниже версии с патчем, обновите сам PHP. На управляемом и виртуальном хостинге патч на весь сервер ставит провайдер, поэтому уточните по его объявлениям или через поддержку, применён ли патч и какая сборка установлена, а затем посмотрите, изменилась ли [Версия PHP] в «Здоровье сайта». Согласно объявлению на странице статуса, Cloudways начала устанавливать патч на все поддерживаемые версии PHP (5.6–8.4) 21 октября в 22:19 UTC. 22 октября в 10:11 UTC Cloudways сообщила о завершении работ.
На сервере, который вы администрируете сами, обновляйтесь пакетами из репозитория дистрибутива или LTS-поставщика, как указано в объявлении php.net. Перед обновлением просмотрите в режиме предпросмотра список пакетов, которые изменятся, убедитесь, что обновляются только пакеты, начинающиеся с php, и что никакие другие не подтягиваются, и не смешивайте это с другими обновлениями операционной системы.
dnf upgrade --assumeno 'php*'Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Upgrading:
php x86_64 8.3.xx-1.… … 1.9 M
php-cli x86_64 8.3.xx-1.… … 5.6 M
php-common x86_64 8.3.xx-1.… … 1.3 M
php-fpm x86_64 8.3.xx-1.… … 1.9 M
(строки пакетов расширений, таких как php-gd · php-intl, опущены)
Transaction Summary
================================================================================
Upgrade xx Packagesdnf upgrade 'php*'Upgraded:
php-8.3.xx-1.….x86_64
php-cli-8.3.xx-1.….x86_64
php-common-8.3.xx-1.….x86_64
php-fpm-8.3.xx-1.….x86_64
(строки пакетов расширений опущены)
Complete!В этом тесте до версии с патчем обновились только пакеты, начинающиеся с php, а php-fpm сам перезапустился по завершении установки пакетов. Исправленная версия начинает действовать только после перезапуска воркеров php-fpm, поэтому в средах без автоматического перезапуска выполните [systemctl restart php-fpm] сами.
После обновления проверьте, что и [php -v], и строка [Версия PHP] на вкладке [Информация] в «Здоровье сайта» показывают версию с патчем или новее, а также проверьте состояние службы php-fpm и ответ сайта. Если изменилось только значение в командной строке, а [Версия PHP] осталась прежней, перезапустите php-fpm и проверьте ещё раз.
И после обновления разверните раздел [Сервер] на вкладке [Информация] того же экрана [Инструменты › Здоровье сайта] и посмотрите на строку [Версия PHP]. Если значение сменилось на установленную версию, значит, и воркеры php-fpm уже работают на новой версии.
php -vPHP 8.3.xx (cli) (built: Oct 19 2026 14:00:34) (NTS gcc x86_64)systemctl is-active php-fpmactivecurl -s -o /dev/null -w '%{http_code}\n' 'https://example.com/?r=1'200У пакетов, где растёт сам номер версии, патч подтверждают по новому номеру версии, а у пакетов с бэкпортом, сохраняющих номер, — по номеру CVE в журнале изменений. Этот сервер относился к первому случаю: в [rpm -q --changelog php-common] строки с номером CVE не было, и патч был подтверждён по новому номеру версии в первой строке журнала изменений.
5️⃣ Если обновить сразу нельзя: временные меры от php.net
Для серверов, которые нельзя обновить сразу, php.net приводит настройки ниже как временные меры, но уточняет, что они лишь сужают отдельные пути атаки и не делают установку безопасной. Там же сказано не ограничивать память вместо этого через RLIMIT_AS или RLIMIT_DATA: это может как раз вызвать уязвимые сбои выделения памяти.
| Настройки | Значение | Где | Что закрывает |
|---|---|---|---|
| memory_limit | -1 | php_admin_value в пуле FPM или конфигурации Apache (чтобы приложение не могло вернуть значение) | CVE-2026-109618 · путь сбоя при лимите памяти (не полностью) |
| post_max_size | 8M (32M, если нужны загрузки) · upload_max_filesize — меньше этого значения | php.ini · настройки пула | CVE-2026-109618 |
| session.upload_progress.enabled | 0 + перезапуск всех воркеров | php.ini · пул FPM · настройки сервера (не через ini_set() или .user.ini) | CVE-2026-109619 · только подтверждённый путь через сессии |
| fatal_error_backtraces | 0 + перезапуск всех воркеров (только PHP 8.5) | То же, что выше | CVE-2026-109619 · только подтверждённый путь через трассировку стека |
php_admin_value — это серверная настройка, которую приложение не может вернуть, поэтому пользователи виртуального хостинга часто не могут изменить её сами, и в этом случае тоже приходится обращаться к хостинг-провайдеру. php.net также советует задать ограничения — и на уровне веб-сервера или прокси — для размера тела запроса, числа полей ввода, числа частей multipart, числа заголовков и глубины вложенности.
🔢 FAQ & рекомендуемые материалы
Безопасность
Уязвимости безопасности wp-config.php
Как не допустить раскрытия файла wp-config.php и усилить настройки безопасности.
Безопасность
WordPress XML-RPC
Как распознать атаки на xmlrpc.php по логам и три способа его отключить.
Сервер
Предупреждение php-fpm max_children
Практический тест: причина предупреждения находится в логах до добавления воркеров.
ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.