AI-агенты вскрыли PHP и TLS: уроки Black October 2026

AI-агенты вскрыли PHP и TLS: уроки Black October 2026

За одну неделю октября 2026 года интернет узнал три вещи одновременно: язык, на котором работает значительная часть сайтов, уязвим способом, известным с 2020 года; удостоверяющий центр хранил приватный ключ, значение которого умещалось в одну цифру; а популярная библиотека для подключения приложений к языковым моделям раздала чужие секреты прямо в релизе. Каждое событие по отдельности тянет на неделю новостей. Вместе они складываются в один сдвиг: находить ошибки стало дёшево, а платить за найденное всё чаще приходится украденными API-ключами.

Black October (в англоязычной среде также Blocktober) это неформальное название недели 19–25 октября 2026 года, когда совпали три инцидента: критические уязвимости PHP, компрометация промежуточных сертификатов eMudhra и supply-chain атака на LiteLLM. Общее у них то, что искали эти дыры AI-агенты, а самым ценным трофеем оказались ключи доступа к моделям.

Что случилось: три события, одна причина

21 октября PHP выпустил внеплановый security release с исправлением двух критических уязвимостей, CVE-2026-109618 и CVE-2026-109619. Обе дают удалённое выполнение кода и затрагивают все версии начиная с 5.4.0. В конфигурации с Apache mod_php атакующий получает выполнение кода перед кодом самого приложения, то есть захватывает платформу целиком, ещё до того как сайт начал обрабатывать запрос. Вторая уязвимость бьёт по PHP-FPM.

Уязвимость получила имя PHP2Shell. Её нашли исследователи Calif вместе с OpenAI и Wiz в рамках инициативы Patch the Planet, к работе подключили PHP Foundation. Событие освещали Wall Street Journal и New York Times, а британские и европейские регуляторы рекомендовали организациям изолировать или временно отключить системы, которые не удаётся быстро обновить. Когда государство советует прервать работу бизнеса, потому что под приложением небезопасный слой, это уже не рядовой патч.

В тот же день Cisco Talos опубликовала advisory по eMudhra: восемь промежуточных сертификатов индийского удостоверяющего центра имели тривиально восстановимые приватные ключи. А 21 октября вышел релиз LiteLLM v1.107.0, внутри которого обнаружили вредоносный код, собиравший пароли и секреты.

PHP2Shell: баг, который нашли дважды и дважды отложили

История начинается не в 2026 году. В 2020 году в трекер PHP пришёл баг #78876: длинные переменные вызывали out-of-memory, а временные файлы не удалялись. Тогда отчёт никто не счёл важным. В 2024 году аудит OSTIF и Quarkslab переоткрыл ту же проблему с OOM, но доказать эксплуатацию не удалось, и баг снова оставили без фикса.

Дальше сработала арифметика. 30 июля 2026 года OpenAI пригласила Calif в Patch the Planet и предложила PHP как цель с максимальным охватом. Аудит начался 1 августа. Исследователи не ожидали найти ничего критичного: цель уже прошли множество лабораторий с AI-ассистентами. Но через несколько дней после старта, задав правильные вопросы вокруг старых находок Штефана Эссера, они получили первый OOM-fatal и первую из трёх точек прерывания, из которых сложился RCE против WordPress. Первая уязвимость редко бывает лучшей, поэтому поиск продолжили и нашли ещё две, уже с надёжной эксплуатацией mod_php и PHP-FPM.

Показательна не сложность бага, а то, что он пролежал шесть лет в проектах, которые проходит каждый сканер. Проблема была известна, описана и даже переоткрыта аудитом. Не хватило не информации, а ресурса на решение.

eMudhra: приватный ключ, который был числом 4

17 октября выяснилось, что восемь промежуточных сертификатов eMudhra, выстроенных к корню emSign ECC Root CA G3, имеют приватные ключи, которые восстанавливаются за доли секунды. По формулировке Talos, вместо обязательных 384 бит псевдослучайной стойкости приватные ключи представляли собой одно- и двузначные целые числа. Энтропия упала с 384 бит до 3–8 бит.

Один из ключей, который должен был быть сотнями цифр длиной, оказался числом 4. Исследователь Скотт Хелм восстановил ключи меньше чем за секунду, а по его словам, для этого хватило одного промпта в Claude.

Причина оказалась бытовой. 30 апреля 2025 года eMudhra проводила церемонию генерации ключей для 24 подчинённых удостоверяющих центров. Ошибка в процедуре обёртки ключей (wrap/unwrap) создала второй набор слабых ключей P-384, и именно его по ошибке использовали для восьми промежуточных сертификатов. То есть ключи были сломаны 18 месяцев, и всё это время любой, кто догадался их проверить, мог выдавать себя за любой сайт.

