К списку статей
22 October 2026 2 мин чтения

Анализ критических уязвимостей PHP Core: CVE-2026-109618 и CVE-2026-109619 (php2shell)

Глубокий технический разбор критических RCE-уязвимостей ядра PHP CVE-2026-109618 и CVE-2026-109619 (php2shell, CVSS 9.2). Механика повреждения памяти Zend Engine, разрыв longjmp, висячие указатели и пошаговый протокол защиты инфраструктуры.

Анализ критических уязвимостей PHP Core: CVE-2026-109618 и CVE-2026-109619 (php2shell)

Содержание

В октябре 2026 года индустрия веб-разработки и информационной безопасности столкнулась с беспрецедентной угрозой. В ядре интерпретатора PHP (Zend Engine) были обнаружены две критические RCE-уязвимости: CVE-2026-109618 и CVE-2026-109619, получившие общее название «php2shell». Обеим проблемам присвоен наивысший критический рейтинг CVSS v4.0: 9.2. Уязвимости позволяют неавторизованному удаленному атакующему выполнять произвольный системный код через обычные HTTP-запросы к веб-серверу. Ниже представлен подробный технический анализ механизмов повреждения памяти, векторов атак, исходного кода C-патчей и регламента защиты инфраструктуры.

1. Зона поражения и масштаб проблемы

Интерпретатор PHP обслуживает свыше 75% веб-сайтов мирового интернета — от высоконагруженных порталов на Laravel до сотен миллионов сайтов на WordPress и 1С-Битрикс. Опасность php2shell в том, что дефект заложен не в пользовательском коде или плагинах, а в фундаментальной низкоуровневой логике ядра: механизмах выделения памяти и обработке аварийных прерываний.

Для атаки злоумышленнику не требуются логин, пароль или права доступа. Запрос отправляется на любой общедоступный URL, обрабатываемый PHP-FPM или Apache. Под ударом находятся все современные ветки:

  • 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);
  • Устаревшие ветки (EOL): PHP 8.1, 8.0, 7.4 и ниже, где официальные обновления не выпускаются.

2. Анализ CVE-2026-109618: Аварийный OOM и разрыв целостности longjmp

Первая уязвимость кроется в подсистеме управления памятью Zend Memory Manager (Zend MM). Для защиты сервера от перегрузки PHP контролирует лимит памяти memory_limit. Если очередной запрос на выделение памяти превышает этот порог, ядро прерывает исполнение через вызов zend_error(), использующий стандартную C-функцию longjmp().

Вызов longjmp() мгновенно восстанавливает контекст процессора из буфера jmp_buf, перескакивая через стандартные деструкторы и циклы освобождения локальных переменных. В уязвимых версиях PHP ряд внутренних модулей (включая парсеры сложных структур и десериализаторы) выставлял статус готовности объекта до того, как все дочерние буферы были физически выделены в куче.

Когда вызов longjmp() прерывал исполнение ровно в момент аллокации вложенных структур, ядро оставалось с полуинициализированными объектами. При завершении HTTP-запроса сборщик мусора Zend Engine пытался очистить эти дефектные структуры, принимал мусорные байты за валидные указатели на функции и передавал на них управление. Атакующий, предварительно распыливший полезную нагрузку в куче (heap spray), добивается устойчивого исполнения своего шеллкода.

3. Анализ CVE-2026-109619: Висячие глобальные указатели (Stale Global State)

Вторая уязвимость представляет собой классический дефект Use-After-Free (UAF), проявляющийся в долгоживущих процессах PHP-FPM, обслуживающих тысячи последовательных HTTP-сессий.

Внутри Zend Engine существуют глобальные структуры ядра — Executor Globals (EG) и Compiler Globals (CG). Во время обработки запроса определенные глобальные поля временно связываются с локальной памятью конкретного запроса. По завершении запроса память очищается функцией zend_mm_shutdown().

При фатальных ошибках, прерванных longjmp(), цепочка сброса глобальных указателей давала сбой: память запроса освобождалась, но глобальные поля в EG продолжали ссылаться на освобожденные адреса. При поступлении следующего запроса в этот же рабочий процесс FPM ядро обращалось к уже недействительной памяти. Злоумышленник посылает первый запрос для отравления воркера, а вторым запросом занимает освобожденную область своими инструкциями, получая стабильный RCE.

