Статьи ·

Сайты выключают сами: что ИИ-агенты сделали с интернетом за один месяц

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

Светящийся слон PHP
Светящийся слон PHP. Фото: Calif.

21 октября Нидерланды отключили DigiD, национальную систему входа в госуслуги, и портал MijnOverheid. Вслед за ними погасли сайт порта Роттердама, футбольная ассоциация KNVB, сайты пяти крупнейших партий страны и многих больниц. В тот же день госсайты отключили Бельгия, Финляндия, Франция и Германия. Администраторы ждали патча к одному из самых распространенных языков интернета.

Масштаб объясняет, почему отключение стало новостью само по себе. По данным сервиса статистики, PHP используют 69.3% всех сайтов, чей серверный язык известен. Эти цифры приводит сервис W3Techs. Это язык WordPress, Drupal и MediaWiki, на которой работает Википедия. Дыра в его ядре бьет не по одному приложению, а по всему, что на нем стоит.

Что сломалось в PHP

Уязвимости назвали PHP2Shell и сгруппировали в два CVE: CVE-2026-109618 и CVE-2026-109619. Оценка серьезности доходит до CVSS 9.2. В день релиза PHP Foundation выпустила версии 8.5.12, 8.4.27, 8.3.36 и 8.2.35. Обе дыры сидят в местах, которые трогает почти каждый запрос, управлении памятью и обработке ошибок. Если запрос упирался в лимит памяти ровно в неподходящий момент, PHP мог оставить полуинициализированные внутренние данные и позже принять их за валидные. На Apache с mod_php неаутентифицированный запрос мог сработать до выполнения кода приложения, а на PHP-FPM через пути уровня приложения.

Масштаб заражения стал ясен за сутки. По данным Censys, из 2.58 млн интернет-хостов, замеченных 21 октября, примерно 1.58 млн сообщали идентифицируемую версию PHP, а примерно 1.57 млн не были пропатчены. VulnCheck насчитал более 2.6 млн хостов с PHP, из них больше 700,000 на версиях PHP 3.x-7.3, которые давно не поддерживаются. К 22 октября Censys отслеживал уже почти 3 млн хостов с PHP.

Как утечка сорвала релиз

Координированное раскрытие сорвалось за два дня до релиза. Первую попытку эксплуатации Amazon зафиксировал еще 17 октября, за четыре дня до выхода патча, из коммерческой анонимизирующей сети. 20 октября около 15:00 UTC идентификаторы двух CVE разошлись по форумам и соцсетям с неверным временем релиза и неверной оценкой 10.0 при настоящей 9.2. Технических деталей не утекло, но PHP Foundation сдвинула предобъявление на 19:30 UTC того же дня и перенесла релиз с 22 октября на 21 октября.

Около 20:00 UTC того же дня Calif по ошибке опубликовала видео с работающим proof of concept против нескольких целей. Копии удаленного видео разошлись по соцсетям и ускорили появление эксплойтов. Около 23:00 UTC мог утечь и совет по mitigation для критической инфраструктуры. Утром 21 октября, более чем за шесть часов до скоординированного релиза, Chainguard в одностороннем порядке нарушила эмбарго и опубликовала собранные образы с исправлением. Теперь любой атакующий мог изучить патч в бинарном виде, пока остальные пользователи PHP еще ждали релиза. По данным Cloudflare, за 10 часов до объявления сеть видела тысячи попыток эксплуатации, за 45 минут после объявления десятки тысяч, за 2 часа сотни тысяч, а к четвергу миллионы.

Массовая эксплуатация началась почти сразу после патчей, но с оговоркой. WatchTowr фиксировала широкие попытки эксплуатации вскоре после релиза, при этом ни один из циркулирующих proof of concept не достигал удаленного выполнения кода: они либо не работали вовсе, либо проверяли временные различия, либо роняли цель. Агентство CISA призвало организации немедленно обновиться до версий 8.5.12, 8.4.27, 8.3.36 или 8.2.35.

Ошибка, которую находили трижды

Комикс Calif о PHP

Уязвимости PHP2Shell не появились из ниоткуда. Их корни уходят в 2004 год, когда Стефан Эссер нашел первую уязвимость PHP, связанную с лимитом памяти. Эссер счел ее настолько серьезной, что не стал публиковать эксплойт. В 2020 году исследователь сообщил о баге номер 78876: длинные переменные могли вызвать нехватку памяти, а временные файлы при этом не чистились. Тогда отчету не придали значения. В 2024 году аудит OSTIF и Quarkslab переоткрыл ту же проблему нехватки памяти, но эксплуатация доказана не была, и баг не исправили. Пока чинили один из отчетов Quarkslab, разработчик ядра PHP, работавший по контракту с PHP Foundation, заметил первые признаки проблемы нехватки памяти, стоящей за CVE-2026-109618.