Дальше включается каскад доверия. eMudhra была корневым удостоверяющим центром, её сертификаты принимались автоматически, поэтому одна ошибка в процедуре разошлась по всему интернету. Mozilla и Chrome отозвали доверие к корню G3. Go выпустил CVE-2026-111943 в версиях 1.27.3 и 1.26.10: стандартная библиотека crypto/x509 теперь отфильтровывает цепочки с хешами этих сертификатов, чтобы закрыть проблему в Docker, Kubernetes, Terraform и Prometheus. Microsoft заблокировала два сертификата, использовавшихся для подписи кода. Сама eMudhra оценивает, что перенести придётся около 30 тысяч сертификатов.

Отдельный сюжет в том, как на это отреагировали. 19 октября eMudhra отозвала 9 356 сертификатов в своей незатронутой RSA-иерархии с причиной "Superseded", и к 24 октября 811 индийских государственных доменов продолжали отдавать уже отозванные сертификаты, включая сайты четырёх структур под эгидой MeitY: STPI, Bhashini, UIDAI и контролёра сертифицирующих органов, который как раз регулирует бизнес eMudhra. MeitY назвала сообщения об инциденте нагнетанием страха, но разбор показал, что неверны оба утверждения: и про короткий интервал (ключи были слабыми 18 месяцев), и про ограниченный эффект (отзыв корня G3 задел десятки тысяч сертификатов). Firefox с CRLite такие сайты не открывает, а Chrome с CRLSet 10856 их спокойно грузит.

LiteLLM: релиз, который украл ключи

Третья история ближе всего к разработчикам. LiteLLM это популярный слой, который соединяет приложение с разными провайдерами моделей и держит их ключи. 21 октября в релизе v1.107.0 обнаружили учётные данные-крадущий код. Компания уже проходила через компрометацию в марте, так что это повторный инцидент за год.

Самое важное в их собственном разборе: официальный тег в репозитории был чистым, а распространённый пакет содержал вредоносные файлы. Отсюда практический вывод, который ломает привычную процедуру реагирования. Если вы открыли исходники и увидели чистый код, вы не установили, что именно исполнилось на вашей машине.

Дальше разворачивается сценарий, который стоит прогнать у себя мысленно. Приложение ходит через AI-шлюз, шлюз держит ключи провайдеров, сборка и деплой идут автоматическими задачами, и тот же шлюз используют ещё несколько сервисов. Приходит уведомление. Вы смотрите репозиторий, там чисто. Смотрите работающий шлюз, его уже обновили. Хочется сказать, что проблема закрыта. Но вредоносный релиз успел выполниться в build job, который завершился несколько часов назад. Остановить нечего, процесса нет, продакшен чист. При этом у identity этого build job было право читать продовые ключи провайдеров. Значит, расследовать нужно не то, что работает сейчас, а то, к чему мог получить доступ уже завершившийся процесс.

Отдельно про последствия. Основатель небольшого AI-стартапа Post 21 октября на несколько часов отключил сервис для клиентов, получив предупреждения о компрометации ключей Anthropic и Stripe. Он не был взломан напрямую, его среду скомпрометировали через зависимость, и он всё равно оказался в эпицентре. Остановка сервиса в такой ситуации это ответственное решение: вы возвращаете себе контроль, документируете произошедшее и не заставляете клиентов догадываться.

Есть и совсем неожиданный вектор. LiteLLM сообщил о случаях, когда Claude Code помещал GitHub-учётные данные пользователя в ответ, который мог попасть в логи, и предполагает, что атакующие достали секреты из внутренних логов деплоя. Плюс истории про сайты, которые требуют от агентов объявлять себя и получают модификацию URL, куда агент зашивает почту пользователя. На прямой вопрос, где он раскрыл персональные данные через URL, агент нашёл около десяти утечек за пару недель.

Почему API-ключ стал деньгами

Раньше утечка ключа была инцидентом про данные. Теперь это инцидент про деньги. Ключ к API модели даёт право попросить провайдера выполнить работу и выставить счёт вам. Если ключ украли, вычислительные мощности оплачиваете вы: украденный ключ можно использовать самому, а можно перепродать, и счёт всё равно придёт владельцу.

Токены начинают вести себя как наличные, и на этой неделе многие узнали, что это значит на практике. Отсюда меняется и профиль атак. Раньше серьёзная кампания требовала много людей, потому что люди устают, едят и спят. Теперь стоимость атаки привязана к вычислениям, а не к найму. Жертвой может оказаться не крупная корпорация, а любой, кто держит ключи, потому что атаку проводит не армия, а один человек с парком агентов.

Нападение и защита делают одно и то же

Полезно посмотреть, что именно делает агент, когда "взламывает" систему. Он читает незнакомый код, замечает подозрительное место, пишет тест, запускает, обнаруживает, что первое объяснение неверно, и пробует снова. Ровно те же действия совершает защитник. Это не совпадение, а причина, по которой часть предохранителей, задуманных против кибернападений, бьёт по защитникам и заставляет их в момент инцидента переключаться на другие модели.

Практический вывод звучит контринтуитивно. Не нужно брать модель послабее, чтобы она случайно не навредила. Нужна самая сильная модель на вашей стороне, потому что у противоположной стороны будет самая сильная из доступных.

