21 жовтня 2026 року о 14:00 UTC команда PHP опублікувала виправлення двох критичних вразливостей, CVE-2026-109618 і CVE-2026-109619, відомих як PHP2Shell. Ми почали приблизно через годину. Близько 17:00 UTC були закриті всі сервери, які ми обслуговуємо: 88 проєктів на нашій підтримці. Тут розповідаємо, як ми це зробили і що нас гальмувало, бо ті самі перешкоди стоять на багатьох серверах, які ще ніхто не оновив.
Якщо вам треба лише зрозуміти, чи зачеплено ваш сайт і що запитати в хостингу, прочитайте нашу першу статтю про PHP2Shell.
Перша година: закрити шлях атаки скрізь
Встановлення виправленого PHP на десятки серверів потребує часу. Вимкнути вразливий механізм можна за хвилини. Тому спершу ми зробили саме це, на кожному сервері, і лише потім почали щось збирати.
У бюлетені PHP session.upload_progress.enabled названо одним зі шляхів для CVE-2026-109619. Ми вимкнули його в основній конфігурації PHP для кожної версії PHP на кожному сервері й перезапустили воркери PHP. Бюлетень попереджає, що .user.ini і ini_set() не рахуються, тому ми правили файли на рівні сервера. На PHP 8.5 ми також вимкнули fatal_error_backtraces, як радить бюлетень.
Так закрився лише підтверджений шлях CVE-2026-109619 через сесії. Для CVE-2026-109618 потрібне було саме оновлення.
Три види серверів, три способи оновити
Наші 88 проєктів працюють на різних конфігураціях, і для кожної знадобився свій шлях.
Сервери з PHP із пакетів дистрибутива. Тут виправлення приходить від супровідників пакетів. Ubuntu випустила виправлені пакети в день релізу. Одна пастка для тих, хто перевіряє такий сервер: після оновлення php -v може й далі показувати старий номер, наприклад 8.3.6, бо Ubuntu виправляє пакет, а версію лишає. Перевіряйте версію пакета.
Сервери під панеллю керування хостингом. На кількох серверах стоїть aaPanel, а вона збирає власний PHP. У день релізу оновленого PHP у панелі не було. Чекати на панель означало залишити ці сервери відкритими невідомо на скільки, тому ми зібрали PHP самі.
Docker-контейнери. Частина проєктів запускає PHP у контейнерах, зібраних із готових образів. Перезбирати й наново викочувати цілий застосунок посеред інциденту ризиковано. Натомість ми оновили PHP усередині запущених контейнерів, а повноцінне перезбирання образів запланували на потім.
Зібрати PHP самим і не зламати панель
Збірка PHP у панелі відрізняється від стандартної. Якщо зібрати PHP з параметрами за замовчуванням і просто підкласти, зникнуть розширення, а панель перестане впізнавати власний PHP.
Ми написали один скрипт збірки й запускали його для кожної версії PHP на кожному сервері з панеллю:
- він читає точні параметри configure з уже встановленого PHP, щоб нова збірка мала ті самі розширення й шляхи;
- збирає виправлену версію з офіційних вихідників;
- перевіряє, з якими бібліотеками OpenSSL і curl злінковано новий бінарник. Панель лінкує деякі версії PHP зі своїми старішими копіями цих бібліотек, і скрипт стежить, щоб нова збірка використовувала ті самі;
- зберігає копію старих бінарників, ставить нові й перезапускає PHP;
- якщо PHP не піднявся, сам повертає старі бінарники.
Зі скриптом ми оновлювали одну версію PHP на одному сервері, перевіряли сайти й повторювали на наступному, без ручної роботи щоразу.
PHP 7.4, 8.0 і 8.1: офіційного релізу немає
Команда PHP більше не випускає релізи цих гілок. Для PHP2Shell вона опублікувала лише зміни вихідного коду для 7.4, 8.0 і 8.1. Частина наших проєктів досі працює на цих версіях.
Для них ми наклали виправлення команди PHP на останній реліз кожної гілки й зібрали тим самим скриптом. Опубліковані зміни зачіпають ще файли версій і журнали змін, які на реліз чисто не накладаються, тому ми взяли лише зміни коду.
На одному сервері працював PHP 7.4 з пакетів Ubuntu 20.04. Для цього випуску Ubuntu виправлення приходить лише через розширену підтримку безпеки Ubuntu (ESM), а на тому сервері її немає. Ми зібрали PHP 7.4 з тими самими прапорцями збірки, що використовує Ubuntu, і замінили лише бінарник PHP-FPM, залишивши оригінал поруч. Наступне оновлення пакета перезапише нашу збірку, і ми зазначили це в записах щодо проєкту.
Контейнери: оновили зараз, перезберемо пізніше
Для кожного контейнера ми збирали виправлений PHP у чистій копії офіційного образу на тій самій операційній системі, а потім копіювали в запущений контейнер лише бінарники PHP і потрібні йому розширення, зберігши всередині копію оригіналів.
Одному образу на Alpine знадобилися ті самі додаткові патчі вихідників, що застосовує офіційний Docker-образ PHP, інакше збірка падала на новішому компіляторі.
Підступ цього підходу: виправлення живе лише доти, доки хтось не перестворить контейнер зі старого образу. Якщо ваша команда оновлювала контейнери так само, поставте перезбирання образів у план, інакше вразливість повернеться з наступним деплоєм.
Після оновлення: логи
Коли на всіх серверах запрацював виправлений PHP, ми переглянули логи вебсервера й PHP на всіх серверах, шукаючи запити, схожі на те, як можна використати ці вразливості. Ознак експлуатації не знайшли.
Що ми сказали б власнику сайту після того вечора
- Швидкість вашого хостингу і є ваша швидкість. Якщо PHP у вас із панелі або від провайдера, який на неї чекає, сайт лишається відкритим, доки вони не зроблять своє. Запитайте в них сьогодні, яка у вас версія.
- Старий PHP досі обходиться дорого. PHP 8.1 і старіші цього разу отримали виправлення лише у вихідному коді. Наступного разу може не бути й їх. Підтримка PHP 8.2 закінчується 31 грудня 2026 року.
- Контейнери й власні збірки мають мати власника. Самі вони не оновлюються. Хтось має знати, що вони є і як їх перезібрати.
Наш автоматичний моніторинг працює цілодобово, а інженери реагують, коли він фіксує інцидент.
Якщо вам потрібно те саме на ваших серверах
Перевіримо версію PHP і оновимо її протягом одного робочого дня. Напишіть нам.
Для постійної підтримки дивіться підтримку серверів, підтримку сайтів і DevOps. Якщо ваш мобільний застосунок працює з бекендом на PHP, цьому бекенду потрібне те саме оновлення; це ми закриваємо в межах підтримки мобільних застосунків. Щоб дізнатися, чи не відкрито ще щось, замовте тест на проникнення.
Джерела
- Оголошення команди PHP і тимчасові заходи: https://www.php.net/archive/2026.php
- Бюлетені безпеки: https://github.com/php/php-src/security/advisories/GHSA-w8hw-w9fx-j79w і https://github.com/php/php-src/security/advisories/GHSA-6wmf-4rv5-p3rp
- Ubuntu: https://ubuntu.com/blog/php2shell-vulnerability-fixes-available