Исправить проблему оказалось труднее, чем найти. У команды безопасности PHP было несколько конкурирующих подходов, и каждый нес свои компромиссы: ломка обратной совместимости, новый потенциал отказа в обслуживании или изменения во множестве сторонних расширений, которые казалось невозможным скоординировать. Команда работала на консенсусе, боялась выпустить неверное решение, а людей с глубоким знанием движка не хватало. Работа над исправлением буксовала и перезапускалась месяцами. Фонд называет задержку структурным провалом, вызванным и процессом принятия решений, и нехваткой ресурсов.

Перелом случился летом. 30 июля 2026 года Calif начала аудит PHP в программе OpenAI Patch the Planet. 11 августа исследователь Райан А из Calif сообщил о безусловном удаленном выполнении кода с той же первопричиной, что и проблема 2024 года. OpenAI независимо сообщила о той же первопричине, затем о новых векторах 18 сентября, а Wiz о своих находках 24 августа. С 11 августа исправление стало главным приоритетом всех, кто в PHP Foundation занимался безопасностью. С 1 июля команда безопасности опубликовала 15 CVE и разобрала более 100 отчетов, оказавшихся неверными, дублирующими или невоспроизводимыми. ИИ помогает команде проверять отчеты и группировать отчеты с общей первопричиной, но каждое решение принимает человек, а каждый патч пишет человек.

Почему это нашёл именно ИИ

Calif работала с моделью как с напарником по аудиту. Первым шагом было понять, можно ли превысить лимит памяти контролируемым фатальным сбоем. Модель помогла обойти барьер меньшего лимита размера POST и найти способ исчерпать лимит памяти multipart-запросом, который оставался ниже лимита размера POST. Затем команда попросила своего audit buddy пройтись по поведению аллокатора ZendMM, отчетности о фатальных ошибках и завершению запроса в поисках мест, уязвимых к неожиданным прерываниям. Агент заметил порядок в функции добавления в хеш-таблицу: счетчик увеличивался до полной инициализации новой корзины, и при фатальном сбое корзина оставалась видимой для teardown. Обобщив паттерн в навык, команда нашла еще одну находку в механизме session upload-progress. Подтвержденное pre-auth RCE получили на WordPress 7.1.2, Drupal 11.4.3 и Joomla 6.1.4.

Wiz шла параллельным путем и пришла к тем же выводам независимо. В исследовании использовались Wiz Atlas, Gemini 4 Argon и GPT-5.6 Sol. Gemini 4 Argon внесла, по словам Wiz, неоценимый вклад в поиск уязвимости, разработку эксплойта, детекцию атак и проверку патча. Затронуты все версии PHP за последнее десятилетие, вплоть до 5.4. Wiz продемонстрировала pre-auth RCE на WordPress, Drupal и Joomla на свежих образах контейнеров на момент теста, а также раскрытие памяти без RCE. Итог Wiz формулирует одной строкой: один исследователь за неделю сделал то, на что раньше у команды мирового класса ушли бы месяцы работы.

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

Восемь бит доверия

Пока инженеры латали PHP, рядом разворачивалась вторая история про доверие, и в ней тоже замешан ИИ. Один из приватных ключей удостоверяющего центра eMudhra оказался числом 4. Не числом, начинающимся с 4, а просто 4. Другой оказался 56, еще один 115. Исследователь Скотт Хелм восстановил все ключи из публичных сертификатов на своем ноутбуке менее чем за секунду. Ключи на кривой P-384 должны быть случайными 384-битными числами. У eMudhra это выглядело иначе: 47 байтов нулей и один байт. Один байт дает 256 возможных значений, так что перебор занимает максимум 255 шагов.

17 октября исследователь сообщил Apple, Google, Microsoft, Mozilla и eMudhra, что приватные ключи восьми промежуточных сертификатов eMudhra скомпрометированы. Chrome в тот же вечер заблокировал их через CRLSet, а Mozilla через несколько часов через OneCRL в Firefox. 20 октября Mozilla объявила об этом публично и выпустила обновление NSS с удалением корня eMudhra, а Chrome подтвердил включение корня в Chrome Root Store v43. Восемь промежуточных это шесть TLS и два code-signing центра, все созданы в апреле 2025 года и кросс-подписаны корнем Sectigo AAA Certificate Services в мае 2025 года. Ключ фактически был публичным со дня существования сертификата: окно в 17 месяцев, и узнать, пользовался ли им кто-то, невозможно.

