Дыры в PHP находят всё чаще, но сайты моих клиентов в безопасности. Рассказываю, как не бояться уязвимостей
На этой неделе в PHP откопали 2 критические уязвимости. Беды оказались настолько серьёзными, что Wikimedia Foundation заблаговременно вырубила часть собственных сервисов и предупредила: Википедия может падать, пока всё не обновят. Ну, я решил проверить, правильно ли у меня настроена защита в проекте Multify, сервисе для автоматического перевода сайтов на разные языки. Расскажу, что стряслось с PHP и как функционирует фаервол, который каждый день банит у меня около 14 500 запросов от ботов.
Сначала про уязвимости. 20 октября команда PHP сообщила, что на следующий день выпустит срочный security update, и сразу дала обеим дырам оценку 9,2 из 10 по шкале CVSS. Все подробности сохраняли в секрете до релиза патча. 21 октября выкатили 8.5.12, 8.4.27, 8.3.36 и 8.2.35. Обе уязвимости, CVE-2026-109618 и CVE-2026-109619, позволяют исполнить на сервере произвольный код без авторизации. В одной из конфигураций вообще хватает одного запроса, причем атака срабатывает еще до старта кода самого сайта. Все способы запуска PHP на веб-сервере оказались уязвимы, а релизы 8.1 и ниже никаких исправлений не получат.
Их нашли исследователи из Wiz с помощью нейросетей. Сами эти ошибки оставались в PHP уже больше десяти лет, но чтобы из них собрать рабочую атаку, надо было пройти очень длинную цепочку шагов. В Wiz прямо пишут, что модели сократили этот путь. По данным европейской группы реагирования CERT-EU, уже в день выхода патча по сети распространялись первые рабочие примеры атак. А Amazon, по сведениям Help Net Security, уже 17 октября, за четыре дня до исправления, засёк попытку атаки.
А про Википедию теперь. Тут не стоит преувеличивать. Была ли отключена Википедия целиком? Да нет, целиком её никто не выключал. 21 октября Wikimedia Foundation написала, что готовится к этим уязвимостям, вики могут временами оказаться недоступны, а многие вспомогательные сервисы она намеренно отключила сама. Речь идёт о Toolforge и Cloud VPS – площадках, на которых волонтёры запускают для Википедии свои инструменты. Там каждый сам выбирает версию PHP, поэтому сотрудники фонда не способны быстро обновить всё сами и решили временно отключить сервисы, пока владельцы их не обновят. И на следующий день на странице статуса проектов Wikimedia всё ещё фигурировало, что многие инструменты сообщества временно отключены.
Почему все так торопятся? Потому что сканеры заходят на любой сайт, даже на тот, про который еще никто не знает. А когда сайт получает сертификат HTTPS, запись об этом попадает в открытые журналы Certificate Transparency, которые читают не только безопасники, но и боты. В 22-м году ученые из Университета Стоуни-Брук сгенерировали 4657 сертификатов на свежие, неизвестные никому домены. За 10 недель на них пришло 1,5 млн запросов от 31 898 адресов. Первый запрос поступал в среднем через 5,9 минуты после выпуска сертификата, а самый стремительный – через 12 секунд.
Эти боты обходят сайты. Ищут слабые места. Устаревшую админку, забытый файлик с паролями, необновлённый движок. Как только появляется новость о такой уязвимости, сразу же добавляется новый пункт в список проверок. Времени между публикацией сведений и попыткой проникновения на сайт практически нет.
Весной Multify подрос, объявились крупные клиенты – и я понял, что пора налаживать защиту от подобных ботов. Остановился на CrowdSec. Это бесплатный сетевой экран с открытым кодом. Он изучает логи сервера и вычисляет ботов по поведению. Когда кто-то запрашивает десятки несуществующих страниц подряд – это явно не человек. У CrowdSec имеется общая база плохих адресов: если бот уже засветился на чужом сервере, то у меня его могут забанить еще раньше, чем он вообще ко мне придет.
Вторая часть защиты – это WAF, Web Application Firewall. То есть фаервол для веб-приложений. В отличие от обычного сетевого экрана, который смотрит, кто к тебе подключается, WAF проверяет, что именно человек (или бот) прислал в запросе. Если запрос подозрительный, он отбрасывается. Например, бот забыл User-Agent передать, то есть не представился браузером. Или запрос сделан не тем методом, какой ожидает сайт. Подобных правил много. Наиболее известный набор правил – OWASP Core Rule Set. Его применяют многие фаерволы, в том числе и CrowdSec.
И вот есть ограничение у этого набора, сами разработчики его не скрывают. Он нормально справляется с типовыми атаками. SQL-инъекции, подключение чужих файлов, внедрение кода – всё это он отражает. Но он не подстраивается под каждую новую уязвимость. Атаки на такие уязвимости, как в PHP, он просто не видит.
А для этого есть виртуальные патчи. Настоящий патч – это правка самой программы, которую нужно скачать, проверить и выкатить на сервер. Виртуальный патч программу не трогает: это правило в фаерволе, распознающее запросы, похожие на атаку через данную уязвимость, и блокирующее их. Ну типа вахтёра, которому велели, кого именно сегодня не пускать, пока в двери не поменяют замок.
А у CrowdSec подобные правила лежат просто в общем каталоге и подтягиваются автоматически. Я посмотрел в их репозиторий на Гитхабе. Первые виртуальные патчи против обеих уязвимостей PHP там появились 21 октября в 10:13 по UTC. Сами исправленные сборки PHP вышли лишь в 13:30 того же дня. То есть правило в фаерволе оказалось готово примерно на три часа раньше, чем официальный релиз. Правда, CrowdSec назвал его предварительным и в следующие часы дважды дорабатывал.
Виртуальный патч не заменяет обновления. Команда PHP четко заявляет, что полностью защититься без обновления нельзя. Но он закрывает самые опасные часы. Пока ты читаешь новости, собираешь новую версию и тестируешь, что ничего не сломалось.
А теперь цифры. Сейчас в бан у меня летит около 14 500 запросов от ботов за сутки. У CrowdSec имеется бесплатная веб-консоль, где все происходящее видно, но базовый тариф показывает только первые 500 уведомлений в месяц. У меня этот порог исчерпывается в первые пять часов первого числа. После этого фаервол продолжает действовать как раньше, а консоль попросту умолкает.
Короче, если у вас на сайты набегают боты, пусть даже вы их не видите, посмотрите в сторону CrowdSec и обновите PHP, если не обновляли еще!
Если статья была вам интересна, подписывайтесь на мой Telegram «Код без тайн»: там я пишу о науке и технике простыми словами и чем сейчас занимаюсь.
А вопросы и споры жду в комментариях!