0887 371 498 support@itservice-bg.net
php2shell (CVE-2026-109618/109619): как закърпихме PHP и на стар Ubuntu 20.04
26.10.2026 · Самуил Арсов · Hosting, Ubuntu, Киберсигурност

php2shell (CVE-2026-109618/109619): как закърпихме PHP и на стар Ubuntu 20.04

На 20 октомври 2026 г. бяха обявени две уязвимости в PHP, известни като php2shell: CVE-2026-109618 и CVE-2026-109619. С тях атакуващ може да изпълни собствен код на сървъра с една HTTP заявка, без парола и без акаунт. Уязвимостите вече се експлоатират активно. Ето какво представляват, как да проверите дали сте засегнати и как закърпихме сървър, за който готов пакет няма.

Накратко
Засегнати са всички поддържани версии на PHP, а също и по-старите.
Поправени версии: 8.5.12, 8.4.27, 8.3.36, 8.2.35. За 8.1, 7.4 и по-старите кръпката е налична само като backport.
CVSS v4: 9.2. Експлоатира се активно.

Какво означава това на човешки език

Проблемът е в самия PHP, а не в WordPress, Joomla или в плъгин. Атаката удря интерпретатора, преди да се стигне до кода на сайта. Затова Wordfence, сложни пароли и обновени плъгини не помагат: сайтът може да е напълно чист и пак да бъде пробит.

Щом атакуващият изпълнява код на сървъра, той може да чете файловете на сайта (включително паролата за базата в wp-config.php), да качва бекдори и да праща спам. Ако на сървъра има повече от един сайт, засегнати са и съседните сайтове.

Как да проверите сървъра си

php -v не е надежден, защото дистрибуциите кърпят, без да сменят основната версия. Сигурната проверка е changelog-ът на пакета:

zcat /usr/share/doc/php8.1-common/changelog.Debian.gz | grep -m1 109618

Ако командата не връща нищо, тази версия не е закърпена. Проверете всяка инсталирана версия, не само тази по подразбиране:

ls /etc/php/
ps -eo cmd | grep "php-fpm: master"

Нова система: обновете и рестартирайте

На поддържана дистрибуция с репото на Sury (Ubuntu 22.04/24.04, Debian 12/13) кръпката идва с обикновен ъпдейт. Задължителна стъпка е рестартът на PHP-FPM. Без него старият код остава зареден в паметта.

apt update && apt upgrade
systemctl restart php8.3-fpm     # за всяка версия, която ползвате

Единият ни сървър беше закърпен така автоматично, още в деня след обявяването.

Стара система: Ubuntu 20.04

Другият сървър е на Ubuntu 20.04 с PHP 8.1, 7.4 и 5.6. Тук готов пакет няма: репото на Sury за focal вече не се обновява. Затова стъпихме на две неща.

1. Временна мярка (същия ден)

Едната от двете уязвимости минава през механизма за прогрес при качване на файлове в сесията. Той почти никъде не се ползва и спокойно се изключва:

# /etc/php/8.1/fpm/conf.d/99-php2shell.ini  (и за cgi, и за всяка версия)
session.upload_progress.enabled = 0

Това е частична защита: покрива CVE-2026-109619, но не и 109618. Не я приемайте за решение, тя само печели време.

2. Истинската кръпка: собствен билд

Sury има закърпени source пакети за по-новите Ubuntu. Кръпката е отделен patch („Avoid state corruption via bailout“) и няма нужда от нищо по-ново от това, което има в 20.04. Затова същият source може да се компилира за focal. Компилацията става на отделна машина, а не на продукционния сървър:

# чиста focal среда на работна машина
debootstrap --variant=buildd focal /var/lib/machines/focal-php http://archive.ubuntu.com/ubuntu
systemd-nspawn -D /var/lib/machines/focal-php

# вътре: source от packages.sury.org/php/pool/main/p/php8.1/
dpkg-source -x php8.1_8.1.34-9+...ubuntu24.04...dsc src && cd src
grep bailout debian/patches/series          # кръпката е тук
dch --local +focal "Rebuild for Ubuntu 20.04 (php2shell)"
mk-build-deps -i -r debian/control
dpkg-buildpackage -b -uc -us

Суфиксът +focal1 във версията показва, че пакетът е наш билд, и пакетът стои по-високо от стария. Същото се повтаря за 7.4 и 5.6. Внимание: номерът на patch-а е различен при всяка версия, затова се търси по име, а не по номер.

3. Инсталиране с път назад

# бекъп на текущите пакети, за да има revert
mkdir /root/php-backup && cd /root/php-backup
for p in $(dpkg -l | awk '/^ii +php(5\.6|7\.4|8\.1)-/{print $2}'); do dpkg-repack $p; done

# само пакетите, които вече са инсталирани; конфигурацията се пази
apt-get install -o Dpkg::Options::=--force-confold ./php*.deb
systemctl restart php5.6-fpm php7.4-fpm php8.1-fpm
apache2ctl graceful

Проверката след това: changelog-ът съдържа двете CVE, всички сайтове отговарят нормално и в логовете на PHP-FPM няма грешки. Рестартът прекъсва сайтовете за секунди.

Какво остава

  • Неползвани версии. Ако на сървъра работят FPM процеси за версии без сайтове, спрете ги. Дори да не се достигат отвън, те са незакърпен код, който стои пуснат.
  • Ubuntu 20.04 е стигнал края на стандартната си поддръжка. Собственият билд решава проблема днес, но следващата уязвимост пак ще изисква ръчна работа. Дългосрочното решение е нова ОС или преместване на сайтовете.
  • Ако сървърът е бил уязвим дни наред, проверете за нови PHP файлове в директориите на сайтовете и за непознати администратори в WordPress.