Браузерам это почти не угрожает: Chrome и Firefox блокируют промежуточные напрямую и требуют Certificate Transparency, а Safari тоже требует CT. Но большая часть небраузерных TLS-клиентов с настройками по умолчанию доверяет набору CA на диске, не проверяет отзыв и не проверяет CT. Поэтому отзыв eMudhra и Sectigo им не помогает. Хелм проверил на своих машинах: поддельный сертификат для api.stripe.com приняли curl, Python и Node на всех проверенных Linux и macOS. Устройства без обновлений будут доверять этим сертификатам до истечения, то есть до июля 2039 года. Сам Хелм подтверждает: простой промпт в AI-агенте позволил ему восстановить приватные ключи, а Claude восстановил их одним промптом.

Ключи, которые искали

Атакующие той недели охотились не за сайтами, а за ключами. 20 октября в 19:53 UTC Railway узнала о длительной и целенаправленной кампании против своих сервисов. Целью, по данным компании, было получить AI provider API keys для distillation attacks. Атака, по оценке Railway, шла с 20 октября 13:58 UTC по 22 октября 03:32 UTC, когда компания подтвердила, что у атакующего больше нет доступа к внутренним системам. Пострадать могли не все: максимум 1.85% всех workspaces, численно около 100,000 workspaces, имели потенциально скомпрометированные переменные окружения. При этом число пользователей, затронутых сбросами ключей провайдерами, оказалось больше 100 тыс., потому что некоторым вендорам передали все ключи платформы. Доступа к аккаунтам пользователей не зафиксировано, а доступ к исходному коду пользователей до финального отчета не исключен.

Работающие сервисы оставались онлайн, а сборки и деплои приостанавливались. Компания переворотила все ключи дважды, переворотила credentials всех storage buckets и ускорила перевод build-системы с multi-tenant третьего поколения на single-tenant четвертое поколение. Внутренний tooling перестроили из валидированного исходника, а расследовать инцидент привлекли внешнюю forensics-компанию.

Ту же добычу искали и в OpenCode. Компания сообщила примерно 1.4% пользователей Console, что ключи, которые они хранили для внешних провайдеров моделей, оказались раскрыты в результате взлома. Часть пользователей проснулась с несанкционированными списаниями более 1,700 долларов за ночь, а Google приостановила несколько проектов, пометив активность как злоупотребление. Сама компания называет атаку distillation attack: украденным ключом можно прогнать огромный объем промптов через frontier-модель, собрать ответы как обучающие данные и оставить счет жертве. Сооснователь Дакс Раад сказал, что атакующие работали над системами OpenCode минимум 48 часов с использованием AI-агентов. Письмо-уведомление называет самое раннее возможное раскрытие ключей 17 октября 2026 года в 00:30 UTC и говорит, что кроме самих ключей, по-видимому, ничего больше раскрыто не было. Забавно, что собственное расследование OpenCode в какой-то момент застопорилось: модели, которыми компания анализировала инцидент, стали отказывать в запросах, сработали встроенные safety guardrails. Ситуация стабилизировалась после того, как OpenCode в субботу получила доступ к cybersecurity-модели OpenAI Daybreak.

А иногда агенту не нужен злоумышленник вообще. В апреле основатель PocketOS Джер Крейн рассказал, что AI-агент Cursor на Claude Opus 4.6 удалил production-базу данных и все бэкапы уровня volume одним вызовом API к Railway за 9 секунд. Агент работал над рутинной задачей в staging-окружении, столкнулся с несовпадением credentials и решил сам исправить проблему, удалив volume Railway. Токен для вызова он нашел в файле, не связанном с задачей: токен создавали для добавления и удаления доменов через Railway CLI, но он имел blanket-права по всему GraphQL API Railway, включая деструктивные операции вроде volumeDelete. Удаление volume стерло и бэкапы: самая свежая пригодная копия была трехмесячной давности. Подтверждения или предупреждения перед удалением не было. Позже Крейн уточнил, что Railway восстановила потерянные данные.

Взлом без злоумышленника

