0% прочитано

Як безпечно оновити PHP після критичних вразливостей

Якщо критична вразливість знаходиться в самому PHP, оновлення Composer-залежностей її не виправить. Потрібно перевірити всі середовища, підготувати резервні копії, оновити встановлені пакети PHP і після цього перевірити сайт, PHP-FPM, черги та Docker-контейнери.

22 жовтня 2026 р. 12 хв читанняDevOps

У попередній матеріал про CVE-2026-109618 і CVE-2026-109619 я розібрала, чому дві критичні вразливості PHP від 21 жовтня 2026 року потребують швидкої реакції.

Тепер практична частина: як оновити PHP так, щоб не обмежитися одним apt upgrade, а перевірити весь шлях від поточної версії до працездатного застосунку після оновлення.

Нижче я використовую приклад PHP 8.5 на Ubuntu з Nginx і PHP-FPM. Для інших гілок PHP назви пакетів потрібно замінити на відповідні.

Офіційне повідомлення PHP називає повним вирішенням саме оновлення. Для PHP 8.5 версією з виправленнями є 8.5.12; для 8.4 - 8.4.27, для 8.3 - 8.3.36, для 8.2 - 8.2.35. Якщо PHP встановлений із пакетів Linux-дистрибутива, потрібно також перевірити, чи постачальник не переніс виправлення у власний пакет.

1. Спочатку перевірити, які версії PHP реально встановлені

Перевірка PHP CLI та PHP-FPM
php -vphp8.5 -vphp-fpm8.5 -v

Я не покладаюся лише на php -v. Команда php може вказувати на одну версію, а PHP-FPM, який реально обслуговує сайт, - на іншу.

Тому окремо перевіряю CLI і FPM. Якщо на сервері встановлено кілька гілок PHP, перевіряю кожну з них.

Перелік установлених пакетів PHP 8.5
dpkg-query -W 'php8.5*'

Це допомагає побачити не лише php8.5-cli і php8.5-fpm, а й розширення, які потрібно залишити узгодженими після оновлення.

Для пакетів дистрибутива номер версії потрібно оцінювати разом із повідомленням постачальника про безпеку, тому що виправлення може бути перенесене в його власну збірку.

2. Перед оновленням підготувати резервні копії та шлях відкату

Оновлення PHP змінює середовище виконання всього застосунку. Навіть якщо саме оновлення пакетів стандартне, я не хочу починати його без актуальної резервної копії даних і конфігурації.

Для MySQL приклад може виглядати так:

Резервна копія MySQL із перевіркою gzip
set -o pipefailumask 077 sudo mysqldump \  --single-transaction \  --quick \  --routines \  --events \  --triggers \  --no-tablespaces \  --databases app_db \  | gzip > app_db.sql.gz gzip -t app_db.sql.gz

app_db потрібно замінити на назву своєї бази. Облікові дані краще брати з уже налаштованого безпечного способу доступу, а не передавати пароль відкритим текстом у командному рядку.

gzip -t перевіряє цілісність архіву, але не доводить, що база реально відновлюється. Це окрема перевірка, яку я детальніше розбираю в окремий матеріал про те, чому самого файла резервної копії недостатньо.

Копія конфігурації PHP, Nginx і Supervisor
sudo tar -czf /root/php-config-backup.tar.gz \  -C / \  etc/php/8.5 \  etc/nginx \  etc/supervisor

За можливості я також готую знімок сервера або інший перевірений спосіб відкату. Важливо знати не лише, як оновити, а й що робити, якщо після цього застосунок не запускається.

3. Перевірити, які оновлення реально доступні

Оновлення індексу пакетів і перевірка доступних версій
sudo apt-get update apt-cache policy \  php8.5-cli \  php8.5-fpm

apt-cache policy показує встановлену та доступну версії пакетів. Якщо використовується сторонній репозиторій або пакет від дистрибутива з перенесеним виправленням, саме тут потрібно звірити джерело пакета та його стан безпеки.

Список лише встановлених пакетів PHP 8.5
mapfile -t packages < <(  dpkg-query -W \    -f='${binary:Package} ${db:Status-Abbrev}\n' \    'php8.5*' 2>/dev/null |  awk '$2 == "ii" {print $1}') printf '%s\n' "${packages[@]}"

Я формую список уже встановлених пакетів, щоб не додати випадково нові розширення й не оновлювати всю операційну систему разом із PHP.

4. Спочатку подивитися план змін без установлення

Пробний запуск оновлення
sudo apt-get -s install \  --only-upgrade "${packages[@]}"

Параметр -s не встановлює пакети. Він показує, що саме планує зробити пакетний менеджер.

Перед реальним оновленням я перевіряю, що не зникають потрібні модулі PHP, не видаляються сторонні пакети й не з’являються неочікувані зміни залежностей.

5. Оновити встановлені пакети PHP

Оновлення лише вже встановлених пакетів PHP 8.5
sudo apt-get install \  --only-upgrade "${packages[@]}"

