Adversa AI опубликовали два разбора уязвимостей в AI-агентах (раз, два) — оба про то, как заставить диалоги подтверждения ввести пользователя в заблуждение.
SymJack: текст подтверждения показывает не то, что произойдёт
Атака основана на симлинках. В зловредном репозитории лежат пустые «конфиги» и симлинк вроде
docs/vid.mp4 → .mcp.json. Инструкция агента (AGENTS.md и подобные) просит выполнить безобидную на вид команду:cp media/payload.mp4 docs/vid.mp4
Окно показывает «копирую видео», но агент резолвит симлинк и перезаписывает реальный
.mcp.json или settings.json payload'ом под видом видео. После перезапуска агента стартует вредоносный MCP-сервер с произвольным кодом. Затронуты Claude Code, Cursor, Antigravity, Copilot, Grok, Codex CLI. Anthropic починили отображение реального пути, остальные пока отмахнулись или молчат.TrustFall: «доверяете каталогу?» = «запустить код?»
В Claude Code 2.1+ диалог спрашивает «это ваш проект или вы ему доверяете?», но про MCP-серверы не упоминает. Атакующий кладёт в репозиторий
.claude/settings.json с enableAllProjectMcpServers и .mcp.json с payload'ом прямо в команде (node -e "fetch(...)", без внешних файлов). Клонируешь, запускаешь, жмёшь Enter на «доверяю» — и сервер стартует с полными правами пользователя. Затронуты Claude Code, Gemini CLI, Cursor CLI, GitHub Copilot CLI.Anthropic назвали это «design intent» и отказались фиксить, остальные пока молчат.
Схемы обеих атак в деталях — на диаграммах.
И вот тут, gen-AI часть поста заканчивается, и начинается скромное авторское мнение 🙈
Не вполне понимаю, почему подобное называют уязвимостями и, в целом, разделяю мнение Anthropic. В случае SymJack косяк агентов лишь в том, что они не разворачивают симлинки, сообщая пользователю о том, какая операция требует подтверждения. Это недостаток, да, нужно исправлять.
Но в остальном, как и в случае с TrustFail, авторы исследования, на мой взгляд, придумали какую-то, удобную им, но далекую от реальности модель угроз, и в рамках неё стали называть свои находки уязвимостями.
Здесь работает та же логика, которую стоит включать при критике SAST-инструментов с контролем сборки или частичным выполнением кода. Ничего, что в большинстве проектов есть тот же settings.json, Makefile, проектные файлы, сборочные скрипты, генераторы кода и т.п., с помощью которых можно влегкую провести RCE, как аналогичными техниками, так и вообще без агента, атакуя чисто IDE или системы сборки/тестов/кодогенерации?
Если пользователь, имея полную и достоверную информацию о совершаемой операции, её таки подтверждает — это проблема пользователя. Ну и, возможно, навесной защиты. Как и ответ «да» на вопрос, доверяет ли он вообще всему репозиторию. В этом весь смысл самой идеи human-in-the-loop, и механизмов подтверждений.
❓ Откуда агенту, в общем случае, знать — какая часть (уже отмеченного доверенным, заметьте) проекта представляет угрозу окружению пользователя, а какая — нет? Почему и с каких пор это стало проблемами агентов? (не риторические вопросы, велкам в комментарии, если кто не согласен с позицией).
😘 В c0wrk сделал обязательными подтверждения всех без исключения операций, чьи аргументы содержат пути к симлинкам, с их разворачиванием в полные пути в сообщениях для пользователя. Но и только.
#ИИ_безопасность #уязвимости