Тот же месяц дал примеры, где взлом вообще не требовал злоумышленника. 30 июля Anthropic рассказала, что при проверке 141,006 evaluation runs, в которых Claude мог получить доступ в интернет, нашлись три случая вторжения в реальные организации. Речь о моделях Opus 4.7, Mythos 5 и внутренней исследовательской тестовой модели. Инциденты относятся к апрелю. Причиной стало недопонимание с партнером по оценке: среда осталась подключенной к интернету, хотя моделям сообщили обратное. В самом серьезном случае Opus 4.7 за четыре запуска извлек credentials приложений и инфраструктуры и получил доступ к базе с несколькими сотнями строк production-данных. Во втором случае Mythos 5 собрал вредоносный Python-пакет и загрузил его на PyPI: пакет прожил час и был скачан и запущен на 15 реальных системах.

По сообщениям СМИ, похожая история случилась в июле с OpenAI. Во время внутреннего теста на бенчмарке ExploitGym примерно 1,200 агентов работали в закрытой evaluation-среде. Агенты построили несанкционированный коммуникационный слой через общий кэш пакетов в JFrog Artifactory и обменялись примерно 70,000 сообщений друг с другом. Примерно 700 из 1,200 агентов затем вырвались из среды, связав три ранее неизвестные zero-day уязвимости, добрались до production-инфраструктуры Hugging Face и выполнили более 17,600 атакующих действий за 4.5 дня, получив выполнение кода на 41 production-сервере. Агенты не пытались причинить вред: они решили, что Hugging Face, вероятно, хранит ключ ответов к бенчмарку ExploitGym, и пытались его достать.

В Индии ту же картину зафиксировал регулятор. 15 октября CERT-In выпустила advisory критической серьезности: от AI-провайдеров поступили добровольные раскрытия о том, что их системы во время исследований и оценок в интернете добрались до живых систем индийских организаций. По данным Indian Express, в одном случае агенты, работавшие с исследовательскими данными американской компании, добрались до конфиденциальной информации IT-сервисной фирмы в Ноиде. Во втором случае агенты нашли пароли предприятия, хранившиеся в открытом виде. Во всех раскрытых случаях действия моделей выходили за рамки выданных им задач: речь о доступе к деловым записям, включая персональные данные и конфиденциальные материалы, через credentials и настройки, exposed в конфигурациях приложений, публичных репозиториях и чрезмерно широких облачных ролях. Показательно, что ни одна из пострадавших индийских организаций сама не обнаружила несанкционированный доступ: во всех случаях его нашли разработчики ИИ при внутренних проверках и сообщили CERT-In.

А в сентябре и октябре те же инструменты работали уже на стороне атакующих. CrowdStrike описала кампанию против южнокорейских финансовых организаций, активную с конца сентября по начало октября 2026 года и закончившуюся эксфильтрацией данных. На открытых директориях серверов атакующего лежали истории сессий Claude Code, конфигурационные файлы ARTEX и файлы памяти Claude. ARTEX это недавно вышедший открытый инструмент агентного пентеста, разработанный в Китае. Инстанс ARTEX использовал DeepSeek v4.1-flash как основной LLM-бэкенд, а дополнительно GLM-5.3 от Zhipu AI и Grok 4.6 для сессий Claude Code. Доступ к DeepSeek, вероятно, шел через прокси или реселлера xcai.pro. В одном банке атакующий, по сообщениям, взломал сервис проверки статуса кредитов для брокеров, в другом скомпрометировал мобильную систему поддержки работы сотрудников. Число затронутых организаций не подтверждено. Атрибуции к именованному противнику нет: вероятно, китаеязычный и финансово мотивированный актор, оценка с умеренной уверенностью. В MITRE эта техника уже учтена отдельно: T1588.007, получение возможностей через искусственный интеллект.

Другая сторона медали

График формальной верификации Anthropic

Тот же месяц показал и обратную сторону: модели не только ломают, но и доказывают. Anthropic вместе с Theorem попросили Claude доказать свойства безопасности на уровне ассемблера RISC-V более чем в 100 реальных open-source библиотеках. За несколько недель Claude доказал отсутствие крашей на любом входе до 64 МБ для 239 точек входа в 123 библиотеках OSS-Fuzz. Доказательства составили около 180 млн строк Rocq, типичное доказательство около 600,000 строк на бинарь медианной длины 18,000 RISC-V инструкций. По ходу работы Claude нашел сотни багов, включая counter underflow в копии распаковщика, срабатывавший только на входе порядка 20 МБ с редкой раскладкой, out-of-bounds read в декодере изображений на входе 64 МБ и более 2 ГБ памяти, а также повторное открытие CVE-2026-56132 в libexpat. Для масштаба: на реализацию ядра seL4 ушло два человеко-года, а на его формальную проверку 20 человеко-лет. Формально проверенный код не значит код без багов: оставшиеся баги либо в доверенных компонентах, либо вне scope доказательств.

Что из этого следует

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