Две ошибки в ядре PHP, получившие от исследователей название php2shell, подтверждены как пригодные для выполнения кода без аутентификации. Специалисты воспроизвели их в изолированной среде и получили выполнение команд от имени пользователя веб-сервера. Сведений о применении этих ошибок в реальных атаках нет, ни одного такого случая не установлено.
Описание
Ошибка 109619 связана с устаревшим состоянием: данные запроса переживают область памяти, на которую ссылаются. Следующий запрос на том же рабочем процессе обращается к освобождённой ссылке. Вход в неё подтверждён через механизм отображения прогресса загрузки сессии, откуда и взялось название php2shell. Ошибка 109618 возникает при нехватке памяти в середине обработки запроса: очистка принимает недостроенные данные за корректные.
Обе ошибки получили номера CVE-2026-109618 и CVE-2026-109619 и оценку CVSS v4.0 9.2. Исправления вышли 21 октября в версиях 8.5.12, 8.4.27, 8.3.36 и 8.2.35. В перечне затронутых компонентов первым назван mod_php, рядом с ним php-fpm, php-cgi, FrankenPHP и LiteSpeed. Сборки для Windows исправлены тем же выпуском, поэтому установки PHP на IIS, включая рабочий процесс php-cgi.exe, тоже были уязвимы.
Воспроизведение шло в изолированной среде: контейнер с PHP 8.4.26 и Apache под mod_php в сети Docker без выхода наружу и датчик на хосте для сбора данных о событиях. Использованный эксплойт (вредоносный код, эксплуатирующий уязвимость) несёт собственную утечку информации: PHP возвращает в ответе указатели из данных сессии, по ним вычисляются рабочие адреса, после чего исполнение перенаправляется во внутренний системный обработчик. Без утечки попытка заканчивается падением рабочего процесса, с ней доходит до запуска команды. Первая же команда вернула вывод утилиты id с идентификаторами пользователя www-data; по данным BHIS ActiveSOC, это подтверждает выполнение кода без аутентификации. Один из публичных наборов, выдававших себя за рабочий, содержал сервер подготовки, открывавший обратное подключение к автору и отправлявший ему вывод с целевой машины.
На успешном срабатывании повреждение памяти остаётся внутри рабочего процесса, и видимым оказывается только запуск команды: веб-процесс порождает оболочку sh с ключом -c, а та запускает утилиту. Команда читается со строки оболочки, утилита приходится веб-процессу внуком, и ту же форму имеет запуск через веб-оболочку или обычное внедрение команд. Сам запрос эксплуатации датчику на хосте не виден: крупный составной запрос с множеством полей и признаком прогресса загрузки попадает в область прокси и межсетевого экрана уровня приложений. Неудачная попытка проявляется иначе - падением и перезапуском рабочего процесса; Apache фиксировал сигналы Abort (6) и Segmentation fault (11). На Windows ожидается появление WerFault.exe и запись Application Error с кодом события 1000, хотя эту часть авторы эксплуатацией не проверяли; падения имеют много безобидных причин и в одиночку дают ложные срабатывания.
На Linux system() и exec() в PHP передают команду оболочке, поэтому дочерним процессом веб-сервера оказывается оболочка. Утилита разведки приходится веб-процессу внуком, и правило, ищущее прямой запуск утилиты, смотрит на один уровень слишком мелко. Собственное правило для веб-оболочек имело именно такую форму, и цепочка эксплуатации прошла мимо него. Исключение составляют proc_open с массивом аргументов и pcntl_exec, запускающие программу без оболочки. Первый черновик срабатывал на запуск php из командной строки, поэтому легитимные сценарии вроде агента мониторинга давали шум; после требования настоящего веб- или FastCGI-родителя шум исчез.
Для установок PHP на IIS подтверждена уязвимость, но не эксплуатация: публичного сценария выполнения кода под Windows на момент публикации нет. Просмотренные наборы эксплуатации нацелены на Linux и зависят от смещений конкретной сборки, а на Windows работу затрудняют Control Flow Guard, ASLR и другой аллокатор. Воспроизведён только запуск команды: w3wp.exe порождает php-cgi.exe, тот - cmd.exe с ключами /s /c и командой whoami, а whoami.exe приходится внуком. Учётная запись рабочего процесса PHP на IIS часто имеет привилегию SeImpersonatePrivilege, однако это зависит от конфигурации пула и олицетворения FastCGI. Веб-оболочка на таком хосте остаётся вопросом проверки, а не гарантированным путём к системным правам.
Правила срабатывают на случай открытого текста, когда оболочка запускает названную команду разведки, и не покрывают обфускацию или ситуацию, когда первая команда к разведке не относится. Высокочастотные команды вроде cat, ls и ps в набор намеренно не включены, а остаточные ложные срабатывания дают приложения, которые сами вызывают hostname. За пределами правила остался встроенный сервер разработки php -S. Отдельно в материале указана ошибка CVE-2026-115560 из бюллетеня от 23 октября: она связана с тем же механизмом прогресса загрузки, требует необычной конфигурации среды выполнения и не закрывается выпусками от 21 октября, полное исправление обещано в следующем регулярном релизе. Для ветвей 7.4, 8.0 и 8.1 опубликованы только исправления в исходном коде без официальных релизов, для более старых ветвей выпусков нет.