Почему кнопка «разрешить» в AI-редакторах кода может обмануть даже опытного разработчика?

Исследователи компании Wiz 8 июля опубликовали разбор уязвимости, которую сами же и назвали GhostApproval. Суть проста и неприятна одновременно: зловредный репозиторий кода способен незаметно захватить компьютер разработчика через самый обычный AI-ассистент для программирования. Ассистент честно спрашивает разрешения отредактировать безобидный на вид файл — а запись на самом деле уходит в системный файл, который трогать точно не стоило.
Под удар попали шесть популярных инструментов: Amazon Q Developer, Claude Code от Anthropic, Augment, Cursor, Google Antigravity и Windsurf. На момент публикации три компании уже выпустили патчи, две продолжают работать над проблемой, а Anthropic вообще отказывается признавать это багом.
Механизм атаки построен на древней, как сам Unix, технологии символических ссылок — симлинков. Симлинк тихо указывает на другой файл где-то на диске, и запись в него на самом деле уходит по этому скрытому адресу. Проблема в том, что AI-ассистенты не проверяют и не разворачивают такие ссылки перед тем, как что-то записать.
Wiz продемонстрировали атаку на практике: собрали вредоносный репозиторий с симлинком под названием project_settings.json. На деле этот файл указывал на ~/.ssh/authorized_keys — файл, отвечающий за вход по SSH. В README репозитория была невинная инструкция «добавьте строку в project_settings.json». Строка на самом деле оказывалась чужим SSH-ключом, замаскированным под настройку проекта. Итог — если на машине запущен SSH-сервис, доступный атакующему, он заходит на неё вообще без пароля.
Есть и второй вариант атаки, ещё коварнее. Вместо SSH-ключей запись уходит в файл ~/.zshrc — стартовый скрипт оболочки, который выполняется автоматически при следующем открытии терминала. Здесь атакующему уже не нужен даже открытый SSH-порт. Правда, сами исследователи оговариваются: доказательств использования этой схемы в реальных атаках нет, это чисто исследовательская демонстрация.
Симлинки как трюк — штука известная десятилетиями. Настоящая проблема в другом: окно с запросом на подтверждение показывает неправду. Wiz называет это «обходом информированного согласия» — человек формально остаётся в цепочке принятия решений, но сама цепочка построена на ложных данных. Показательный случай — Claude Code. Во время тестирования внутренние рассуждения самого ассистента корректно определяли, что project_settings.json на самом деле является конфигурационным файлом zsh. Но в диалоговом окне, которое видит разработчик, фигурирует только название безобидного файла. Человек нажимает «Принять», думая, что редактирует локальный конфиг, а запись в это время уходит в стартовый файл оболочки или в SSH-ключи.
Степень уязвимости у разных инструментов разная. Windsurf вообще записывает файл на диск ещё до того, как появляются кнопки «Принять» или «Отклонить» — пользователю предлагают только отменить действие постфактум, когда вредоносный ключ уже на месте. Augment идёт ещё дальше и вовсе не показывает никакого диалога: Wiz продемонстрировали, как инструмент молча читает файл с учётными данными AWS, расположенный за пределами папки проекта. Остальные инструменты хотя бы выводят запрос на подтверждение, но остаются уязвимыми из-за того, что в этом запросе указан не тот файл.
По статусу исправлений картина такая:
    []Amazon Q Developer — исправлено в Language Server версии 1.69.0, присвоен номер CVE-2026-12958, обновление устанавливается автоматически для большинства пользователей, достаточно перезагрузить IDE
    []Cursor — исправлено в версии 3.0, CVE-2026-50549, обновление через менеджер расширений
    []Google Antigravity — исправлено, номер CVE пока в процессе присвоения
    []Augment — проблема признана, патча нет, рекомендация — не открывать этим инструментом непроверенные репозитории
    []Windsurf — аналогично, признана, патча нет, та же рекомендация
    []Claude Code — Anthropic оспаривает саму классификацию проблемы как бага, в текущих версиях появилось предупреждение о симлинках
Позиция Anthropic заслуживает отдельного внимания. Компания заявила Wiz, что описанный сценарий «выходит за рамки нашей модели угроз». Логика такая: разработчик уже сам решил доверять папке, когда запускал сессию, а затем сам одобрил правку — решение целиком на его совести. Anthropic утверждает, что предупреждение о симлинках в Claude Code появилось ещё в начале февраля, до того как Wiz отправила приватный отчёт о находке, и это было рутинным усилением защиты, а не прямым ответом на уязвимость. Отдельно компания уточнила, что более ранний ответ без комментариев был автоматическим сообщением, а не официальной позицией. Получается странная картина: из шести производителей только один настаивает, что бага здесь нет вообще, при этом трое уже выпустили патчи, а двое над ними работают. Вопрос, который остаётся открытым: насколько далеко должен идти AI-агент в защите разработчика, который уже доверился вредоносному репозиторию?
Wiz дают конкретные рекомендации и пользователям, и разработчикам инструментов. Пользователям стоит запускать агента с ограниченным доступом к файлам или внутри песочницы, изучать README и скрытые конфигурационные файлы репозитория перед тем, как доверить агенту «настройку проекта», а после работы с незнакомым кодом проверять файлы за пределами директории проекта — те, что не отображаются в git status: стартовый файл оболочки, SSH-ключи, конфиг самого AI-инструмента. Простая команда вроде ls -la ~/.zshrc ~/.ssh/authorized_keys покажет, менялись ли эти файлы, пока агент работал. Производителям инструментов советуют разворачивать симлинк и показывать настоящий адрес назначения перед запросом на подтверждение, помечать любую запись, уходящую за пределы папки проекта, и вообще не трогать диск, пока пользователь реально не одобрил действие.
GhostApproval не единственное исследование на эту тему. В мае компания Adversa AI опубликовала работу под названием SymJack — тот же паттерн с симлинками и обманом окна подтверждения, только атака была нацелена на шесть других агентов, включая Claude Code, Cursor, GitHub Copilot и Grok Build. Ещё раньше похожую проблему изучала Cato AI Labs в исследовании DuneSlide, о котором писал The Hacker News; собственный бюллетень Cursor по симлинк-уязвимости благодарит сразу обе команды — и Wiz, и Cato AI Labs.
У Amazon Q нашлась и отдельная, независимая проблема — CVE-2026-12957, упомянутая в бюллетене AWS. Отравленный репозиторий мог автоматически подгрузить конфигурационный файл и выполнить команды для кражи AWS-ключей разработчика сразу после того, как рабочее пространство получало статус доверенного. А в июне The Hacker News писал об инциденте с червём Miasma, который подсаживал конфигурационные файлы AI-агентов в репозиторий Microsoft Azure — вредоносная нагрузка срабатывала в момент открытия проекта в Claude Code, Cursor или Gemini. Реакция GitHub была быстрой: отключено 73 затронутых репозитория Microsoft.
Принцип «человек в цепочке принятия решений» работает как защита только тогда, когда сама цепочка показывает правду. По мере того как AI-ассистенты получают всё больше прав на чтение и запись файлов, окно подтверждения, называющее не тот файл, перестаёт быть защитой и превращается в источник риска. Списывать всё на «проблему пользователя», который открыл нечестный репозиторий, значит перекладывать ответственность на того, кто меньше всех способен заметить подмену.


Новое на сайте

Ссылка