Исследователи Ор Нево, Дор Гранат и Нив Хоффман из лаборатории Air Security раскрыли уязвимость Plugin4Shell. Она затрагивает четыре крупных ИИ-агента для программирования: Claude Code от Anthropic, Codex от OpenAI, GitHub Copilot и Gemini CLI. Через подмену плагина злоумышленник добивается удалённого выполнения кода (RCE, запуск чужого кода на чужой машине) без единого действия со стороны жертвы. Агент запускает расширения с правами разработчика, который им пользуется. Вредоносный плагин получает тот же доступ к исходному коду, секретам, облачным средам и внутренним системам компании.
Уязвимость Plugin4Shell
Схема защиты, которую обходит Plugin4Shell, опирается на закрепление по SHA. SHA - это криптографический хеш, которым git помечает состояние репозитория. Маркетплейс плагинов или служба безопасности компании проверяет код на конкретном коммите и запоминает его хеш. Дальше агент обязан получить ровно тот же код. Правки, сделанные после ревью, в расчёт не попадают. Именно на этой гарантии строят свои процессы и площадки расширений, и корпоративные заказчики.
Ошибка кроется в последнем шаге. Агент запрашивает закреплённый хеш, но не сверяет, что рабочая копия действительно соответствует ему. Git предпочитает ссылку объекту, если у них одинаковое имя. Поэтому злоумышленник создаёт ветку, имя которой совпадает с 40-символьным хешем закреплённого коммита, и назначает её основной веткой репозитория. Клон подтягивает такую ветку, а переключение разрешает имя в неё, а не в коммит. Агент сообщает об успешной установке проверенной версии, хотя на диск попадает чужой код. Сам закреплённый коммит трогать не нужно: он может остаться на месте.
У Gemini CLI свой вариант той же ошибки. Установщик забирает закреплённый коммит, а затем переключается на служебную ссылку FETCH_HEAD. Если основную ветку репозитория назвать FETCH_HEAD, git снова выберет ветку и отбросит скачанный коммит.
Атака не требует участия человека, и причина в фоновых обновлениях. Claude Code и Codex по умолчанию сами обновляют уже установленные плагины. Злоумышленнику достаточно дождаться, когда маркетплейс переставит закрепление на новый коммит. Смена закрепления запускает автообновление. Ветка с нужным именем уходит на машины, и никаких запросов, подтверждений или предупреждений не возникает.
Проблема относится к атакам на цепочку поставок. Добраться до цели можно двумя путями, и контроль над маркетплейсом для этого не нужен. В первом случае злоумышленник публикует безобидный плагин, проходит проверку, набирает установки, а потом меняет содержимое на вредоносное. Во втором захватывает репозиторий добросовестного автора, которому маркетплейс уже доверяет. Каждую часть этой цепочки исследователи отработали на живых примерах в предыдущих работах, поэтому схема выглядит не умозрительной.
Маркетплейс не может закрыть эту уязвимость самостоятельно. Разрешение имени происходит внутри агента, на стороне клиента, поэтому гарантию возвращает только исправление самого агента. Хостинг способен лишь сузить простор для первой разновидности, запретив ветки с именами в виде хеша. GitHub такие имена отклоняет, а Bitbucket и собственные серверы git допускают. Документация Anthropic перечисляет Bitbucket и самохостинг как допустимые площадки для маркетплейсов. Запрет отрезал бы поддерживаемые конфигурации, а для варианта с FETCH_HEAD он не даёт ничего.
Anthropic закрыла дыру в Claude Code версии 2.1.179, OpenAI в Codex 0.146.0. Microsoft исправление для GitHub Copilot к моменту раскрытия не выпустила. Google отказалась править Gemini CLI, поскольку продукт признан устаревшим, и предлагает пользователям перейти на Antigravity. Верное решение выглядит просто. После установки агент должен вычислить фактический коммит в рабочей копии и прервать работу, если он не совпадает с закреплённым. Проверку нужно выполнять внутри агента, ведь маркетплейс не управляет тем, как локальный git разрешает имя.
Хронология растянулась на несколько месяцев. Уязвимость нашли в мае 2026 года, в июне передали всем четырём вендорам. Anthropic подтвердила исправление 17 июня 2026 года. Google 4 августа 2026 года сообщила, что исправления не будет. К 12 августа 2026 года в OpenAI проверили Codex 0.146.0.
Организациям с уже установленными расширениями нужно обновить поддерживаемые агенты, провести инвентаризацию плагинов и ограничить доступ к непроверенным источникам git. Нужно проверить и то, кто владеет репозиториями плагинов и какая ветка назначена основной. Компании, работающие с Air Marketplace и Air Filter, от Plugin4Shell не пострадали. Публичных сообщений о реальных атаках через эту уязвимость пока нет, однако обе составные части схемы уже подтверждены на практике.
Plugin4Shell затрагивает не модель и не сам агент, а слой распространения расширений. Этот слой связывает миллионы машин с открытыми сообществами разработчиков, и одна и та же ошибка проектирования повторилась у всех крупных вендоров. Пока агент не сверяет фактический коммит, закрепление по SHA не даёт той гарантии, ради которой его вводили. Плагин, установленный и проверенный по всем правилам, может выполнять чужой код.
Ссылки