Цей крок оновлює вже встановлені компоненти PHP 8.5. Він не є повним оновленням усіх пакетів Ubuntu.

Під час оновлення пакет PHP-FPM може перезапустити службу автоматично. На production сервері це потрібно врахувати як можливе коротке переривання обслуговування динамічних запитів.

6. Після оновлення перевірити версії та конфігурацію

Перевірка версій і синтаксису конфігурації
php8.5 -vphp-fpm8.5 -v sudo php-fpm8.5 -tsudo nginx -t

Тут я хочу отримати дві відповіді: чи справді встановилася очікувана версія PHP і чи залишилася конфігурація PHP-FPM та Nginx коректною.

Сам факт успішного завершення apt-get ще не означає, що сервер готовий повертати трафік без перевірки.

7. Перевірити стан служб і фонових процесів

Перевірка основних служб
systemctl is-active php8.5-fpmsystemctl is-active nginxsystemctl is-active mysqlsystemctl is-active supervisor
Перевірка процесів під керуванням Supervisor
sudo supervisorctl status

Особливо важливі довгоживучі процеси: обробники черг, WebSocket-сервери, SSR-процеси або інші служби, які були запущені до оновлення.

Якщо вони вже були коректно перезапущені пакетами або керуванням службами й працюють на новій версії PHP, додатковий безумовний перезапуск не потрібен. Але їхню фактичну версію та стан потрібно перевірити.

8. Перевірити не лише HTTP 200, а й основні функції застосунку

Базова перевірка HTTP-відповіді
curl -I https://example.com/

200 OK - хороший перший сигнал, але недостатній для завершення оновлення.

Після зміни PHP я перевіряю щонайменше:

  • підключення до бази даних;
  • вхід і авторизацію користувачів;
  • роботу черг;
  • фонові процеси;
  • завантаження файлів, якщо воно є;
  • ключові сторінки й API;
  • журнали PHP-FPM, Nginx і застосунку після оновлення.

Якщо один сервер обслуговує кілька сайтів, кожен із них потрібно перевірити окремо.

9. Оновлення PHP на Ubuntu не оновлює PHP у Docker

Перевірка версій PHP усередині контейнерів
docker ps docker exec <container_name> php -v

Це одна з найпростіших помилок під час термінового виправлення: оновити PHP на вузлі й вважати, що всі середовища вже безпечні.

Контейнер має власну файлову систему та власний образ. Якщо всередині нього залишається вразлива версія PHP, потрібно оновити базовий образ, перебудувати контейнер і знову виконати перевірки.

10. Перевірити всі інші місця, де виконується PHP

Для одного проєкту PHP може існувати в кількох незалежних місцях:

  • Production сервер;

  • Dev сервер;

  • локальне середовище;

  • Docker-контейнери;

  • образи CI;

  • окремі машини для черг або служб.

Оновлення в одному місці не є доказом, що всі інші середовища теж виправлені.

Що я не роблю під час такого термінового оновлення

  • Не обмежуюся composer update. Це не виправляє вразливість PHP.
  • Не оновлюю всю операційну систему без потреби. Для термінового виправлення краще чітко бачити межу змін.
  • Не пропускаю пробний план пакетного менеджера. Неочікуване видалення модуля краще побачити до встановлення.
  • Не вважаю резервну копію перевіреною лише через наявність файла.
  • Не завершую роботу на php -v. Потрібно перевірити FPM, служби, застосунок і контейнери.
  • Не забуваю про довгоживучі процеси. Вони можуть продовжувати працювати зі старим процесом PHP, доки не будуть коректно перезапущені.

Короткий контрольний список

Перевірка перед завершенням робіт
[ ] Версію CLI перевірено[ ] Версію PHP-FPM перевірено[ ] Установлені пакети PHP перелічено[ ] Стан пакетів постачальника перевірено[ ] Резервну копію бази створено[ ] Копію конфігурації створено[ ] Шлях відкату підготовлено[ ] План оновлення пакетів перевірено[ ] Пакети PHP оновлено[ ] Конфігурацію PHP-FPM перевірено[ ] Конфігурацію Nginx перевірено[ ] Стан служб перевірено[ ] Основні функції застосунку перевірено[ ] Журнали після оновлення перевірено[ ] Версії PHP у Docker перевірено[ ] Інші середовища PHP перевірено

Безпечне оновлення PHP - це не одна команда

Критична вразливість у самому PHP змушує оновлювати не залежності застосунку, а середовище, у якому цей застосунок виконується.

Але встановити новий пакет недостатньо. Потрібно знати, що саме було встановлено до оновлення, мати резервні копії, перевірити план змін, підтвердити нові версії та пройти основні функції застосунку після встановлення.

І найважливіше - перевірити всі місця, де реально працює PHP. Production сервер, dev сервер, Docker і локальне середовище не оновлюються один раз на всіх.

Оновлення завершене не тоді, коли пакет установився, а тоді, коли підтверджено нову версію PHP і працездатність усього застосунку.