Критичность: критическая (CVSS v4.0 — 9.2). Уязвимости позволяют удалённо выполнить произвольный код (RCE) на сервере.
21 октября 2026 года команда PHP выпустила исправления для двух критических уязвимостей в обработке запросов типа multipart/form-data (используется при загрузке файлов):
CVE-2026-109619 — обработчик upload-progress в расширении session выполнялся при каждом multipart-запросе до инициализации запроса и мог использовать состояние, оставленное предыдущим запросом в том же процессе (php-fpm или Apache).
CVE-2026-109618 — исчерпание памяти при разборе multipart-запроса переводило движок PHP в состояние, при котором завершение запроса выполнялось на частично инициализированных данных.
Уязвимы все выпускавшиеся версии PHP начиная с 5.4. Официальные исправления выпущены в версиях 8.2.35, 8.3.36, 8.4.27, 8.5.12.
На VDS с панелью управления NetAngels защита осуществляется одним из трёх способов:
| Путь | Что делаем | Кому |
|---|---|---|
| A | Устанавливаем исправленные сборки PHP из репозитория NetAngels | Debian 11/12/13 (bullseye, bookworm, trixie), PHP 8.2–8.5 |
| B | Устанавливаем плагин hp_uploadprogress_guard |
Debian 8/10/11/12/13, PHP 5.6–8.1 |
| C | Блокируем запросы multipart/form-data в web-сервере |
Debian 7 (wheezy), PHP 5.4–7.3 |
Все команды выполняются от root (или с sudo) в Терминале VDS или через SSH.
cat /etc/os-release
В строке VERSION_CODENAME указана кодовая версия Debian: wheezy, stretch, buster, bullseye, bookworm или trixie.
ls /usr/bin/php* /usr/sbin/php-cgi* 2>/dev/null
В списке будут бинарники вида php8.4.26, php-cgi8.4.26 — цифры после php указывают версию PHP (в примере — 8.4).
Важно: на VDS зачастую установлено несколько версий PHP (например, 7.4 и 8.4 одновременно). Инструкцию нужно выполнить для каждой установленной версии PHP.
| Debian | Версии PHP | Что делать |
|---|---|---|
| wheezy (7) | 5.4–7.3 | Путь C: блокировка в web-сервере |
| stretch (8) | 5.6–8.1 | Путь B: плагин |
| buster (10) | 5.6–8.4 | Путь B: плагин |
| bullseye (11) | 8.2–8.5 | Путь A: исправленные пакеты PHP |
| bullseye (11) | 7.0–8.1 | Путь B: плагин |
| bookworm (12) | 8.2–8.5 | Путь A: исправленные пакеты PHP |
| bookworm (12) | 7.4–8.1 | Путь B: плагин |
| trixie (13) | 8.2–8.5 | Путь A: исправленные пакеты PHP |
| trixie (13) | 5.6–8.1 | Путь B: плагин |
Если для одного VDS под разные сайты используются разные версии PHP — действуйте по каждой версии согласно таблице (например, для 8.4 — Путь A, для 7.4 на том же VDS — Путь B).
Исправленные сборки PHP уже опубликованы в репозитории NetAngels:
| Текущая версия PHP | Пакет для установки |
|---|---|
| 8.2 | php8.2.35 |
| 8.3 | php8.3.36 |
| 8.4 | php8.4.27 |
| 8.5 | php8.5.12 |
Проверьте, подключён ли репозиторий:
grep -r 'packages.netangels.ru' /etc/apt/sources.list /etc/apt/sources.list.d/
Если вывод пустой — добавьте репозиторий и ключ:
. /etc/os-release
echo "deb http://packages.netangels.ru/debian $VERSION_CODENAME main" > /etc/apt/sources.list.d/netangels.list
wget -O - http://packages.netangels.ru/debian/info@netangels.ru.gpg.key | apt-key add -
Обновите списки пакетов:
apt-get update
Пример для PHP 8.4 (для другой версии подставьте соответствующий пакет из таблицы выше):
apt-get install -y php8.4.27
Если при установке возникает ошибка вида trying to overwrite '/etc/php-fpm.conf.default', which is also in package php8.4.x (конфликт со старым пакетом PHP) — установите с опцией --force-overwrite:
apt-get -o Dpkg::Options::='--force-overwrite' --no-install-recommends -y install php8.4.27
Для применения новой версии PHP на VDS выполните скрипт обновления:
/usr/bin/update-php
Скрипт переключит VDS на новую версию PHP. После этого новая версия появится в панели управления.
Если для старой версии установлены пакеты расширений (например, php8.4.26-redis, php8.4.26-memcached), установите аналогичные для новой версии:
apt-get install -y php8.4.27-redis
Если дополнительные расширения загружаются из /opt (подключены в панели), а минорная версия PHP не менялась (8.4 → 8.4) — ничего делать не нужно, модули совместимы.
Старый пакет PHP (например,
php8.4.26) удалять не обязательно: послеupdate-phpиспользуется только новая версия. Удалить старый пакет можно позже командойapt-get remove -y php8.4.26.
Плагин hp_uploadprogress_guard — модуль PHP, который закрывает обе уязвимости на не обновлённых сборках PHP: отключает уязвимый обработчик upload-progress, подменяет разбор multipart-запросов исправленным алгоритмом и исключает исчерпание памяти при разборе. Обычная загрузка файлов при этом работает без изменений. Плагин не требует пересборки PHP и применяется ко всем версиям PHP 5.6–8.1, кроме wheezy (на Debian 7 он не загружается — используйте Путь C).
Готовые модули для каждой версии PHP (x86_64) публикуются в репозитории разработчика: https://github.com/HOSTED-POWER/php_uploadprogress_guard/tree/main/dist
Файл модуля подбирается по минорной версии PHP (5.6, 7.0, 7.1, 7.2, 7.3, 7.4, 8.0, 8.1).
Пример для PHP 7.4:
cd /opt
wget https://raw.githubusercontent.com/HOSTED-POWER/php_uploadprogress_guard/main/dist/hp_uploadprogress_guard-7.4.so
wget https://raw.githubusercontent.com/HOSTED-POWER/php_uploadprogress_guard/main/dist/SHA256SUMS
grep ' hp_uploadprogress_guard-7\.4\.so$' SHA256SUMS | sha256sum -c -
Последняя команда проверяет контрольную сумму файла. Ожидается вывод:
hp_uploadprogress_guard-7.4.so: OK
Если вывод FAILED — файл повреждён, скачайте его заново.
Для других версий PHP замените 7.4 на свою минорную версию во всех трёх командах (hp_uploadprogress_guard-5.6.so, hp_uploadprogress_guard-8.1.so и т.д.).
1) В личном кабинете в разделе VDS откройте Панель управления VDS.
2) Перейдите на вкладку «Настройки PHP» нужного VDS-аккаунта и проверьте версию PHP. В примере 7.4, у вас может быть другая.
3) В поле настроек добавьте строку (с полным путём к скачанному файлу):
extension=/opt/hp_uploadprogress_guard-7.4.so
4) Сохраните настройки - изменения вступят в силу.
Если на VDS несколько аккаунтов — для каждого нужно подключить свой модуль и свою строку
extension=/opt/hp_uploadprogress_guard-X.Y.soв настройках PHP.
sudo -u web bash -c "php -m | grep hp_uploadprogress_guard"
В выводе должна отображаться запись hp_uploadprogress_guard. Основной способ проверки — раздел «Проверка результата» ниже.
Для Debian 7 (wheezy) исправленные сборки PHP недоступны, а плагин на этой версии дистрибутива не применим. Единственный способ защиты — запретить приём запросов с Content-Type: multipart/form-data на уровне web-сервера: атака распространяется только через такие запросы.
Внимание: после применения этого правила все загрузки файлов через PHP на заблокированных сайтах перестанут работать (формы с прикреплением файла, загрузка в медиа-библиотеки, письма с вложениями через веб-интерфейс и т.п.). Обычные страницы, формы без загрузки файлов, API-запросы — работают как раньше. Для wheezy мы также рекомендуем запланировать перенос сайта на VDS с актуальным Debian — там доступны полноценные пути A и B.
netstat -tlnp | grep -E ':(80|443)\s'
Если netstat не установлен:
ss -tlnp | grep -E ':(80|443)'
или
ps aux | grep -E 'nginx|apache2' | grep -v grep
По имени процесса (nginx или apache2) определите web-сервер. Если работает связка nginx + Apache2 (nginx на фронтенде) — достаточно поставить правило в nginx; если сайт обслуживается только Apache2 — правило ставится в Apache2.
Правило работает в контексте server {}, поэтому размещается в конфиге сайта. На VDS с панелью управления NetAngels индивидуальные настройки сайтов размещаются в каталоге /etc/nginx/custom-settings.d/. Откройте конфигурационный файл сайта и пропишите:
if ($http_content_type ~* "multipart/form-data") {
return 403;
}
Проверьте и перезапустите nginx:
nginx -t
service nginx restart
Если нужно заблокировать multipart на всех сайтах VDS — создайте отдельные файлы в /etc/nginx/custom-settings.d/ для каждого сайта (единый глобальный файл не подходит: директива if разрешена только внутри server {}).
Глобально (для всех сайтов) — создайте конфиг и включите его:
cat > /etc/apache2/conf-available/block-multipart.conf <<'EOF'
RewriteEngine On
RewriteCond %{HTTP:Content-Type} multipart/form-data [NC]
RewriteRule ^ - [F]
EOF
a2enconf block-multipart
apache2ctl configtest
service apache2 restart
Точечно, для одного сайта — поместите те же три строки в файл .htaccess, размещенный в корневой директории сайта.
sudo -u web bash -c "php -v"
Ожидается исправная версия: 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 (или новее).
а) В панели управления VDS → «Настройки PHP» для нужной версии — строка extension=/opt/hp_uploadprogress_guard-X.Y.so на месте.
б) Проверьте, что модуль загружен:
sudo -u web bash -c "php --ri hp_uploadprogress_guard"
В выводе должна быть строка rfc1867 (session.upload_progress) callback detached => yes.
Запрос с загрузкой файла должен отклоняться с кодом 403:
curl -s -o /dev/null -w '%{http_code}\n' -X POST -F 'test=1' http://ваш-домен/
Ожидается 403.
Обычный GET-запрос работает как раньше:
curl -s -o /dev/null -w '%{http_code}\n' http://ваш-домен/
Ожидается 200 (или 301/302, если сайт редиректит на https).
Откройте сайты в браузере: страницы должны открываться как раньше. Загрузка файлов (через форму) должна работать на всех, кроме сайтов, где применён Путь C.
Путь A — ничего: это штатное обновление PHP до исправного релиза.
Путь B — единственное видимое изменение: перестаёт работать функциональность session.upload_progress (запись прогресса загрузки в $_SESSION). Браузеры и современные приложения её не используют, стандартные CMS работают без неё. Сама загрузка файлов полностью исправна. После последующего обновления PHP до исправной версии плагин сам «отключается» (в выводе php --ri hp_uploadprogress_guard появятся отметки not needed) — удалять его не обязательно.
Путь C — заблокирована загрузка файлов через PHP на затронутых сайтах (см. предупреждение выше).
apt-get update ругается на подпись репозитория — убедитесь, что ключ добавлен: apt-key list | grep -i netangels, при необходимости повторите команду добавления ключа из шага A1.
Ошибка конфликта файлов при apt-get install — используйте команду с --force-overwrite из шага A2.
Сайт не открывается после перезапуска web-сервера — проверьте конфиг: nginx -t или apache2ctl configtest — они укажут строку с ошибкой.
Не получилось самостоятельно — обратитесь в техническую поддержку NetAngels, указав кодовую версию Debian (cat /etc/os-release) и установленные версии PHP (ls /usr/bin/php*).