
21 октября за один день вышли исправления сразу для нескольких критических уязвимостей в программах, на которых держится веб. Две дыры в самом PHP позволяют без авторизации выполнить код на сервере. В GitLab закрыли уязвимость с оценкой 10.0 из 10. В Node.js исправили ошибку в распаковщике Brotli, которая тоже может привести к выполнению кода. Исследователь Флориан Рот собрал находки недели в одном посте и спросил, не видим ли мы уже эффект AI, который научился читать огромные кодовые базы. Как минимум часть этих находок сделана с помощью AI.
Старых багов в коде меньше не стало, но находить их и превращать в рабочие эксплойты стало дешевле. Поэтому исправления безопасности, скорее всего, будут выходить чаще, а ставить их придётся быстрее, чем раньше.
PHP 8.5.12, 8.4.27, 8.3.36 и 8.2.35 закрывают CVE-2026-109618 и CVE-2026-109619, обе с оценкой 9.2 по CVSS 4.0. Первая связана с обработкой нехватки памяти: PHP прерывает запрос, пока внутренние данные заполнены наполовину, и при очистке принимает их за корректные. Во второй состояние одного запроса переживает освобождение памяти и достаётся следующему запросу того же воркера. Под угрозой все установки, которые обслуживают веб-запросы: PHP-FPM, Apache с mod_php, php-cgi, FrankenPHP, LiteSpeed. Для mod_php показан эксплойт, который срабатывает раньше, чем запускается код приложения. PHP 8.1 и более старые версии проект больше не поддерживает, хотя для 7.4, 8.0 и 8.1 команда выпустила минимальные патчи. По данным Wiz, хотя бы одна из уязвимостей есть во всех версиях начиная с 5.4.
GitLab закрыл CVE-2026-110264 с оценкой 10.0 по CVSS 3.1. Специально составленное регулярное выражение вызывает переполнение целого числа при компиляции и позволяет неавторизованному пользователю выполнить код на сервере. Уязвимы все версии начиная с 7.0, исправления вышли в 19.5.1, 19.4.3, 19.3.6, 19.2.9, 19.1.9, 19.0.10 и 18.11.13. Корень проблемы в движке регулярных выражений Ruby, и Ruby выпустил 4.0.9, 3.4.12 и 3.3.13. Ruby уточняет, что задеты только приложения, которые компилируют регулярные выражения из строки, пришедшей от пользователя.
Node.js 22.23.4, 24.22.1 и 26.12.1 закрывают CVE-2026-111497 с уровнем high. Встроенный распаковщик Brotli на испорченных данных писал за пределы восьмибайтного буфера. Если приложение распаковывает через node:zlib данные от атакующего, это может закончиться падением, утечкой памяти процесса или выполнением кода.
В той же волне NLnet Labs закрыла CVE-2026-97206 в DNS-резолвере Unbound. Use-after-free в реализации DNS-over-QUIC позволяет удалённо уронить многопоточный резолвер, уязвимы версии с 1.22.0 по 1.26.1. А история с удостоверяющим центром eMudhra к AI отношения не имеет: по данным Google, закрытые ключи его промежуточных сертификатов сгенерировали с недостаточной случайностью, и браузеры перестали им доверять.
В PHP AI участвовал напрямую. По данным OpenAI, компания Calif нашла критическую уязвимость с помощью GPT‑5.6 Sol по программе Patch the Planet, а Wiz независимо нашла обе и сообщила о них. Wiz пишет, что работала с Wiz Atlas, Gemini 4 Argon и GPT‑5.6 Sol, нашла первую уязвимость 19 августа и сообщила о ней PHP 24 августа. В бюллетенях PHP указаны четыре независимых репортёра. Brotli в Node.js нашла команда OpenAI Codex Security. Про GitLab такого не сказано: уязвимость сообщил исследователь joaxcar через программу bug bounty на HackerOne.
Код PHP открыт и десятилетиями на виду, но внимательно прочитать каждый путь обработки ошибок в огромном проекте на C людям не хватает времени. Агенту для этого нужны только вычислительные мощности. Wiz добавляет второй довод: сами ошибки были видны давно, но превратить их в эксплойт мешала сложность. Надо было собрать цепочку из нескольких багов и подогнать её под раскладку памяти конкретной версии. По оценке Wiz, с фронтирными моделями один исследователь сделал за неделю то, на что раньше ушли бы месяцы работы сильной команды.
Третья причина видна на Brotli. По словам OpenAI, исходную ошибку в Brotli исправили ещё в феврале, но никто не понял, что это дыра в безопасности, а нового релиза библиотеки не выходило. Brotli встроен в Node.js, Bun, Envoy и Istio, так что ждать исправления пришлось всем, кто его использует.
Окно между раскрытием и атаками сжалось до часов. Глава Cloudflare Мэтью Принс приводит цифры: за 10 часов до объявления сеть Cloudflare видела тысячи попыток эксплуатации PHP, через 45 минут после объявления десятки тысяч, через два часа сотни тысяч, а меньше чем через 12 часов уже миллионы. Ещё в сентябре он предсказывал, что ближайшие пару лет уязвимости масштаба Log4j будут появляться почти каждую неделю, а в дальнейшем софт станет гораздо безопаснее. OpenAI пишет, что подобных находок в ближайшие месяцы станет резко больше.
До публикации у защитников есть время на подготовку. Сейчас крупные находки раскрывают координированно: мейнтейнеры, хостинги и CDN заранее готовят патчи и правила WAF. Cloudflare, например, развернула защиту от уязвимостей PHP примерно за 9 часов до публикации. OpenAI предлагает для таких случаев общий порядок действий и среди открытых вопросов обсуждает, стоит ли в будущем постоянно сканировать интернет на известные уязвимости и уведомлять владельцев или даже патчить системы за них. Пока это вопрос для обсуждения, а не план.
Первое: знайте, что у вас запущено. Принс советует проверить, не стоит ли PHP на сервере по умолчанию, даже если ваш сайт на нём не написан, и удалить его, если он не нужен. Версии проверяются так:
php -v
node -v
ruby -vСравните ответ с исправленными версиями из бюллетеня. Проверять нужно там, где код работает: на сервере, в контейнере, в CI, а не на ноутбуке.
Второе: сделайте обновления привычкой. Подпишитесь на бюллетени безопасности своих рантаймов и фреймворков, включите Dependabot или Renovate. После обновления пересоберите контейнеры и перезапустите все сервисы, воркеры и фоновые задачи, иначе в памяти останется старая версия. Patch the Planet в инструкции по Brotli отдельно напоминает сверить версию запущенного бинарника или образа.
Третье: следите за зависимостями зависимостей. Brotli сидел внутри Node.js и Bun, движок регулярных выражений внутри Ruby, а Ruby внутри GitLab. Меньше зависимостей значит меньше чужого кода, за которым надо следить. Лок-файл в репозитории позволяет точно знать, что у вас собрано.
Четвёртое: не компилируйте регулярные выражения из пользовательского ввода и не распаковывайте недоверенные данные без нужды. Обе уязвимости срабатывают только тогда, когда атакующий управляет входными данными.
Пятое: попросите агента проверить ваш код. Те же модели, которые находят баги в PHP, проверят и ваш бэкенд. Дайте агенту конкретное задание: найти все точки, куда приходят данные извне, проследить, где они обрабатываются, и проверить авторизацию на каждом эндпоинте. Каждую находку проверяйте сами или отдельным агентом, потому что модели по-прежнему дают ложные срабатывания.
Шестое: не паникуйте, а расставьте приоритеты. Сначала то, что смотрит в интернет и обрабатывает чужие запросы, потом внутренние сервисы. WAF и временные настройки дают отсрочку, но в бюллетенях PHP прямо сказано, что полностью защищает только обновление.
Как работать с AI-агентами так, чтобы код оставался проверяемым, с тестами, ревью и аккуратными зависимостями, разбираем на курсе «Вайбкодинг».


