
session.upload_progress. Она затрагивает только приложения, которые через ini_set() переключают обработчик сессий с php_binary или php_serialize на php. Остальным приложениям CVE-2026-115560 не угрожает. Команда PHP всё равно советует отключить session.upload_progress.enabled до следующего планового релиза: это ещё и частичная защита от CVE-2026-109619. Обновление до исправленных версий от 21 октября нужно в любом случае.21 октября 2026 года команда PHP выпустила внеплановые релизы 8.5.12, 8.4.27, 8.3.36 и 8.2.35 в 17:00 по московскому времени, как было объявлено накануне. Изначально публикацию планировали на 22 октября. До этой даты вендоры дистрибутивов, получившие патчи заранее, обязались не раскрывать сведения об уязвимостях. Но 20 октября детали утекли в сеть, и релиз вышел на день раньше.
Обновления закрывают две критические уязвимости: CVE-2026-109618 и CVE-2026-109619. В международной базе обе уязвимости получили 9,2 балла по шкале CVSS и статус «Критический». В тот же день они попали в Банк данных угроз ФСТЭК России.
Неофициальное название этих уязвимостей — PHP2Shell. Обе приводят к удалённому выполнению кода на сервере без аутентификации (RCE, Remote Code Execution). Проблема кроется в самом интерпретаторе, поэтому обновлять CMS или фреймворки бесполезно — нужно патчить PHP.
Главное об уязвимостях PHP за 30 секунд
- Что произошло. Команда PHP закрыла две критические RCE-уязвимости ядра — CVE-2026-109618 и CVE-2026-109619, обе внесены в БДУ ФСТЭК под номерами BDU:2026-17191 и BDU:2026-17192.
- Дополнение от 23 октября (CVE-2026-115560). Обнаружена узкая уязвимость в
session.upload_progress. Срабатывает, только если код черезini_set()переключаетsession.serialize_handlerнаphp. Приложениям со статичными настройками эта CVE не угрожает, но команда PHP всё равно советует отключитьsession.upload_progress.enabledдо планового релиза. - Кто уязвим. Все версии PHP ниже 8.2.35, 8.3.36, 8.4.27 и 8.5.12, а также тестовые сборки 8.6.0 до RC4.
- Что сделать. Обновить PHP на всех серверах, начиная с доступных из интернета, и перезапустить PHP-FPM, Apache и долгоживущие воркеры.
- Что сделать после обновления. Проверить сервер на признаки компрометации до патча и ротировать секреты, которые мог прочитать процесс веб-сервера: пароли БД, API-ключи, токены сессий, ключи шифрования.
Что такое PHP2Shell и чем опасны уязвимости CVE-2026-109618 и CVE-2026-109619
PHP2Shell — общее название двух независимых ошибок в ядре интерпретатора PHP. Обе связаны с управлением памятью. В бюллетенях команды PHP среди прочих указан класс ошибки управления динамической памятью (Use-After-Free, CWE-416), но механика у уязвимостей разная.
- CVE-2026-109618 срабатывает при нехватке памяти. Обработка этой ошибки прерывает PHP в момент, когда внутренние данные запроса заполнены лишь частично. При очистке интерпретатор принимает такие данные за корректные.
- CVE-2026-109619 — использование памяти после освобождения. Внутреннее состояние запроса сохраняется после того, как PHP освободил память под ним. Следующий запрос в том же воркере обращается к этому состоянию раньше, чем оно сбрасывается.
В обоих случаях злоумышленник подменяет данные, с которыми работает интерпретатор, и через порчу памяти добивается выполнения своего кода с правами веб-воркера.
Уязвимость находится на уровне самого PHP. Безопасность кода конкретного проекта здесь роли не играет — взломать можно даже сайт из одного файла с echo "Hello World". Обновление CMS, фреймворков и плагинов бесполезно. Защититься поможет только установка патча для интерпретатора.
| CVE | Класс ошибки | К чему приводит | Номер БДУ |
|---|---|---|---|
| CVE-2026-109618 | Порча данных при нехватке памяти (OOM): сбой прерывает инициализацию данных запроса, очистка принимает неполные данные за корректные | Удалённое выполнение кода без аутентификации | BDU:2026-17191 |
| CVE-2026-109619 | Use-after-free из-за устаревшего глобального состояния: данные одного запроса переживают освобождение памяти и используются следующим запросом в том же воркере | Удалённое выполнение кода без аутентификации и раскрытие памяти воркера | BDU:2026-17192 |
Обе уязвимости PHP получили 9,2 балла по CVSS 4.0. Для CVE-2026-109619 разработчики PHP дополнительно подтвердили раскрытие памяти. Ошибке, через которую срабатывает уязвимость, не обязательно быть фатальной или попадать в лог, поэтому атака может пройти без следов в журналах.
Кто в зоне риска
Под угрозой — все инсталляции PHP ниже исправленных версий, которые обрабатывают веб-запросы. Официальный бюллетень PHP выделяет PHP-FPM, Apache с mod_php, php-cgi, FrankenPHP и LiteSpeed. Уровень угрозы зависит от режима запуска:
- Apache с
mod_php— самая опасная конфигурация. Для неё уже продемонстрирован рабочий эксплойт. Атака проходит без аутентификации и запускается до старта пользовательского приложения. - PHP-FPM — ситуация сложнее. Если старт запроса срывается, FPM завершает дочерний процесс, что закрывает путь для CVE-2026-109618. Полного эксплойта для FPM пока не показали, хотя по анализу кода уязвимость достижима и после нормального старта. Ошибка CVE-2026-109619 затрагивает FPM, когда Nginx или
mod_proxy_fcgiпередают директивыPHP_VALUEиPHP_ADMIN_VALUE. Вектор атаки черезsession.upload_progressна FPM уже подтверждён.
Уязвимость находится в ядре интерпретатора. Обновлять необходимо все конфигурации без исключений.
| Ветка | Уязвимые версии | Исправлено в |
|---|---|---|
| PHP 8.6 (тестовая) | сборки 8.6.0 до RC4 | 8.6.0 RC4 — не для рабочих серверов |
| PHP 8.5 | 8.5.0–8.5.11 | 8.5.12 |
| PHP 8.4 | 8.4.0–8.4.26 | 8.4.27 |
| PHP 8.3 | 8.3.0–8.3.35 | 8.3.36 |
| PHP 8.2 | 8.2.0–8.2.34 | 8.2.35. Поддержка ветки заканчивается 31 декабря 2026 года |
| PHP 7.4, 8.0, 8.1 (без поддержки) | все версии | Только исходный код для самостоятельной сборки. Готовые пакеты — у дистрибутива Linux или поставщика продлённой поддержки |
| PHP 7.3 и более ранние | все версии | Команда PHP исправлений не выпускала |
Как обновиться и что обязательно перезапустить
Установка пакета обновляет файлы исключительно на диске. Процессы PHP-FPM, Apache и долгоживущие воркеры продолжают выполнять уязвимый код из оперативной памяти до принудительного рестарта. Приоритет — серверы, доступные из интернета.
1. Обновите пакеты PHP
Установите исправленную версию для вашей ветки: 8.5.12, 8.4.27, 8.3.36 или 8.2.35. Команда PHP заранее передала патчи вендорам дистрибутивов. Проверьте обновления в репозитории своего дистрибутива. Сторонние репозитории могут отставать. Исходный код доступен на официальном сайте php.net.
2. Перезапустите процессы
Перезагрузите все службы, исполняющие PHP. Для Apache с mod_php:
systemctl restart apache2 # Debian, Ubuntu
systemctl restart httpd # RHEL и производныеДля PHP-FPM перезапуск Nginx бесполезен. Перезагрузите сам процесс интерпретатора. В Debian и Ubuntu имя службы содержит номер версии:
systemctl restart php8.4-fpm # Debian, Ubuntu
systemctl restart php-fpm # RHEL и производныеПерезапустите и долгоживущие процессы: воркеры приложений и обработчики очередей. Старый код в памяти они держат так же, как FPM.
3. Пересоберите Docker-образы
Укажите новую версию PHP в слое сборки и пересоберите образ. Затем пересоздайте контейнеры с сохранением томов данных. Обычный рестарт контейнера оставляет систему уязвимой.
4. Проверьте результат
Успешная установка пакета подтверждает только обновление файлов на диске. Проверьте версию на работающем сервере: через phpinfo() или заголовок X-Powered-By в HTTP-ответах, если включён expose_php. Файл с phpinfo() после проверки удалите. Если дистрибутив переносит исправления в старую версию, как RHEL и производные, номер версии не изменится. В этом случае сверяйтесь с changelog пакета или бюллетенем вендора.
5. Примите решение по устаревшим веткам
Ветки 8.1 и более ранние команда PHP больше не поддерживает. Из-за критичности уязвимостей она всё же выложила исправления для PHP 7.4, 8.0 и 8.1, но только в исходном коде — PHP придётся собрать самостоятельно. Готовые пакеты ищите у дистрибутива Linux или поставщика продлённой поддержки.
Если обновиться сразу нельзя
Команда PHP предлагает временные меры. Каждая закрывает только часть путей атаки, полную защиту даёт только обновление.
- Против CVE-2026-109618: задайте
memory_limit=-1и ограничьтеpost_max_sizeдо 8M, или до 32M, если нужна загрузка файлов.upload_max_filesizeдержите меньшеpost_max_size. Настройки задавайте так, чтобы приложение не могло их переопределить, например черезphp_admin_valueв пуле FPM или конфигурации Apache. ОграниченияRLIMIT_ASиRLIMIT_DATAвместо этого не используйте: они сами вызывают уязвимый сбой. - Против CVE-2026-109619: задайте
session.upload_progress.enabled=0вphp.ini, пуле FPM или конфигурации веб-сервера. На PHP 8.5 добавьтеfatal_error_backtraces=0.
После изменений перезапустите все воркеры.
Уточнение по CVE-2026-115560
23 октября команда PHP выпустила дополнение об узкой уязвимости CVE-2026-115560 в механизме session.upload_progress. Она срабатывает только при строгом совпадении трёх условий:
- В конфигурации параметр
session.serialize_handlerизначально установлен в значениеphp_binaryилиphp_serialize. - Приложение меняет этот обработчик на
phpв рантайме черезini_set()строго до вызоваsession_start(). - Параметр
session.upload_progress.enabledостаётся включённым.
Подобная архитектура встречается редко. Команда PHP выпустит подробный отчёт и закроет баг в ближайшем плановом релизе. Дополнительных деталей о CVE-2026-115560 пока не сообщается.
Если ваш код меняет обработчик сессий на лету, отключите session.upload_progress.enabled. Приложениям со статичными настройками CVE-2026-115560 не угрожает. Если функция не нужна, параметр всё равно стоит выключить: команда PHP советует это и после обновления, как частичную защиту от CVE-2026-109619.
Отключайте параметр в php.ini, пуле FPM или конфигурации веб-сервера. Через ini_set() и .user.ini настройка не сработает. После изменения перезапустите все воркеры.
В БДУ ФСТЭК эта уязвимость пока отсутствует.
Какие секреты ротировать после PHP2Shell и в каком порядке
Обе уязвимости дают злоумышленнику удалённое выполнение кода, а CVE-2026-109619 ещё и раскрывает память процесса. Считайте скомпрометированными все секреты, к которым имел доступ интерпретатор PHP.
Начинайте ротацию только после установки патчей или пересборки образов. Действуйте по приоритетам. GitGuardian в разборе PHP2Shell советует составить карту секретов: что защищает каждый из них и к чему приведёт утечка. Порядок ротации задаёт эта карта. Если карты нет, двигайтесь от самого критичного к уровню приложения:
Круг 1. Критичные данные и финансы
- Базы данных — смените пароли от внутренних и внешних БД, указанные в конфигурационных файлах (например,
.envилиconfig.php). - Платёжные шлюзы — отзовите ключи от платёжных систем для блокировки прямых финансовых потерь.
Круг 2. Инфраструктура и деплой
- Облачные провайдеры — обновите ключи управления доступом (IAM), сервисные аккаунты облачных платформ и секреты кластеров.
- Доступ к серверу — замените SSH-ключи, токены доступа к репозиториям кода и ключи деплоя.
- Резервные копии — смените доступы к внешним объектным хранилищам, куда веб-приложение отправляет бэкапы.
Круг 3. Сторонние интеграции
- API-ключи — отзовите и перевыпустите токены для внешних SaaS-продуктов, CRM и сервисов рассылок.
- OAuth-секреты — обновите ключи для социальных авторизаций и федеративных интеграций.
Круг 4. Уровень приложения и сессии
- Ключи шифрования — замените
APP_KEYи соли фреймворка, защищающие куки, пейлоады и локальные токены. - Сессии пользователей — сбросьте активные сессии администраторов и клиентов. Это заставит их авторизоваться заново и инвалидирует украденные сессионные куки.
Аудит логов после ротации
Смена ключей закрывает доступ, но прошлую активность нужно проверить. Ищите:
- в журналах доступа веб-сервера — запросы с подозрительных IP-адресов и необычно большие multipart-запросы;
- на сервере — новые файлы в корне сайта, неожиданные дочерние процессы PHP и исходящие соединения от веб-сервера;
- в системах, к которым вели скомпрометированные секреты, — действия со старыми учётными данными до ротации.
| Что ротируем | Почему в этом круге |
|---|---|
| БД и платёжные шлюзы | Прямой доступ к данным и финансам. Самый высокий риск. |
| Облака, SSH, бэкапы | Доступ к инфраструктуре и исходному коду в обход приложения. |
| API-ключи и OAuth | Доступ к внешним системам и клиентским данным в сторонних сервисах. |
| APP_KEY и сессии | Защита локальных данных приложения и обрыв украденных сессий. |
Часто задаваемые вопросы
Какие версии PHP уязвимы и до каких нужно обновиться?
Уязвимы все версии PHP ниже 8.2.35, 8.3.36, 8.4.27 и 8.5.12, а также тестовые сборки 8.6.0 до RC4. Для веток 7.4, 8.0 и 8.1, которые больше не поддерживаются, команда PHP выложила исправления только в исходном коде. Для PHP 7.3 и более ранних версий исправлений нет.
Злоумышленнику нужна учётная запись на сайте?
Нет. Обе уязвимости эксплуатируются удалённо и без аутентификации — специально сформированный POST-запрос может запустить атаку на уровне интерпретатора ещё до того, как отработает код приложения, особенно в конфигурации mod_php.
Достаточно обновить WordPress, Битрикс или другую CMS?
Нет. Уязвим сам интерпретатор PHP. Код CMS и приложения здесь ни при чём. Обновлять нужно PHP на сервере или в контейнере, после чего обязательно перезапустить PHP-FPM, Apache и долгоживущие воркеры — иначе процессы продолжат выполнять старый код.
WAF или CDN защитят от атаки?
Частично и временно. WAF и белые списки снижают поверхность атаки, но не устраняют уязвимость в интерпретаторе и бесполезны, если origin-сервер доступен в обход фильтра. Это компенсирующая мера на время обновления. Патч она не заменяет.
Пароли и ключи после обновления PHP нужно менять?
Если сервер был доступен из интернета на уязвимой версии — да. Патч закрывает путь для новых атак, но не отменяет то, что могло утечь раньше. Ротацию проводите по приоритету: сначала базы данных и платёжные шлюзы, затем облака, SSH и бэкапы, потом внешние интеграции, в последнюю очередь — ключи приложения и сессии пользователей.
Что делать с PHP 7.4, 8.0 и 8.1, которые больше не поддерживаются?
Команда PHP выпустила для этих веток минимальные патчи только в виде исходного кода — без готовых пакетов. Уточните у поставщика дистрибутива наличие сборки или собирайте из исходников сами. Плановое решение — переход на ветку 8.3 и выше: поддержка 8.2 заканчивается 31 декабря 2026 года.