Исследователи компании 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, расположенный за пределами папки проекта. Остальные инструменты хотя бы выводят запрос на подтверждение, но остаются уязвимыми из-за того, что в этом запросе указан не тот файл.
По статусу исправлений картина такая:
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-ассистенты получают всё больше прав на чтение и запись файлов, окно подтверждения, называющее не тот файл, перестаёт быть защитой и превращается в источник риска. Списывать всё на «проблему пользователя», который открыл нечестный репозиторий, значит перекладывать ответственность на того, кто меньше всех способен заметить подмену.

Изображение носит иллюстративный характер
Под удар попали шесть популярных инструментов: 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 оспаривает саму классификацию проблемы как бага, в текущих версиях появилось предупреждение о симлинках
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-ассистенты получают всё больше прав на чтение и запись файлов, окно подтверждения, называющее не тот файл, перестаёт быть защитой и превращается в источник риска. Списывать всё на «проблему пользователя», который открыл нечестный репозиторий, значит перекладывать ответственность на того, кто меньше всех способен заметить подмену.