4. Как уязвимость была исправлена в исходном коде PHP

Команда безопасности PHP применила фундаментальные архитектурные правки в Zend Engine. Во-первых, был внедрен принцип транзакционности аллокаций: структуры помечаются валидными только после успешного завершения всех дочерних вызовов emalloc(). Если происходит аварийный выброс по OOM, незавершенные блоки гарантированно изолируются и игнорируются сборщиком мусора.

Во-вторых, процедура zend_bailout() теперь выполняет обязательную принудительную очистку всех указателей в EG, обнуляя их в NULL до возврата управления воркеру. Для многопоточных окружений и FPM добавлен флаг инвалидации воркера: при возникновении фатального сбоя по лимиту памяти воркер помечается как «грязный» и плавно утилизируется, уступая место чистому процессу.

5. Векторы удаленной эксплуатации в боевых условиях

Для реализации атаки злоумышленникам не нужны уязвимости в коде сайта. Эксплуатация производится через штатные механизмы:

  • REST API и JSON-эндпоинты: Отправка запросов с глубокой вложенностью массивов (до 50 000 уровней), вызывающая исчерпание памяти в строго рассчитанный момент аллокации.
  • Multipart/form-data: Загрузка данных с тысячами фиктивных параметров, вызывающая фрагментацию пула памяти.
  • Composer Autoloader: Вызов длинных несуществующих пространств имен, перегружающих стек резолвинга.

В результате атакующий получает доступ к командной оболочке от имени www-data или nginx, что позволяет прочитать файлы .env, скомпрометировать базу данных и внедрить скрытые WebShell-закладки.

6. Практический регламент устранения уязвимости

Для надежного устранения php2shell системным администраторам и DevOps-инженерам необходимо выполнить следующий протокол:

Шаг 1: Обновление интерпретатора PHP

На серверах под управлением Debian/Ubuntu выполните обновление рантайма:

apt update
apt install --only-upgrade php8.3-fpm php8.3-cli php8.3-common
php -v
systemctl reload php8.3-fpm

Для дистрибутивов RHEL, AlmaLinux и Rocky Linux:

dnf upgrade php-fpm php-cli php-common
systemctl reload php-fpm

Шаг 2: Пересборка Docker-образов

При использовании контейнеризации обновите базовые образы и пересоберите сервисы без использования кэша слоев:

docker pull php:8.3-fpm-alpine
docker compose build --no-cache app
docker compose up -d --force-recreate app

Шаг 3: Настройка WAF и компенсационные меры

До завершения обновления пакетов включите фильтрацию аномальных запросов на уровне обратного прокси Nginx или Cloudflare WAF:

  • Ограничьте размер тела запроса: client_max_body_size 16M;
  • Ограничьте вложенность в php.ini: max_input_nesting_level = 64 и max_input_vars = 1000;
  • Отключите опасные функции: disable_functions = exec,passthru,shell_exec,system,proc_open,popen.

7. Форензика и поиск скрытых закладок

Если сервер был доступен из интернета в период публикации эксплойта, необходимо проверить его на следы вторжения:

  1. Проверьте измененные файлы за последние дни: find /var/www/ -type f -name "*.php" -mtime -3 -ls;
  2. Выполните поиск сигнатур веб-шеллов: grep -rnEI "(assert|passthru|shell_exec|base64_decode)" /var/www/;
  3. Проверьте планировщик задач: crontab -l и директории /etc/cron*;
  4. Проверьте подозрительные сетевые сокеты: ss -tulpn на наличие внешних обратных шеллов.

8. Выводы и профессиональная помощь

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

Если вам требуется срочная помощь в аудите, безопасном патчинге без простоя и поиске скрытых угроз, обратитесь к специалистам MKUP: воспользуйтесь нашей услугой Экстренное устранение CVE-2026-109618 и CVE-2026-109619. Мы обеспечим круглосуточную защиту вашей инфраструктуры и гарантируем бесперебойную работу проектов.

Поделиться: