
PHP 8.4.26 — критическая — удалённая — OOM longjmp — CVE-2026-109618 PHP2Shell. Неаутентифицированный chunked multipart достигает memory_limit до выполнения кода приложения в Apache mod_php. Лабораторная проверка в сравнении с 8.4.27. В рекомендациях предполагается RCE.
Кто-то в интернете может общаться с вашим PHP-сайтом так же, как это делает браузер, без пароля. На последней уязвимой версии PHP он может отправить специально сформированный запрос на загрузку файла, который заставит движок исчерпать память, пока тот ещё читает запрос, до запуска вашего приложения. Затем PHP прерывает эту работу, когда запрос построен лишь наполовину. Группа PHP показала, что очистка этого наполовину построенного состояния может превратиться в удалённое выполнение кода от имени веб-воркера. Эта лаборатория доказывает переход по out-of-memory на Apache mod_php 8.4.26 и то, что 8.4.27 завершает тот же запрос корректно.
Класс: OOM longjmp / прерывание на этапе запуска запроса Доступ: Удалённый
PHP 8.4.26 (php:8.4.26-apache) против исправленной 8.4.27 - php.net
Apache mod_php всегда выполняет завершение запроса, даже если запуск запроса завершился неудачей. CVE-2026-109618 — это longjmp() по memory_limit во время разбора rfc1867, когда бакет HashTable уже виден для разрушения. Лаборатория представляет собой chunked multipart/form-data POST без пригодного Content-Length и с ~3000 дополнительных заголовков частей при memory_limit=8M. 8.4.26 возвращает Fatal error: Allowed memory size ... in Unknown on line 0. 8.4.27 возвращает маркер живости и выполняет index.php. GET воркера после триггера по-прежнему возвращает 200 на обеих сторонах. RCE от имени воркера Apache выводится из GHSA.
| ID | CVE-2026-109618 |
| Рекомендация | GHSA-w8hw-w9fx-j79w |
| Класс | OOM longjmp / прерывание на этапе запуска запроса (RCE выводится из рекомендации) |
| Доступ | Удалённый (неаутентифицированный HTTP) |
| CWE | CWE-416 / CWE-824 / CWE-755 |
| CVSS | Критический: 9.2 CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H (PHP Group) |
| Продукт | PHP |
| Затронуто | PHP 8.2 до 8.2.35, 8.3 до 8.3.36, 8.4 до 8.4.27, 8.5 до 8.5.12 (закреплено в лаборатории 8.4.26) |
| Исправлено | 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 (21 октября 2026) |
| Аутентификация | нет |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
Родственный: CVE-2026-109619 — UAF устаревшей worker-global переменной (пара PHP2Shell).
| Метод | Точка срабатывания | Привилегия |
|---|---|---|
Неаутентифицированный POST multipart/form-data с Transfer-Encoding: chunked, множеством дополнительных заголовков частей, конечным memory_limit | разбор rfc1867 / zend_bailout longjmp во время php_request_startup | Доступность (доказано в лаборатории): прерывание запуска запроса до index.php на 8.4.26 (Unknown on line 0). Целостность (выводится): завершение обходит наполовину инициализированные $_POST/$_FILES; вендор показал RCE от имени воркера Apache (www-data в официальном образе). Разведка (выводится): раскрытие остатков кучи запроса. |
| Тот же триггер на 8.4.27 | отложенный мягкий OOM | Закрыто (доказано в лаборатории): HTTP 200 с маркером живости, files=1, воркер остаётся запущенным. |
| GET после триггера | воркер всё ещё жив | Доказано в лаборатории: на этой закреплённой версии не было SIGSEGV и не логировалось zend_mm_heap corrupted. |
Вход, маршрут приложения, пользовательский .so, обратная оболочка | н/д | Закрыто. Попытки контроля RIP не предпринимались. |
Доказано в лаборатории vs выводится: различие OOM-longjmp между 8.4.26 и 8.4.27 доказано в лаборатории. UAF при гибели воркера и RCE выводятся из GHSA-w8hw-w9fx-j79w. FPM обычно завершает дочерний процесс при сбое запуска; полный эксплойт для FPM вендор для этого CVE не показал.
Требуется: Apache apache2handler. Конечный memory_limit (не устанавливайте -1; это и есть мера защиты). Включённый разбор multipart. Официальные php:8.4.26-apache против php:8.4.27-apache.
python3 php-oom-longjmp-Abraxas-Labs.py
или cd lab && ./run.sh. Loopback 127.0.0.1:18220 (8.4.26) против 127.0.0.1:18221 (8.4.27). Проект Compose cve-2026-109618. Свидетель CVE-2026-109618-OOM-WITNESS. Последняя строка:
SUCCESS CVE-2026-109618 vuln-crash=yes patched-ok=yes sapi=apache2handler vuln-image=php:8.4.26-apache patched-image=php:8.4.27-apache how=oom-longjmp-startup-fatal trigger=header-bomb-chunked asan=no CVE-2026-109618-OOM-WITNESS
Только авторизованная лаборатория. Взаимодействует с loopback.
Обновитесь до PHP 8.4.27 (или 8.2.35 / 8.3.36 / 8.5.12). Патч заменяет OOM longjmp() на отложенный мягкий OOM в следующей безопасной точке VM и жёсткий _exit() при превышении более высокого порога (31c0ea7). До этого: административный memory_limit=-1, который приложения не могут переопределить; держите post_max_size низким; ограничьте количество частей и заголовков multipart. Не используйте RLIMIT_AS или RLIMIT_DATA.
Abraxas Labs [email protected]