Проверить модель можно и самому, без вендорских бенчмарков. Дайте кандидатам одинаковые улики и инструменты в безопасной репродукции инцидента, где правильный ответ вам уже известен, и держите сам ответ вне инструкции. Смотрите, останавливается ли модель на чистом репозитории или раскапывает запись сборки и связывает identity сборки с ключами. Собственно способность докопаться и есть то, за что вы платите.

Почему патчей недостаточно

С PHP получилась неприятная иллюстрация. Мейнтейнеры видели признаки проблемы ещё в 2024 году, но фикс требует работы с совместимостью, а экспертного времени мало, поэтому нужно выбрать, какой компромисс принять. Работа останавливалась, возобновлялась и не была закончена. Раньше у проекта было два года на такой разговор о компромиссах. Теперь этого времени нет.

Масштаб тоже меняется. Anthropic по итогам шести месяцев сканирования важных open-source проектов сообщила о более 29 тысячах потенциальных уязвимостей, из которых около 6 тысяч уже проверены вручную. В работе по 25 проектам нашли почти 500 мест, где можно сократить экспонируемый код и опасные комбинации конфигураций. Один из результатов виден в OpenSSH 10.6: удалили сложный код обработки подписей, до которого мог добраться неаутентифицированный клиент.

Отсюда главный тезис: ускорять патчинг необходимо, но этого мало. Нужно уменьшать площадь атаки до того, как ошибку найдут. Меньше кода доступно снаружи, меньше связанных конфигураций, которые вместе ломают проверку, меньше шансов собрать рабочую цепочку эксплуатации. Именно связанные конфигурации и стали сутью PHP2Shell: каждая по отдельности выглядела разумно.

Что сделать на этой неделе

Первое: обновить браузер, телефон, операционную систему и приложения, доведя установку до конца с перезагрузкой. При новостях о взломе полезно отдельно попросить Claude или Codex проверить, не осталось ли необновлённых сервисов, которые вы используете.

Второе: открыть настройки подключённых приложений в важных аккаунтах, начав с почты и файлов. Посмотреть, что именно разрешено каждому подключению: только профиль, чтение файлов или их изменение. Лишнее отозвать. Это скучная гигиена, но она сокращает поверхность атаки, из-за которой слабое звено в цепочке зависимостей добирается до ваших документов.

Третье: разобрать расширения браузера. Удалить те, которыми не пользуетесь, а у оставшихся ограничить список доступных сайтов, если браузер это поддерживает. Сплошные разрешения на всё подряд это подарок.

Четвёртое: менеджер паролей с уникальным паролем на каждый аккаунт и многофакторная аутентификация везде, где её можно включить. В семье имеет смысл договориться о кодовой фразе, чтобы не попасться на голосовой дипфейк.

Пятое: если пришло уведомление об утечке, прочитать, что именно раскрыто, и действовать сразу. Сменить скомпрометированные пароли, отозвать затронутые подключения приложений, разработчикам провернуть API-секреты. Ответ "мы обновили софт, всё в порядке" доверия не заслуживает, и требовать от сервисов ясности про то, что известно, что неизвестно и прекращён ли доступ, вполне нормально.

Часто задаваемые вопросы

Что такое PHP2Shell?

PHP2Shell это две критические уязвимости PHP, CVE-2026-109618 и CVE-2026-109619, исправленные 21 октября 2026 года. Они позволяют выполнить произвольный код удалённо в конфигурациях с mod_php и PHP-FPM, затрагивая все версии начиная с 5.4.0. Нашли их исследователи Calif совместно с OpenAI и Wiz в рамках инициативы Patch the Planet.

Может ли AI-агент украсть мой API-ключ?

Да, и самый вероятный путь не взлом модели, а компрометация зависимости. В случае LiteLLM вредоносный код попал в распространённый пакет v1.107.0, хотя тег в репозитории оставался чистым, а build job имел доступ к продовым ключам. Проверяйте, что реально исполнилось в вашей среде, и проворачивайте секреты при любом подозрении.

Почему история с eMudhra опаснее обычной утечки?

Потому что пострадала не база данных, а цепочка доверия. Восемь промежуточных сертификатов с приватными ключами в 3–8 бит энтропии позволяли выдавать себя за любой сайт: ключи генерировались в апреле 2025 года, то есть были сломаны 18 месяцев. Из-за статуса корневого центра ошибка разошлась по всему интернету, а отзыв затронул десятки тысяч сертификатов.

Итог

Black October показал асимметрию, к которой стоит привыкнуть. Поиск уязвимостей подешевел настолько, что стал фоновым процессом, а вместе с ним подешевела и атака. Защита при этом упирается не в отсутствие информации, а в скорость решений: PHP-баг был известен шесть лет, ключи eMudhra были слабыми полтора года, а ответом всё равно становится аврал.

Самое практичное, что можно сделать прямо сейчас и без бюджета, это сократить то, до чего может дотянуться чужой код и чужой агент. Начните с одного действия: откройте настройки подключённых приложений в своей почте и отзовите всё, чем вы не пользуетесь последние полгода. Через десять минут у вас станет на несколько путей атаки меньше.

← Все записи