Критические RCE-уязвимости в ядре PHP (PHP2Shell)
имени процесса PHP без аутентификации
Название документа: Критические RCE-уязвимости в ядре PHP (PHP2Shell)
Дата распространения: 2026-10-23
Идентификатор: AM-2026-ALE-1023-01.1
Описание угроз
CVE-2026-109618, CVE-2026-109619
CVSSv4: 9.2, AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
Объект уязвимости: Механизм обработки multipart/form-data совместно с отслеживанием прогресса загрузки сессии (session.upload_progress) в ядре PHP
Требования к атакующему: Удаленный неаутентифицированный
Максимальный результат атаки: Выполнение произвольного кода от имени процесса PHP без аутентификации
Источник уязвимости: Некорректная работа механизма обработки запроса типа multipart/form-data. Использование памяти после освобождения глобальных структур данных BG(serialize)/BG(unserialize), возникающее при аварийном выходе из-за исчерпания лимита памяти во время предварительной обработки запроса, когда очистка данных не выполняется
Сценарий атаки: Злоумышленник должен отправить специально сформированный multipart/form-data POST-запрос со значением "PHP_SESSION_UPLOAD_PROGRESS", переданным в параметре "name" и аномально большими именами файлов, вызывая переполнение лимита памяти в обработчике прогресса сессии
На что направлены
- PHP версии с 5.4.0 по 8.5.11
- PHP 8.2 до версии 8.2.35
- PHP 8.3 до версии 8.3.36
- PHP 8.4 до версии 8.4.27
- PHP 8.5 до версии 8.5.12
Меры противодействия
Провести инвентаризацию всех систем, работающих на PHP, в инфраструктуре (включая веб-серверы, панели управления, стороннее ПО и т.д.)
Проверить версию всех установленных PHP:
# Все исполняемый файлы PHP в системе
which -a php php8.2 php8.3 php8.4 php8.5 php-fpm php-fpm8.2 php-fpm8.3 php-fpm8.4
php-fpm8.5 2>/dev/null # Через update-alternatives (Debian/Ubuntu)
update-alternatives --list php 2>/dev/null
update-alternatives --list php-fpm 2>/dev/null # Все установленные PHP-пакеты (важно: версий может быть несколько)
dpkg -l | grep -E '^ii\s+php[0-9.]*-' # Debian/Ubuntu
rpm -qa | grep -E '^php[0-9]*-' # RHEL/Alma/Rocky/Fedora
Проверить версию работающего PHP:
# Для PHP-FPM:
php-fpm8.2 -v 2>/dev/null || php-fpm8.3 -v 2>/dev/null || php-fpm8.4 -v
2>/dev/null || php-fpm8.5 -v 2>/dev/null # Версия из pool.d (версия бинарного файла)
cat /etc/php/*/fpm/pool.d/www.conf 2>/dev/null | grep -iE 'listen|php_admin' |
head # Для Apache mod_php
apache2ctl -M 2>/dev/null | grep php
ls -la /etc/apache2/mods-enabled/ 2>/dev/null | grep -i php
ls -la /etc/httpd/modules/ 2>/dev/null | grep -i libphp
Произвести обновление PHP до исправленных версий 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12
В случае отсутствия возможности оперативного обновления или применения указанных настроек изолировать уязвимые системы от внешней сети (Интернет)
Отключить параметр обработки загрузки файлов, "session.upload_progress" в файле конфигурации (временная мера, которая не закрывает все цепочки атак):
Пример отключения параметра для следующих файлов:
- "session.upload_progress.enabled=0" в файле "php.ini" (FPM/Apache mod_php)
- "php_admin_flag[session.upload_progress.enabled] = off" для файла конфигурации в FPM pool
Установить значение параметра memory_limit равное "-1" для устранения переполнения памяти (временная мера, которая не закрывает все цепочки атак)
Пример установки значения параметра для следующих файлов:
-
FPM pool (www.conf): <br>
php_admin_value[memory_limit] = -1 - Apache:
php_admin_value memory_limit -1
Ограничить средствами веб-сервера multipart-POST запросы для загрузки файлов:
- Пример ограничения для сервера под управлением Apache:
# Apache .htaccess
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(POST|PUT|PATCH)$ [NC]
RewriteCond %{HTTP:Content-Type} ^[[:space:]]*multipart/formdata([;,[:space:]]|$)
[NC]
RewriteRule ^ - [F,L]
# Apache + ModSecurity
SecRequestBodyAccess On
SecRule ARGS_NAMES "@streq PHP_SESSION_UPLOAD_PROGRESS" \
"id:1026109618,phase:2,t:none,deny,status:403,log,\
msg:'php2shell: PHP_SESSION_UPLOAD_PROGRESS field blocked'"
- Пример ограничения для сервера под управлением NGINX:
# nginx, http{} context
map "$request_method:$content_type" $pp_mp {
default 0;
"~*^(POST|PUT|PATCH):\s*multipart/form-data([;,\s]|$)" 1;}
map $request_uri $pp_upload_route {
default 0;
"~*^/upload(/|\?|$)" 1; # adapt to your upload routes
"~*^/api/upload(/|\?|$)" 1;}
map $uri $pp_errpage {
volatile;
default 0;
"~^/error/[0-9]{3}\.html$" 1;}
map "$pp_mp$pp_upload_route$pp_errpage" $pp_block_mp {
volatile;
default 0;
"100" 1;}
# nginx, inside server{}
if ($pp_block_mp) { return 403; }
- Пример ограничения для сервера под управлением Caddy:
# Caddy, inside the site block
@php2shell {
method POST PUT PATCH
header_regexp Content-Type (?i)^\s*multipart/form-data([;,\s]|$)
not path /upload /upload/* /api/upload /api/upload/*}
respond @php2shell 403
- Пример ограничения для сервера под управлением lighttpd (применять к хосту/каталогу, куда загрузки не приходят):
# lighttpd (per vhost or folder without uploads)
$HTTP["request-method"] =~ "^(POST|PUT|PATCH)$" {
$REQUEST_HEADER["Content-Type"] =~ "(?i)^\s*multipart/formdata([;,
[:space:]]|$)" {
url.access-deny = ( "" )
}
}
-
Пример ограничения для сервера под управлением Cloudflare:
# Cloudflare custom WAF rule, action Block
(any(lower(http.request.headers["content-type"][*]) contains "multipart/formdata"))
and (http.request.method in {"POST" "PUT" "PATCH"})
and not (http.request.uri.path in {"/upload" "/api/upload" "/wp-
admin/asyncupload.php"})
- Пример ограничения для сервера под управлением FrankenPHP
{
frankenphp {
php_ini session.upload_progress.enabled 0
}
Установить значение параметра "post_max_size" равное "8M", если отсутствует механизм загрузки больших файлов и "32M", если нет возможности для отключения механизма. При этом значение параметра "upload_max_filesize" должно быть меньше, чем значение параметра "post_max_size".
Задать лимит на допустимое потребление памяти на уровне системы, с помощью cgroup memory.max или параметры потребления памяти контейнером. Для этого не использовать системные лимиты RLIMIT_AS и RLIMIT_DATA, которые не устраняют проблему и не снижают воздействие
Ограничить количество запросов, обрабатываемых одним процессом с помощью параметра "pm.max_requests=1" в PHP-FPM и "MaxRequestsPerChild" в Apache
Для PHP 8.5 установить значение "0" для параметра "fatal_error_backtraces"
Для применения изменений конфигурации сервер необходимо перезагрузить
Реализовать отслеживание следующих событий, указывающих на попытку эксплуатации уязвимости:
- multipart-POST запросы с полем "PHP_SESSION_UPLOAD_PROGRESS"
- Аномальные "upload_progress_*" записи в "session.save_path"
- Аномальные запросы, содержащие "Content-Type – multipart/form-data,boundary=...", методы "PUT/PATCH" и multipart-тело запроса
- Аномально длинные/бинарные значения "Set-Cookie: PHPSESSID=..." в HTTP-ответах
- Множественные HTTP-заголовки "Set-Cookie" в одном HTTPответе
- Нестандартные HTTP-запросы, содержащие значение "php2shell" в заголовке "User-Agent
Провести аудит логов системы на наличие информационных событий в следующих файлах
- "/var/log/nginx/access.log"
- "/var/log/apache2/access.log" (Debian)
- "/var/log/httpd/access_log" (RHEL)
- "/var/lib/php/sessions/" (Debian)
- "/var/lib/php/session/" (RHEL)
- "/var/log/audit/audit.log"
Пример события:
-
отображаемого в "access.log" / "access_log":
198.51.100.77 - - [21/Oct/2026:20:07:05 +0000] "POST /index.php HTTP/1.1" 200 12
"-" "php2shell-poc/1.0"
198.51.100.77 - - [21/Oct/2026:20:07:05 +0000] "POST /index.php HTTP/1.1" 502 157
"-" "php2shell-poc/1.0"
198.51.100.77 - - [21/Oct/2026:20:07:06 +0000] "GET
/index.php?file=/var/lib/php/sessions/sess_aaaaaaaaaaaaaaaaaaaaaaaaaa HTTP/1.1"
200 12 "-" "php2shell-poc/1.0"
- отображаемого в "sessions" / session:
sess_aaaaaaaaaaaaaaaaaaaaaaaaaa (262827 B): upload_progress_|a:5:{…}
- отображаемого в "audit.log":
name="PHP_SESSION_UPLOAD_PROGRESS"\n\n
Провести аудит логов системы на наличие ошибок в следующих файлах:
- "/var/log/php8.2-fpm.log" (Debian)
- "/var/log/php-fpm/error.log" (RHEL)
- "/var/log/syslog" (Debian)
- "/var/log/messages" (RHEL)
- "/var/log/kern.log" (Debian)
Пример ошибки:
-
отображаемой в "php8.2-fpm.log" / "error.log":
child 12344 said into stderr: "PHP Fatal error: Allowed memory size …"
- отображаемого в "syslog" / "messges":
php-fpm8.2[12344]: segfault at 0 ip … error 4 in php-fpm8.2
- отображаемого в "kern.log":
php-fpm8.2[12344]: segfault at 8 ip …
Данные примеры могут свидетельствовать о попытке эксплуатации уязвимости в системе
Использовать правила ViPNet xFirewall / ViPNet HW:
- 3438055 "AM EXPLOIT PHP < v8.5.12 RCE aka php2shell (CVE-2026- 109618, CVE-2026-109619)"
- 3438056 "AM EXPLOIT PHP < v8.5.12 OOM RCE (CVE-2026-109618)"
- 3101541 "AM EXPLOIT Generic Possible PHP Injection: PHP Tag in HTTP request"
- 3105228 "AM EXPLOIT Generic Command Injection in HTTP Body: 'php' in request var 1" • 3105212 "AM EXPLOIT Generic Command Injection in HTTP Body: 'echo' in request var 1"
Использовать правила ViPNet IDS NS:
- 3438055 "AM EXPLOIT PHP < v8.5.12 RCE aka php2shell (CVE-2026- 109618, CVE-2026-109619)"
- 3438056 "AM EXPLOIT PHP < v8.5.12 OOM RCE (CVE-2026-109618)"
- 3436516 "AM USER_AGENTS [HUNT] Suspicious User Agent (PHP2Shell)"
- 3101541 "AM EXPLOIT Generic Possible PHP Injection: PHP Tag in HTTP request"
- 3105228 "AM EXPLOIT Generic Command Injection in HTTP Body: 'php' in request var 1"
- 2011768 "ET WEB_SERVER PHP tags in HTTP POST" • 3203296 "AM EXPLOIT Node.js Dicer DoS (CVE-2022-24434) var 1"
- 3105212 "AM EXPLOIT Generic Command Injection in HTTP Body: 'echo' in request var 1"
- 2072548 "ET EXPLOIT PHP php2shell Handler-mismatch Session Injection (CVE-2026-109619)"
- 2072549 "ET EXPLOIT PHP php2shell Multipart Header Amplification OOM (CVE-2026-109618)"
- 2072550 "ET EXPLOIT PHP php2shell Nested Empty File Control OOM (CVE-2026-109618)"
- 2072551 "ET EXPLOIT PHP php2shell Chunked Multipart Request without Content-Length (CVE-2026-109618)"
- 2072552 "ET EXPLOIT PHP php2shell Binary URL-Encoded POST for $_POST Corruption (CVE-2026-109618)"
- 2072553 "ET EXPLOIT PHP php2shell Multipart Request without Content-Length (CVE-2026-109618)"
- 2072554 "ET EXPLOIT PHP php2shell Code Injection in Filename (CVE-2026-109619)"
- 2072556 "ET EXPLOIT PHP php2shell Excessive Multipart Part Count (CVE-2026-109618)"
- 2072557 "ET EXPLOIT PHP php2shell Excessive Empty Multipart File Controls (CVE-2026-109618)"
- 3438080 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 134.199.154.64 (PHP2Shell)"
- 3438079 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 103.114.163.188 (PHP2Shell)"
- 3438103 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 77.90.185.20 (PHP2Shell)"
- 3438102 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 58.221.60.160 (PHP2Shell)"
- 3438101 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 54.169.109.7 (PHP2Shell)"
- 3438100 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 41.223.30.7 (PHP2Shell)"
- 3438099 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 217.60.242.76 (PHP2Shell)"
- 3438097 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 94.154.43.7 (PHP2Shell)"
- 3438096 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 85.11.167.243 (PHP2Shell)"
- 3438095 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 7.109.105.177 (PHP2Shell)"
- 3438094 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 45.198.224.169 (PHP2Shell)"
- 3438093 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 109.71.252.97 (PHP2Shell)"
- 3438090 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 221.14.159.134 (PHP2Shell)"
- 3438089 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 95.217.98.37 (PHP2Shell)"
- 3438088 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 94.154.43.219 (PHP2Shell)"
- 3438087 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 91.90.123.25 (PHP2Shell)"
- 3438086 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 37.19.200.5 (PHP2Shell)"
- 3438085 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 31.223.184.166 (PHP2Shell)"
- 3438084 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 204.76.203.7 (PHP2Shell)"
- 3438083 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 200.141.3.58 (PHP2Shell)"
- 3438082 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 143.110.254.126 (PHP2Shell)"
- 3438081 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 134.209.159.64 (PHP2Shell)"
- 3438376 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 94.154.43.149 (PHP2Shell)"
- 3438375 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 87.121.84.174 (PHP2Shell)"
- 3438374 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 85.137.56.188 (PHP2Shell)"
- 3438373 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 85.137.53.26 (PHP2Shell)"
- 3438372 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 65.49.200.56 (PHP2Shell)"
- 3438371 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 52.74.54.75 (PHP2Shell)"
- 3438370 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 5.191.140.240 (PHP2Shell)"
- 3438369 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 47.100.125.108 (PHP2Shell)"
- 3438368 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 45.134.225.16 (PHP2Shell)"
- 3438367 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 43.134.82.85 (PHP2Shell)"
- 3438366 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 217.160.132.82 (PHP2Shell)"
- 3438365 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 217.112.152.168 (PHP2Shell)"
- 3438364 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 206.188.197.105 (PHP2Shell)"
- 3438363 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 203.78.119.133 (PHP2Shell)"
- 3438362 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 193.47.62.24 (PHP2Shell)"
- 3438361 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 193.142.147.111 (PHP2Shell)"
- 3438360 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 185.196.220.132 (PHP2Shell)"
- 3438359 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 185.161.210.29 (PHP2Shell)"
- 3438358 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 181.215.186.252 (PHP2Shell)"
- 3438357 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 167.254.242.130 (PHP2Shell)"
- 3438356 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 166.1.90.109 (PHP2Shell)"
- 3438355 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 158.69.113.75 (PHP2Shell)"
- 3438354 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 157.230.117.70 (PHP2Shell)"
- 3438353 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 152.233.51.69 (PHP2Shell)"
- 3438352 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 143.246.223.124 (PHP2Shell)"
- 3438351 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 140.245.32.169 (PHP2Shell)"
- 3438350 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 139.162.165.136 (PHP2Shell)"
- 3438349 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 122.10.17.49 (PHP2Shell)"
- 3438348 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 122.10.110.72 (PHP2Shell)"
- 3438347 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 107.189.14.87 (PHP2Shell)"
- 3438346 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 107.150.31.151 (PHP2Shell)"
- 3438345 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 104.219.251.31 (PHP2Shell)"
- 3438344 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 103.147.220.17 (PHP2Shell)"
- 3438343 "AM CURRENT_EVENTS HTTP request to malicious IP endpoint in header 102.210.149.166 (PHP2Shell)"
Использовать правила ViPNet IDS HS / ViPNet EPP:
- 870206 "Обнаружен запуск командной оболочки через "php""
Ссылки на источники
- https://github.com/php/php-src/security/advisories/GHSA-w8hww9fx-j79w
- https://github.com/php/php-src/security/advisories/GHSA-6wmf4rv5-p3rp
- https://github.com/php/php-src/commit/3584a98bda
- https://www.php.net/archive/2026.php
- https://cert.europa.eu/publications/security-advisories/2026-018
- https://www.cisa.gov/news-events/alerts/2026/10/21/criticalvulnerabilities-php-require-immediate-patching
- https://sansec.io/research/php2shell
- https://watchtowr.com/intelligence/php-cve-2026-109618-faq
- https://www.wiz.io/blog/php2shell-php-rce
- https://www.sophos.com/en-us/blog/proof-of-concept-exploitreleased-for-php-vulnerabilities-109618-109619
- https://www.vulncheck.com/blog/php2shell-vulnerabilities
- https://research.jfrog.com/post/php2shell-all-you-need-to-knowabout-cve-2026-109618-and-cve-2026-109619
- https://blog.talosintelligence.com/two-critical-rces-in-php-core
- https://hunt.io/blog/php2shell-cve-2026-109618-109619-opendirectories
- https://www.wordfence.com/blog/2026/10/attacks-on-php2shellcontinue-but-no-known-compromises-as-a-result-yet
- https://socradar.io/blog/php2shell-exploit-tooling-attacker-server
- https://aws.amazon.com/blogs/security/amazon-threatintelligence-identifies-php2shell-exploitation-prior-to-publicdisclosure-in-madpot
- https://securelist.com/tr/php2shell-critical-vulnerabilities-inphp/121596/
- https://censys.com/advisory/cve-2026-109618-cve-2026-109619/
- https://pasqualepillitteri.it/ru/news/26091/php2shell-pravila-nginx-apache-blokiruyut-ataki-php-do-patcha
- https://thehackernews.com/2026/10/php2shell-exploit-attempts-hit-millions.html
- https://jackalsyn.com/posts/php-up-2026.html
- https://habr.com/ru/articles/1097362/
- https://xakep.ru/2026/10/21/php2shell/
- https://www.opennet.ru/opennews/art.shtml?num=66520
- https://github.com/ikow/php2shell-poc