статья /

PHP2Shell: уязвимость в самом PHP и что сделать с сайтом

В октябре 2026 года в PHP нашли две уязвимости, через которые можно выполнить код на сервере без логина и пароля. Затронуты сайты на любой CMS — 1С-Битрикс, OpenCart, MODX, WordPress, самописные: ошибка не в CMS, а в самом PHP. Надёжное решение одно — обновить PHP.

опубликовано
11.11.2026 · обновлено 11.11.2026
оценка опасности
9,2 из 10 (CVSS 4.0)
исправлено в
PHP 8.2.35, 8.3.36, 8.4.27, 8.5.12
01 / коротко

Коротко

  • PHP2Shell — общее название двух уязвимостей: CVE-2026-109618 и CVE-2026-109619.
  • Входить на сайт не нужно: достаточно отправить на сервер специально собранный запрос.
  • Ошибка в самом PHP, поэтому обновление CMS и модулей не помогает.
  • Подробности утекли в сеть 20 октября, исправления вышли 21 октября 2026 года.
  • По данным watchTowr, атаки на обе уязвимости идут с 21 октября. 26 октября CISA — агентство кибербезопасности США — внесло CVE-2026-109618 в список уязвимостей, которые используют в реальных атаках.
  • Команда PHP прямо пишет: настройками уязвимость полностью не закрыть, безопасный вариант — только обновление.
02 / версии

Какие версии затронуты

Какие версии затронуты
версия PHP уязвимы исправление
8.5 ниже 8.5.12 8.5.12
8.4 ниже 8.4.27 8.4.27
8.3 ниже 8.3.36 8.3.36
8.2 ниже 8.2.35 8.2.35 — поддержка ветки заканчивается 31.12.2026
7.4, 8.0, 8.1 все официальных выпусков нет: исправление от дистрибутива или переход на 8.2 и новее
7.3 и старше, 5.x все исправлений нет — только переход на новую версию

Debian, Ubuntu, RHEL и другие дистрибутивы переносят исправления в свои пакеты и часто оставляют старый номер версии. Поэтому по номеру видно не всё: проверять нужно бюллетень дистрибутива или список изменений пакета (команды — ниже).

03 / как работает

Как работает атака

  • CVE-2026-109618 — нехватка памяти при разборе запроса

    PHP разбирает входящий запрос ещё до того, как запустится код сайта. Если на этом шаге память упирается в лимит memory_limit, PHP аварийно прерывает разбор и пропускает очистку. Память остаётся в испорченном состоянии, и следующий запрос может этим воспользоваться.
  • CVE-2026-109619 — прогресс загрузки файлов

    Ошибка связана с функцией, которая отслеживает загрузку файла (session.upload_progress). Она включена по умолчанию. Атакующий отправляет запрос с файлом, придерживает его и заставляет PHP обратиться к уже освобождённой памяти.
  • Какие серверы затронуты

    Все способы запуска PHP для сайтов: PHP-FPM, Apache с mod_php, php-cgi, FrankenPHP, LiteSpeed. Опаснее всего mod_php: там атака срабатывает до того, как запустится код сайта.
04 / падения сайта

Почему сайт может падать

Атака держит рабочий процесс PHP занятым: по данным Qualys, распространённые скрипты держат одну загрузку открытой почти минуту. На необновлённом PHP то же состояние может уронить процесс. Когда таких запросов много, свободные процессы заканчиваются, и сайт отвечает ошибками 502 и 504 или не открывается вовсе.

Массовые падения сайтов с PHP2Shell публично пока никто не связал. Но если сайт стал падать с конца октября, а в журналах PHP-FPM видно аварийные завершения процессов и упоры в memory_limit, — это повод проверить версию PHP в первую очередь.

05 / проверка

Как проверить версию PHP

Смотреть нужно версию того PHP, который обслуживает сайт. Команда php -v в консоли может показать другую установку: на сервере их бывает несколько.

Проще всего — в панели хостинга: версия PHP обычно указана в настройках сайта.

Через сайт: создайте в корне сайта файл с любым именем, откройте его в браузере и сразу удалите.
<?php echo PHP_VERSION;
Есть ли исправление в пакете дистрибутива:
# Debian, Ubuntu (замените php8.2 на свою версию)
zgrep -c "CVE-2026-109618" /usr/share/doc/php8.2-common/changelog.Debian.gz

# RHEL, AlmaLinux, Rocky
rpm -q --changelog php-common | grep -c "CVE-2026-109618"

Ноль совпадений — исправления в пакете нет. Если PHP поставлен не из дистрибутива, а, например, из репозитория Sury, сверяйте номер версии с таблицей.

06 / что сделать

