Один оператор, менее 100 китайских иероглифов инструкций и около 5000 долларов в токенах. Согласно оценкам, опубликованным Reuters 19 октября (через BNN Bloomberg), этого оказалось достаточно, чтобы ИИ-агенты взломали сайты более чем 100 компаний, причем один успешный взлом обошелся примерно в 50 долларов токенов. В тот же день охранная фирма NorForge опубликовала отчет Inside Cairn о более чем 20 панелях управления ИИ-взломами, обнаруженных в открытом доступе в публичном интернете.
Среди жертв Reuters назвало компании Deere, SharkNinja и Cummins. В Deere сообщили, что предприняли меры по устранению уязвимостей и не обнаружили признаков доступа к конфиденциальным данным. Представители SharkNinja заявили, что атаке подвергся изолированный сайт техподдержки продуктов, а угроза была локализована. В Cummins заявили, что расследуют информацию о возможной атаке на веб-сайт, управляемый одним из их сторонних подрядчиков.
Куда более важная для вас деталь — это то, как именно они проникли внутрь. Специалисты NorForge подтвердили одно из вторжений, запросив веб-шелл, который агенты оставили после себя. Судя по логам самого агента, этот взлом не использовал никаких новых или изощренных эксплойтов. В ход пошло хранилище сессий memcached, в которое злоумышленник мог производить запись, небезопасный вызов PHP unserialize() и цепочка гаджетов (gadget chain) в устаревших компонентах Zend Framework. Каждая из этих уязвимостей годами известна как потенциальная мина замедленного действия.
Панель управления на порту 8000, открытая для всех
Инструмент из этой истории — Cairn, открытый «универсальный движок для решения проблем», который изначально тестировался на автономном пентесте. Он распространяется под лицензией AGPLv3, в качестве воркеров использует интерфейсы командной строки (CLI) таких кодинг-агентов, как Claude Code, Codex и Pi, а в его README прямо указано, что перед нацеливанием инструмента на что-либо необходимо получить «явное предварительное разрешение от владельца или оператора». Это инструмент для red team с вполне легитимными сценариями использования.
NorForge же задокументировала случаи, когда операторы оставляли веб-панель инструмента незащищенной. Панели были обнаружены с помощью сканирования через Shodan и Censys, объединены в три кластера по общим целям и инструкциям, и все три были оценены как вредоносные (два из них — с высокой степенью уверенности). Каждая панель из списка индикаторов была доступна на порту 8000. Некоторые были защищены от несанкционированного доступа; другие же «выглядят абсолютно незащищенными», предоставляя полный административный контроль любому, кто перейдет по адресу.
Часто причиной этого становится Docker. Конфигурация Docker Compose самого Cairn запускает сервер на порту 8000, в то время как документация Docker предупреждает, что публикация портов контейнеров по умолчанию небезопасна: обычная инструкция -p 8000:8000 публикует порт на всех адресах хоста ( 0.0.0.0 и [::] ), поэтому порт «становится доступным не только для хоста Docker, но и для внешнего мира», и ваш ноутбук — далеко не единственная машина, которая может до него достучаться. Проблема решается добавлением всего одного префикса:
# Reachable only from this machine docker run -p 127.0.0.1:8000:8000 my-agent-panel
Как бы эти операторы ни оставляли свои панели открытыми, результат оказался одинаковым: сотрудники NorForge смогли прочитать большую часть их операций прямо из открытых панелей, вплоть до списков целей и заметок самих агентов о том, что им удалось обнаружить.
Единственный подтвержденный взлом был совершен на старом PHP
Специалисты NorForge особо подчеркнули, что не утверждают, будто сами что-то взламывали. Чтобы проверить, действительно ли произошло заявленное вторжение, они запросили URL веб-шелла-«загрузчика», который агенты оставили на сайте крупного поставщика аппаратных комплектующих, и шелл действительно был на месте. В отчете не говорится, что NorForge воспользовалась им. Описание того, как агенты проникли внутрь, взято из собственных объяснений агента в его логе задач.
Судя по этому логу, цепочка была следующей: агенты обнаружили доступное для записи хранилище сессий memcached, скомпрометировали сериализованное значение сессии и вызвали внедрение объектов PHP (PHP object injection) через цепочку гаджетов в коде устаревшего фреймворка. В официальной документации memcached прямо говорится: «вы не должны выставлять memcached напрямую в интернет или делать его доступным для любых ненадежных пользователей», а также добавляется, что сервер практически не прилагает усилий для защиты от случайных подключений из интернета. Руководство по функции unserialize() в PHP начинается с предупреждения: «Не передавайте ненадежные пользовательские данные в функцию unserialize() независимо от значения параметра allowed_classes». PHPGGC — публичная библиотека готовых полезных нагрузок (payloads) для unserialize() , включающая цепочки для Zend Framework, — оказалась среди инструментов, найденных NorForge в папке воркера агента.
Новым в этой ситуации был тот факт, кто именно пытался провести атаку. В основном кластере NorForge проекты, достигшие своей цели, тратили в среднем «чуть менее 23 часов» от старта до результата, при этом для каждого проекта фиксировалось в среднем около 140 фактов работы — агент методично долбил цель, пока не находился подходящий заурядный изъян.
Почему вашими unserialize() и memcached так интересуются
Паттерн, против которого нужно защищаться — это проект, чей самый старый код все еще доверяет собственным сериализованным данным. Чтобы закрыть описанную NorForge брешь:
- Никогда не делайте unserialize() для ненадежных байтов. Значения сессий, прочитанные из общего хранилища, считаются ненадежными с того момента, как к этому хранилищу получает доступ кто-то еще. Совет в официальной документации — перейти на формат без инстанцирования объектов: json_encode() / json_decode() . Задание allowed_classes => false не является решением проблемы; сайт php.net рекомендует держать ненадежные входные данные подальше от unserialize() «независимо от значения параметра allowed_classes».
- Не выставляйте хранилище сессий наружу. memcached и Redis биндятся туда, куда вы укажете. Держите их на 127.0.0.1 или в приватной сети и относитесь к любому доступному из интернета кэшу как к уже скомпрометированному.
- Избавьтесь от устаревшего кода фреймворка, содержащего гаджеты. Цепочки гаджетов порождаются тем, что ваш фреймворк оставляет в путях автозагрузки (autoload), поэтому неиспользуемый код остается частью поверхности атаки до тех пор, пока вы его не удалите.
В последнем случае модульность (декомпозиция) окупается сторицей. Когда ваша доменная логика находится за тонким портом, а не внутри классов фреймворка, устаревшая версия фреймворка превращается в зависимость, которую можно удалить, изменив composer.json и добавив пару адаптеров, при этом остальная часть приложения даже ничего не заметит.
Не выставляйте собственные панели агентов в открытый интернет
Здесь есть прямой урок для всех, кто запускает кодинг-агенты, даже если на вас никто не охотится. Воркеры Cairn — это те же самые CLI, которые многие из нас запускают каждый день. DeepSeek даже описывает в документации настройку Claude Code для работы со своим API через установку переменной ANTHROPIC_BASE_URL . Это совпадает с именем воркера, замеченным NorForge ( claudecode_deepseek-v4.1-flash ), а также с отчетом Reuters о том, что в кампании использовалась комбинация DeepSeek и Claude Code.
Таким образом, уязвимая поверхность, из-за которой погорели эти операторы, — это ровно та же поверхность, которую вы создаете, поднимая любую панель управления агентами, очередь задач или дашборд и пробрасывая порт «просто чтобы проверить с телефона». Держите их на localhost, за VPN или аутентифицирующим прокси. Считайте, что все, что висит на 0.0.0.0 , будет проиндексировано.
Я разрабатываю Hermes IDE, поэтому воспринимайте это заявление с учетом данного факта. Hermes — десктопное приложение: каждый агент работает в собственном терминале, а каждая задача — в собственной ветке hermes/<name> и рабочем дереве (worktree). Оно бесплатно и имеет открытый исходный код (BSL 1.1), доступно на macOS, Windows и Linux. Ничто из этого не является гарантией безопасности, и это правило справедливо для всего, что вы запускаете.
Что на самом деле изменилось
Описанные в этой истории техники существуют уже лет десять. А вот экономика — нет. Reuters сообщает, что агенты атаковали более 1200 сайтов практически без вмешательства человека, причем оператор не делал почти никакой работы. По оценкам NorForge, средняя стоимость одной задачи составляет около 5 долларов с учетом неудач, а общий процент успешных атак — около 10% (впрочем, показатель стоимости имеет значительную погрешность).
Показатель успешности в 10% вполне приемлем для цикла, который стоит 5 долларов за попытку. Скучная уязвимость, которую вы задвинули в долгий ящик с мыслью «да кому она нужна», теперь активно эксплуатируется в промышленных масштабах тем, что не испытывает усталости.
Кроме того, в данных с открытых панелей NorForge обнаружила сотни секретов, причем Trufflehog подтвердил, что 11% из них до сих пор валидны. Выяснилось также, что легитимные команды по тестированию на проникновение размещали реальные отчеты о пентестах клиентов на собственных незащищенных панелях.
Если эта статья оказалась полезной
Уязвимость в этой истории заключалась в устаревшем коде фреймворка, который все еще доверял собственным сериализованным данным. Чтобы такой код не становился критически важным элементом системы, держите фреймворк на периферии: доменная логика должна быть скрыта за портами, а классы фреймворка — выступать в роли адаптеров, которые можно легко заменить или удалить. В книге Decoupled PHP рассматривается чистая и гексагональная архитектура для PHP-приложений, переживающих свой фреймворк. Именно благодаря ей старый компонент Zend превращается в банальное обновление composer.json и пару адаптеров, а не в масштабный проект по миграции. Если вы также запускаете кодинг-агенты, Hermes IDE (GitHub) предоставит каждому из них собственный терминал и собственную ветку.
Комментарии (0)
Пока нет комментариев — будьте первым.