Русская версия The Next Web

Google Безопасность Данные и безопасность

Один трюк с git обошел защитную блокировку в четырех ИИ-агентах для написания кода

Один трюк с git обошел защитную блокировку в четырех ИИ-агентах для написания кода

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

Исследователи из компании Air Security в четверг опубликовали информацию об уязвимости, которую они назвали Plugin4Shell. Она затрагивает четыре наиболее широко используемых ИИ-агента для написания кода: Claude Code от Anthropic, Codex от OpenAI, GitHub Copilot и Gemini CLI от Google. По определению Нево (Nevo), Дора Граната (Dor Granat) и Нива Хоффмана (Niv Hoffman), это удаленное выполнение кода в один клик без участия пользователя. Жертве вообще не нужно предпринимать никаких действий. Джессика Лайонс (Jessica Lyons) первой сообщила об этом для The Register.

Компания Anthropic исправила проблему в Claude Code версии 2.1.179, а OpenAI — в Codex 0.146.0. Microsoft не выпустила исправление для Copilot. Google не будет исправлять Gemini CLI, так как этот инструмент выводится из эксплуатации.

Что на самом деле делает Plugin4Shell

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

Специалисты Air выяснили, что агенты запрашивают закрепленный снимок, но никогда не проверяют, что именно они получили. Git позволяет ветке носить практически любое имя, включая строку, которая выглядит точно так же, как хэш коммита. Когда имя является одновременно и действительной веткой, и действительным объектом, git молчаливо отдает предпочтение ветке.

Таким образом, тот, кто контролирует репозиторий плагина, может создать ветку, названную в честь закрепленного хэша. Они указывают ею на другой код и делают ветку веткой по умолчанию. Агент производит чекаут ветки, устанавливает код злоумышленника и сообщает об успешной установке на закрепленном коммите.

Gemini CLI работает иначе: он извлекает правильный коммит, а затем выполняет операцию checkout, которую может перехватить ветка по умолчанию с именем FETCH_HEAD. Правильный код так и не попадает на диск.

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

Почему никому не нужно кликать мышкой

Агенты обновляют установленные плагины в фоновом режиме. Claude Code и Codex делают это по умолчанию. Поэтому для атаки не требуется, чтобы кто-то устанавливал что-то новое. Она заменяет плагин, которому разработчик уже доверяет и который уже запускает.

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

Плагин запускается с теми же правами доступа, что и пользователь агента. Следовательно, подмененный код получает доступ к его файлам, сохраненным учетным данным и ко всем системам, в которые он может войти. OWASP обратила внимание на эту проблему в текущем месяце, переместив избыточную автономность агентов на третье место в своем топ-10 за 2026 год.

GitHub утверждает, что ее пользователи не подвержены риску

GitHub отклоняет имена веток, похожие на хэши коммитов, поэтому этот трюк с ветками там не срабатывает. Представитель компании сообщил The Register, что эта мера предосторожности предотвращает эксплуатацию уязвимости на GitHub.

В Air с этим не согласны. Маркетплейсы могут размещаться и на других ресурсах, включая Bitbucket и собственные серверы git компаний. И то, и другое позволяет использовать имена веток в виде хэшей, а в собственной документации Anthropic они указаны как допустимые бэкенды маркетплейсов. Copilot также поддерживает такие хосты, и именно в этом, по заявлению Air, заключается риск. В Microsoft изданию The Register не ответили.

Это не первый случай, когда GitHub оспорил выводы исследователя о Copilot. Стоит отметить, что, по собственным данным Microsoft, около 90% компаний из списка Fortune 500 используют Copilot, при этом Copilot — один из двух агентов, не имеющих патча.

Сколько реальных разработчиков это затрагивает

Уязвимость Plugin4Shell на практике оказывается более узкой, чем предполагает громкий заголовок о четырех уязвимых агентах, и наиболее полезный отчет об этом подготовил ресурс The Hacker News. Свати Хандельвал (Swati Khandelwal) проверила маркетплейсы, с которыми поставляются агенты (по состоянию на 18 сентября), и обнаружила, что каждый плагин в каталоге сообщества Anthropic, а также в каталогах по умолчанию для Claude Code и Copilot, ссылается на репозиторий GitHub.

Две составляющие этой атаки также можно разделить. Фоновое автообновление — это то, что делает атаку незаметной для пользователя. Оно работает по умолчанию только для собственных встроенных маркетплейсов агентов, а они размещаются на GitHub. Для сторонних маркетплейсов эта функция отключена или является опциональной. Разработчик, который устанавливает плагины только из каталогов по умолчанию, никогда не столкнется с версией уязвимости, использующей имена веток.

Однако эта логика не распространяется на Gemini CLI. Ее вариация полагается на ветку с именем FETCH_HEAD вместо хэша, и правило GitHub явно не блокирует это имя. К тому же это единственный агент, который никто и никогда не пропатчит.

Четыре месяца без CVE

Компания Air создала работающий прототип эксплойта в мае и сообщила о нем всем четырем вендорам в июне. Anthropic подтвердила выпуск исправления 17 июня. Google заявила 4 августа, что исправления не будет. Исправление для Codex было проверено 12 августа.

По состоянию на 18 сентября The Hacker News обнаружила отсутствие идентификатора CVE и каких-либо бюллетеней безопасности, опубликованных кем-либо из четырех вендоров. В примечаниях к выпуску Anthropic для версии 2.1.179 об исправлении вообще не упоминается, поэтому пост Air является единственным публичным подтверждением его существования. Нет никаких признаков того, что уязвимость использовалась в реальных атаках.

Четыре месяца тишины — это большой срок для бреши в программном обеспечении, которое используется компаниями из списка Fortune 500. Это также выглядит странно на фоне того, куда движется европейское законодательство. Закон о киберустойчивости (Cyber Resilience Act) устанавливает 24-часовой дедлайн для сообщения об активно эксплуатируемых уязвимостях и настойчиво требует создания документированных цепочек поставок программного обеспечения.

Это происходит уже в третий год… то есть в третий раз

Air занимается этим направлением уже несколько месяцев. Ранее компания внедрила вредоносный навык (skill) в маркетплейс и охватила около 26 000 агентов. Затем она перехватила 925 уже используемых навыков, затронув 134 000 агентов, путем захвата стоящих за ними репозиториев.

Закрепление хэшей SHA было ответом индустрии на обе проблемы. Пять лабораторий согласовали общий стандарт плагинов в августе. Злоумышленники теперь атакуют уровень распространения под моделями, а не сами модели. Одна и та же конструктивная ошибка обнаружилась в четырех продуктах от четырех разных компаний, что говорит скорее о том, что никто не проверял базовое предположение безопасности, чем о разовом промахе одной команды.

Один вопрос в опубликованных отчетах остается открытым: удаляет ли обновление уязвимого агента плагин, который уже был подменен, или оно лишь предотвращает следующую подмену. Разработчики, которые уже сталкивались с перехватом Claude Code или видели, как агенты OpenAI появлялись внутри RubyGems, легко узнают этот почерк.

Gemini CLI остается уязвимым навсегда. Google рекомендует пользователям перейти на Antigravity, до которого атака дотянуться не может, поскольку в нем нет механизма привязки плагинов, который можно было бы обойти. Вопрос, к которому стоит вернуться через год: сколько установок Gemini CLI все еще функционируют.