Коротко
Затронуты ли вы?
Если у вас используется PHP, обслуживающий веб-запросы (PHP-FPM, Apache с mod_php, php-cgi, FrankenPHP или LiteSpeed), и его версия старше 8.2.35, 8.3.36, 8.4.27 или 8.5.12, исходите из того, что вы затронуты. Это относится и к приложениям на основе PHP, таким как WordPress, Drupal, Magento и Laravel.
Затронут ли TR7?
Нет. В устройствах TR7 нет компонента PHP, обрабатывающего HTTP-запросы, поэтому эти уязвимости не затрагивают продукты TR7. Подробности в разделе Затронут ли TR7?.
Что делать сейчас
- Обновите PHP на серверах веб-приложений и перезапустите все рабочие процессы PHP.
- Если вы не можете выполнить обновление сегодня, примените на этих серверах приведённые ниже временные настройки PHP.
- До завершения обновления примените основные настройки защиты в TR7 WAF-WAAP; первая из них состоит в переводе ваших PHP-приложений в режим Blocking mode.
Основные сведения
| Идентификатор бюллетеня | TR7-SA-2026-001 |
|---|---|
| Название | PHP2Shell |
| CVE | CVE-2026-109618 (удалённое выполнение кода через повреждение памяти при её исчерпании), CVE-2026-109619 (удалённое выполнение кода через устаревшее глобальное состояние) |
| Официальные бюллетени | Объявление PHP Security Team GHSA-w8hw-w9fx-j79w (CVE-2026-109618) GHSA-6wmf-4rv5-p3rp (CVE-2026-109619) |
| Критичность | CVSS v4.0 9.2, критическая (PHP Security Team) |
| Требуется аутентификация | Нет |
| Исправленные версии | PHP 8.2.35, 8.3.36, 8.4.27, 8.5.12 |
| Старые ветки | PHP Security Team опубликовала бэкпорты исправлений в исходном коде для PHP 7.4, 8.0 и 8.1. Дистрибутивы Linux предоставляют собственные исправленные пакеты. |
| Эксплуатация | Поступают сообщения о попытках эксплуатации. По состоянию на 22 октября 2026 г. успешная компрометация не была публично подтверждена. |
| CISA KEV | Отсутствует в каталоге по состоянию на 21 октября 2026 г. |
Что произошло
- 20 октября 2026 г. Подробности уязвимостей стали публично известны до скоординированного выпуска исправлений.
- 21 октября 2026 г. Проект PHP выпустил исправленные версии и опубликовал бюллетени GHSA-w8hw-w9fx-j79w и GHSA-6wmf-4rv5-p3rp.
- 21-22 октября 2026 г. Поступили сообщения о попытках эксплуатации, появился общедоступный PoC-код.
Как работает атака
Обе уязвимости находятся в самом PHP, а не в коде приложения. Атака происходит, пока PHP ещё читает входящий запрос, до выполнения хотя бы одной строки вашего приложения. Обновление WordPress, плагина или собственного кода проблему не устраняет.
- CVE-2026-109618 эксплуатирует момент, когда у PHP заканчивается память. Злоумышленники отправляют запросы, которые заставляют PHP расходовать много памяти при разборе данных форм и загружаемых файлов, чтобы PHP остановился в небезопасном состоянии.
- CVE-2026-109619 оставляет в рабочем процессе PHP устаревшие данные после одного запроса, и второй запрос к тому же рабочему процессу их использует. Один из задокументированных путей использует функцию PHP session upload progress, которая включена по умолчанию и активируется полем формы с именем
PHP_SESSION_UPLOAD_PROGRESS.
Поскольку запросы, через которые проводятся эти атаки, в основном являются запросами multipart/form-data (загрузка файлов), запросами с большим телом и повторяющимися запросами, межсетевой экран веб-приложений (WAF) может видеть и ограничивать многие из них. Того, что происходит в памяти PHP, он видеть не может.
Затронут ли TR7?
Эти уязвимости находятся в собственном уровне обработки запросов PHP и затрагивают серверы приложений, на которых работает PHP. В устройствах TR7 нет компонента PHP, обрабатывающего HTTP-запросы, поэтому эти уязвимости не затрагивают продукты TR7.
Что нужно сделать сейчас
Работы выполняются в двух местах: на ваших собственных серверах веб-приложений, где работает PHP, и в TR7 WAF-WAAP. Шаги в каждом разделе пронумерованы отдельно.
На ваших серверах
Шаг 1: Обновите PHP на серверах веб-приложений (единственное полное исправление)
- Обновите PHP на серверах, где работает ваше веб-приложение, до версии 8.2.35, 8.3.36, 8.4.27 или 8.5.12 либо установите исправленный пакет вашего дистрибутива Linux. Пакеты дистрибутивов часто сохраняют старый номер версии; проверьте наличие номеров CVE в журнале изменений пакета.
- Перезапустите все рабочие процессы PHP (пулы PHP-FPM, Apache, LiteSpeed, долгоживущие рабочие процессы). Запущенные процессы продолжают использовать старый код до перезапуска.
- Пересоберите образы контейнеров, содержащие собственный PHP. Обновление хоста не обновляет PHP внутри образа.
- PHP 8.1 и более ранние версии больше не получают обновлений от проекта PHP. Запланируйте переход на поддерживаемую ветку.
Шаг 2: Временные настройки PHP на серверах веб-приложений (если вы не можете выполнить обновление сегодня)
Эти настройки задаются в конфигурации PHP на сервере, где работает ваше веб-приложение (php.ini или настройки пула PHP-FPM). Эти меры перечислены PHP Security Team. Они снижают подверженность определённым путям атаки, но не делают установку безопасной.
| Параметр | Назначение |
|---|---|
session.upload_progress.enabled = 0 | Устраняет путь атаки CVE-2026-109619 через session upload progress. Перезапустите все рабочие процессы. PHP Security Team рекомендует оставить параметр отключённым и после установки исправлений, если эта функция вам не нужна. |
fatal_error_backtraces = 0 (PHP 8.5) | Устраняет путь атаки через трассировку стека при фатальной ошибке |
post_max_size = 8M (без загрузок) или 32M (с загрузками), при меньшем значении upload_max_filesize | Уменьшает объём памяти, который злоумышленник может заставить PHP использовать |
memory_limit = -1, заданный через php_admin_value | Устраняет управляемый сбой при достижении лимита памяти. При этом один запрос может занять всю память сервера; используйте ограничения контейнера или cgroup, но никогда RLIMIT_AS или RLIMIT_DATA |
В TR7 WAF-WAAP
Если вы можете обновить PHP сразу, это и есть настоящее исправление. Если не можете, то до завершения обновления вы можете защитить свои PHP-приложения от этих атак с помощью настроек безопасности, уже доступных в TR7 WAF-WAAP, без какого-либо обновления TR7. Три настройки из шага 1 составляют основную защиту; дополнительные меры из шага 2 ещё больше сужают поверхность атаки, поэтому выберите те, которые подходят вашему приложению. Применяйте настройки для каждого vService отдельно и сначала опробуйте их на непродуктивном vService.
Шаг 1: Основная защита
1.1 Переведите WAF в режим Blocking mode
WAF, который только ведёт мониторинг, не останавливает атаку. При первом включении WAF запускается в режиме Learning mode; Monitor mode только ведёт запись. Для каждого vService с PHP откройте экран WAF Mode и убедитесь, что WAF находится в режиме Blocking mode.
Внимание: Перед переключением проверьте исключения сигнатур, полученные в режиме обучения для каждого поля. Если число исключений для поля превышает значение Max. owasp exclusions, проверка сигнатур для этого поля отключается.
1.2 Добавьте два пользовательских правила
На экране Signature & Rule Library (WAF → Signature & Rule Library → Add) добавьте два приведённых ниже правила по отдельности. Запустите оба в состоянии Monitor и переведите их в состояние Enabled после просмотра Event Logs. Правила применяются ко всем vService, защищённым WAF.
Правило 1: поле session upload progress
- Pattern (Regex):
PHP_SESSION_UPLOAD_PROGRESS - Inspection Scopes: Form и Raw
- Score: Very High
Перехватывает поле формы, которое активирует путь атаки CVE-2026-109619 через session upload progress. Для приложений, легитимно использующих эту функцию, исключите только те пути загрузки, которым она нужна.
Правило 2: поле формы PHPSESSID
- Pattern (Regex):
^PHPSESSID$ - Inspection Scopes: Form
- Score: Very High
Перехватывает запросы, передающие идентификатор сеанса в поле формы с именем PHPSESSID вместо cookie; некоторые пути атаки используют этот вариант, а в легитимном трафике он встречается редко. Если ваше приложение использует другое имя сеанса (session.name), укажите это имя.
Чтобы правила работали: Правила проверяются в рамках проверок Form и RAW того типа страницы, которому соответствует запрос. В типе страницы без проверки Form тела форм и загрузок файлов не сканируются.
- Оставьте OWASP check включённым в правиле Any Paths и в типах страниц, имеющих собственную проверку Form или RAW.
- Добавьте собственную проверку Form и RAW в каждый тип страницы glob с помощью кнопок Add common rule for Form и Add common rule for Raw; не полагайтесь на унаследованные настройки.
1.3 Блокируйте большие и непроверяемые тела запросов
На экране WAF Rules задайте два параметра в проверке RAW:
- Установите для Raw Body Size максимальный размер тела, необходимый для данного пути (в байтах; например, 8388608 = 8 МБ на путях без загрузок, 33554432 = 32 МБ на путях загрузки). Диапазон по умолчанию допускает тела размером до 256 МБ.
- Переключите параметр неразобранного тела с Allow unparsed body на Block unparsed body. В противном случае тело, которое не помещается в буфер проверки, передаётся в Backend Service без какой-либо проверки содержимого.
Где? WAF проверяет запрос только с настройками того типа страницы, которому соответствует его путь. Задайте эти два параметра в правиле Any Paths, в каждом типе страницы, у которого в столбце Check Fields отображается Raw, и в каждом типе страницы glob; если у типа страницы glob нет проверки RAW, сначала добавьте её с помощью Add common rule for Raw.
Внимание: Raw Body Size действует, когда на экране Checks включён параметр Structure Checks. Сначала протестируйте легитимные загрузки больших файлов. Тела, отправленные без объявленной длины, этим ограничением не измеряются; на путях вне путей загрузки их можно заблокировать согласно п. 2.1.
Шаг 2: Дополнительные меры
Эти меры дополняют основную защиту; выберите те, которые подходят вашему приложению.
2.1 Заблокируйте загрузку файлов там, где она не нужна
Запросы атаки в основном являются запросами multipart/form-data (загрузка файлов). Если файлы принимают лишь несколько путей вашего приложения, заблокируйте multipart-запросы ко всем остальным путям с помощью правила балансировщика нагрузки. Правило состоит из двух условий и действия Block. Все экраны доступны из меню Configuration Menu, которое открывается логотипом TR7 в левом нижнем углу.
A. Создайте условия (Load Balancer → Conditions → Add)
- Условие multipart-запроса: Criteria = HTTP header, метод сопоставления Includes, Header Name = Request →
Content-Type, Query =multipart/form-data, Case Insensitive включено. Введите Condition Name, напримерmultipart-request, и сохраните кнопкой Add. - Условие путей загрузки: Criteria = Path, метод сопоставления Regex, а в поле Query укажите пути, принимающие файлы (например,
^/(upload|media/upload)). Введите Condition Name, напримерupload-paths, и сохраните кнопкой Add.
B. Создайте действие Block (Load Balancer → Actions → Add)
- Введите Action Name (например,
block-multipart), Action Type = Block, Execution Level = On Request, Deny Type = Standard, Status Code = 403. - В поле Conditions выберите
multipart-requestи!upload-pathsв одной группе условий (по умолчанию and). Каждое условие отображается в списке дважды: само условие и его отрицание (NOT), начинающееся с!;!upload-pathsозначает «не является одним из путей загрузки». - Включите Hit Counter, чтобы подсчитывать заблокированные запросы, и сохраните кнопкой Add.
C. Добавьте действие в vService
- На экране Load Balancer → Load Balancer vService List выберите vService и нажмите Edit, выберите действие в поле Actions в разделе Details и нажмите Save.
D. Также заблокируйте тела, отправленные без объявленной длины
- Создайте ещё одно условие HTTP header: метод сопоставления Is present, Header Name = Request →
Content-Length, Condition Name, напримерhas-length. - Создайте второе действие Block (On Request, Standard, 403). В поле Conditions выберите предопределённое условие If HTTP method is POST,
!has-lengthи!upload-pathsв одной группе условий и добавьте действие в поле Actions vService. Условие POST обязательно; без него будут блокироваться и GET-запросы без тела.
Ограничение размера из п. 1.3 не видит реальный размер тела, отправленного без объявленной длины. Это правило охватывает как потоковые (chunked) загрузки HTTP/1.1, так и тела HTTP/2 без объявленной длины на путях вне путей загрузки. Под это правило также попадают POST-запросы без тела и без заголовка Content-Length; сначала опробуйте его на непродуктивном vService.
Проверка: Multipart-запрос (curl -s -o /dev/null -w '%{http_code}\n' -F 'a=b' https://www.example.com/), chunked-запрос HTTP/1.1 (curl -s -o /dev/null -w '%{http_code}\n' --http1.1 -H 'Transfer-Encoding: chunked' -d 'a=b' https://www.example.com/) и запрос HTTP/2 без объявленной длины (printf 'a=b' | curl -s -o /dev/null -w '%{http_code}\n' --http2 -X POST -T - https://www.example.com/) к пути вне путей загрузки должны получить ответ 403, а запросы к вашим путям загрузки должны проходить. Для теста HTTP/1.1 параметр --http1.1 обязателен: curl по умолчанию использует HTTP/2 через https и не отправляет Transfer-Encoding по HTTP/2. Счётчик отображается на вкладке Action Hits панели мониторинга vService.
Внимание: Действие Block без выбранного условия применяется ко всем запросам к vService. Перечислите все пути загрузки полностью и сначала опробуйте правило на непродуктивном vService.
2.2 Ограничьте число POST-запросов от одного клиента
Это правило не остановит целенаправленную атаку: эксплойту может хватить нескольких запросов. Однако оно повышает затраты для автоматизированных инструментов, перебирающих множество целей. Правило подсчитывает POST-запросы с каждого IP-адреса клиента и блокирует POST-запросы клиента, превысившего порог, с кодом 429. Блокировка снимается автоматически, когда счётчик опускается ниже порога.
A. Создайте действие-счётчик (Load Balancer → Actions → Add)
- Введите Action Name, Action Type = Advanced Traffic Inspection, Fields to Track = Client IP address, Traffic Tag = например
post-rate(3-20 символов; буквы, цифры,-,_), Tracking Period = 1 минута. - В поле Conditions выберите предопределённое условие If HTTP method is POST и сохраните кнопкой Add. Тогда учитываются только POST-запросы.
B. Создайте пороговое условие (Load Balancer → Conditions → Add)
- Criteria = Tracking Condition, Tracked Table =
post-rate, Tracking Criteria = HTTP requests, а порог задайте с помощью Tracking Operator (например,> 100). Сохраните кнопкой Add.
C. Создайте действие Block (Load Balancer → Actions → Add)
- Action Type = Block, Execution Level = On Request, Deny Type = Standard, Status Code = 429.
- В поле Conditions выберите пороговое условие из шага 3 и If HTTP method is POST в одной группе условий (по умолчанию and). Без условия POST будут блокироваться и GET-запросы клиента, превысившего порог. Сохраните кнопкой Add.
D. Добавьте действия в vService
- В форме Edit vService в разделе Details → Actions выберите действие-счётчик первым, а действие Block вторым и нажмите Save. Действия выполняются в порядке списка.
Проверка: На вкладке Logs & Tracking vService выберите в списке Logs Type таблицу отслеживания действия-счётчика; отображаются счётчики POST-запросов по каждому клиенту. Порог задавайте исходя из нормального трафика вашего приложения: наблюдайте в таблице число POST-запросов в минуту от легитимных клиентов (например, систем, использующих API, или организаций за общим исходящим IP-адресом) и установите порог выше этих значений.
2.3 Переведите защиту L7 DDoS в режим Active
Если защита Bot/DDoS входит в вашу лицензию, функция Source IP Request Protection в разделе L7 DDoS Protection ограничивает общее число запросов, которые один исходный адрес может отправить за определённый период. В отличие от п. 2.2, она учитывает все запросы и не требует дополнительного правила.
- В форме Edit vService выберите L7 DDoS & Threat Protection в разделе Details и нажмите Save (если функция не включена). После включения защиты L7 DDoS Protection запускается в режиме Monitor; в этом режиме нарушения лимитов только регистрируются как события.
- В разделе Left Monitor Panel → Bot/DDoS Protected vServices → vService → Bot/DDoS Management нажмите ссылку Edit на карточке L7 DDoS Protection.
- Установите DDoS Protection = Active и сохраните кнопкой Edit.
- На карточке нажмите значок карандаша в блоке Source IP Request Protection. Задайте Time Window (по умолчанию 10 seconds), Request Limit (по умолчанию 1000) и Limit Action (по умолчанию Show Captcha; также можно выбрать Block) в соответствии с трафиком вашего приложения и сохраните кнопкой Edit.
Внимание: Перед переключением в Active некоторое время наблюдайте за событиями в режиме Monitor. Повторите такое же наблюдение при снижении Request Limit.
Проверьте, не были ли вы целью атаки
См. раздел Обнаружение и мониторинг. Сообщения о попытках эксплуатации поступали ещё до публичного раскрытия информации, поэтому проверьте журналы начиная с 17 октября 2026 г.
Что WAF может и чего не может
| WAF может | WAF не может |
|---|---|
| Блокировать известные формы запросов, например поле session upload progress | Исправить уязвимый код внутри PHP |
| Ограничивать размер тела запроса, пути загрузки и частоту запросов | Измерять потребление памяти внутри процесса PHP |
| Блокировать загрузки на путях, где они не нужны | Видеть запросы, которые достигают вашего сервера, минуя его |
| Регистрировать заблокированные запросы и запросы, ограниченные по частоте | Отменить действие кода, который уже выполнился на сервере |
Правила WAF дают выиграть время для обновления; долговременным исправлением является обновление PHP. Чтобы эти меры защиты работали, весь трафик к вашим PHP-приложениям должен проходить через TR7 WAF-WAAP.
Обнаружение и мониторинг
В TR7
- На экране Event Logs каждого vService, защищённого WAF, отфильтруйте записи по своим пользовательским правилам и посмотрите на совпавшее поле и балл.
- На том же экране просмотрите запросы, заблокированные правилами размера тела и неразобранного тела.
- Если вы применили дополнительные меры, отслеживайте счётчики правил балансировщика нагрузки на вкладке Action Hits панели мониторинга vService, а клиентов, достигших лимита частоты POST-запросов, в таблице отслеживания на вкладке Logs & Tracking.
На ваших серверах
- Ищите в журналах ошибок PHP такие ошибки, как
Allowed memory size ... exhausted, сбои рабочих процессов и повторяющиеся ответы HTTP 500; обращайте внимание на те, что возникают сразу после крупных запросовmultipart/form-data. - Проверяйте ответы на наличие необычно больших или некорректных cookie
PHPSESSID. - Проверяйте корневые каталоги веб-сервера на наличие новых или изменённых файлов, а также ищите неожиданные процессы, запущенные от имени пользователя веб-сервера, новые задания cron и неожиданные исходящие соединения.
Часто задаваемые вопросы
Нет. В устройствах TR7 нет компонента PHP, обрабатывающего HTTP-запросы, поэтому эти уязвимости не затрагивают продукты TR7. См. раздел «Затронут ли TR7?».
Ни один WAF не может обеспечить полную защиту от этих уязвимостей. TR7 WAF-WAAP сокращает поверхность атаки и блокирует известные пути атаки; единственное полное исправление состоит в обновлении PHP.
Используйте против PHP2Shell два пользовательских правила из п. 1.2 раздела о TR7 WAF-WAAP; они сразу применяются ко всем vService, защищённым WAF.
Нет. Уязвимости находятся в среде выполнения PHP. Обновите сам PHP или попросите об этом своего хостинг-провайдера.
Могут. Ограничения размера тела запроса, блокировка загрузок и пользовательские правила могут затронуть легитимные загрузки и формы. Для правил WAF начните в режиме Monitor mode, просмотрите Event Logs, затем переключитесь в Blocking mode. Правила балансировщика нагрузки (2.1, 2.2) сначала опробуйте на непродуктивном vService.
История обновлений
- 23 октября 2026 г. Первоначальная публикация.
Источники
- Объявление PHP Security Team: php.net/archive/2026.php
- GHSA-w8hw-w9fx-j79w (CVE-2026-109618): github.com/php/php-src
- GHSA-6wmf-4rv5-p3rp (CVE-2026-109619): github.com/php/php-src
- CVE-2026-109618: cve.org
- CVE-2026-109619: cve.org
- CISA Known Exploited Vulnerabilities Catalog: cisa.gov
- Документация TR7: docs.tr7.com
Нужна помощь с применением этих настроек?
Команда поддержки TR7 может проверить конфигурацию вашего WAF и помочь развернуть эти меры защиты. Обратитесь к своему представителю TR7 или в команду поддержки TR7 по адресу support@tr7.com.
Подробнее о TR7 WAF-WAAP Связаться с TR7 Экстренная поддержка