Сообщить об инциденте
Сообщить об инциденте
Критические RCE-уязвимости в ядре PHP (PHP2Shell)
Публикации
Назад

Критические 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""

Ссылки на источники

Все публикации