Что сделать

  1. шаг 01

    Резервная копия

    Файлы сайта и база данных — до любых изменений.

  2. шаг 02

    Обновление PHP

    До исправленной версии из таблицы или до пакета дистрибутива с исправлением. На виртуальном хостинге PHP обновляет хостинг: напишите в поддержку и спросите про CVE-2026-109618 и CVE-2026-109619.

  3. шаг 03

    Перезапуск всех процессов PHP

    PHP-FPM, Apache, LiteSpeed. Запущенные процессы держат старый код в памяти, и без перезапуска обновление не действует.

  4. шаг 04

    Проверка сайта

    Оформление заказа, формы заявок, оплата, обмены с CRM и 1С.

  5. шаг 05

    Переход на новую ветку, если сайт на PHP 7.4–8.1

    Если исправленного пакета для старой версии нет, остаётся переход на PHP 8.2 и новее. Старый код на новой версии часто не работает, поэтому переход идёт на копии сайта: несовместимый код исправляется, и только потом сайт переключается.

  6. шаг 06

    Проверка на следы взлома

    Если сервер работал без исправления после 20 октября — признаки ниже.

07 / временные меры

Если обновить прямо сейчас нельзя

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

  • Отключить прогресс загрузки: session.upload_progress.enabled = 0. Только в php.ini, в настройках пула PHP-FPM или веб-сервера — не через ini_set() и не через .user.ini.
  • Уменьшить post_max_size: 8M, если сайт не принимает файлы, 32M — если принимает. upload_max_filesize — меньше него.
  • Ограничить на nginx или другом прокси размер запроса, число полей и заголовков.
  • На PHP 8.5 — fatal_error_backtraces = 0.
  • Команда PHP также советует снять memory_limit (значение -1) и ограничивать память процесса снаружи — через cgroup или контейнер. Это меняет поведение сайта под нагрузкой: без проверки на копии не делать.
; php.ini или пул PHP-FPM — временно, до обновления
session.upload_progress.enabled = 0
post_max_size = 8M
upload_max_filesize = 6M
08 / признаки взлома

Признаки взлома

Тело POST-запроса веб-сервер обычно не записывает, поэтому саму атаку в журнале не видно. Искать нужно последствия.

  • Сначала сохраните журналы веб-сервера и PHP — до любых чисток.
  • Новые PHP-файлы в папках сайта, особенно в каталогах загрузок и кэша.
  • Новые задания cron и новые пользователи на сервере.
  • Необычно большие или многоуровневые запросы с файлами в журнале веб-сервера.
  • Аварийные завершения процессов PHP и упоры в memory_limit.
  • Исходящие соединения от процессов PHP на незнакомые адреса.
# PHP-файлы, изменённые после 20 октября (замените /var/www на папку сайта)
find /var/www -name "*.php" -newermt 2026-10-20 -type f

# задания cron пользователя, от которого работает сайт
crontab -l -u www-data

Если следы есть, одного обновления мало. Сайт восстанавливается из чистой копии, а пароли и ключи меняются: база данных, доступ к серверу, API-ключи CRM, 1С, платёжных систем и служб доставки. Ключи интеграций обычно лежат в конфигурации сайта — у того, кто выполнил код на сервере, они уже есть.

10 / помощь

Помощь с обновлением

Работа удалённо — по доступу к серверу или через панель хостинга.

  • Проверка версии PHP и пакетов, через которые работает сайт.
  • Обновление PHP с резервной копией и перезапуском всех процессов.
  • Переход со старой версии PHP на новую — с исправлением несовместимого кода на копии сайта.
  • Проверка оформления заказа, форм, оплаты и обменов с CRM и 1С после обновления.
  • Поиск следов взлома и смена ключей интеграций, если они могли утечь.
  • Заодно — проверка ядра сервера на CVE-2026-98432.

Цена: 50 BYN/час. После разбора сервера называется оценка — одно число часов, без вилки. Оплата — по этой оценке: если работа займёт больше времени, сумма не меняется. Срочно, в выходные или ночью — ×1,5. Если найдены следы взлома, восстановление оценивается отдельно — тоже одним числом.

11 / вопросы

Вопросы

Сайт на 1С-Битрикс (WordPress, OpenCart) — достаточно обновить CMS?

Нет. Уязвимость в самом PHP, а не в CMS. Обновление CMS её не закрывает.

Сайт на виртуальном хостинге. Что делать?

PHP на таком хостинге обновляет хостинг. Узнайте версию в панели и спросите поддержку, установлено ли исправление CVE-2026-109618 и CVE-2026-109619. Если хостинг предлагает переключиться на PHP 8.2 и новее, сначала проверьте сайт на копии: старый код на новой версии может не работать.

Сайт закрыт Cloudflare или другим фильтром запросов. Этого хватит?

Фильтр снижает число атак, но не заменяет обновление: команда PHP называет обновление единственным безопасным вариантом.

PHP обновлён, а сайт перестал работать. Что случилось?

Чаще всего сайт переключили на новую ветку PHP — например, с 7.4 на 8.2, — и старый код на ней не работает. Решение — исправить несовместимый код на копии сайта и переключиться снова.

Сколько стоит обновление?

50 BYN/час. Оценка — одно число часов после разбора сервера, оплата — по ней. Если работа займёт больше времени, сумма не меняется. Срочно, в выходные или ночью — ×1,5.

13 / заявка

Нужно обновить PHP на сервере?

На заявки отвечает Савелий — без менеджеров.

Или напишите напрямую: Telegram @somelij Viber +375 44 710-50-58
Например: «OpenCart, VPS на Ubuntu 22.04, PHP 7.4»
Обсудить задачу Telegram