Невидимый комментарий в pull request превращает ИИ-агента ревьюера в шпиона

· Безопасность
Один скрытый HTML-комментарий в Azure DevOps способен перенаправить ИИ-агента разработчика в чужие проекты и тихо выкачать оттуда данные. Причина — забытая защита в официальном MCP-сервере Microsoft.

cover.svg

Компания Manifold Security описала уязвимость класса «запутанного посредника» (confused deputy) в официальном MCP-сервере Microsoft для Azure DevOps. Сервер позволяет ИИ-агентам читать и обслуживать pull request'ы, пайплайны, вики и рабочие элементы от имени пользователя — с его собственными правами. В этом и заключается корень проблемы: текст, написанный посторонними, может стать инструкцией, которую агент выполнит.

Как работает атака

Описания pull request'ов в Azure DevOps поддерживают Markdown, а значит и HTML-комментарии. В веб-интерфейсе конструкция <!-- ... --> не отображается вовсе — ревьюер видит обычную правку. Но REST API возвращает такой текст дословно, и сервер передаёт его агенту как есть. Возникает расхождение между тем, что видит человек, и тем, что получает модель.

Когда ревьюер просит агента проверить pull request, скрытый текст может переписать цель агента. Тот действует с учётными данными ревьюера — а значит способен добраться до проектов, куда у самого атакующего доступа нет. Manifold подчёркивает, что эскалация здесь — норма: ревьюеры обычно старше по правам, чем автор запроса. Нападающий не получает ничего напрямую, он лишь одалживает чужой доступ через текст, которого жертва не видит.

Защита, которую забыли применить

Особенность в том, что Microsoft уже реализовала нужную защиту. Изучив исходный код, Manifold обнаружила приём «spotlighting» — обёртывание недоверенного контента в разделители, чтобы модель отличала данные от инструкций. Он был добавлен в PR #1062 и применяется к вики-страницам и логам сборки через общий помощник createExternalContentResponse. Однако инструмент repo_get_pull_request_by_id, возвращающий описание запроса, этот помощник не вызывает — и отдаёт текст в сыром виде. The Hacker News подтвердило, что по состоянию на 21 июля брешь в актуальном коде не закрыта.

В демонстрации на локальной сборке v2.7.0 один скрытый комментарий запустил цепочку: агент триггерил пайплайн в другом проекте, читал конфиденциальную вики-страницу, недоступную атакующему, и публиковал её содержимое обратно в комментарий к pull request. Каждый вызов был разрешён агенту — проблема, как пишут исследователи, «в последовательности и намерении, продиктованных текстом, которого человек не видел». Воспроизвести атаку удалось и с Copilot CLI, и с Claude Code.

Условия и рекомендации

Для атаки нужны: право записи в проект, рабочий процесс, скармливающий текст агенту, ревьюер с более широким доступом и агент в режиме авто-одобрения без запроса на каждый инструмент. Именно широкий токен вкупе с таким режимом концентрируют риск.

Представитель Microsoft поблагодарил Manifold за раскрытие, назвал случай «известным классом ИI-рисков» и посоветовал ограничивать доступ к проектам и «проверять предлагаемые изменения перед тем, как поручать их ИИ». Загвоздка в том, что вредоносная нагрузка невидима в том самом интерфейсе, который просматривает человек. CVE пока не присвоен, исправленной версии нет.

Специалисты советуют выдавать агенту токены с минимальными правами, ограничивать его проектом под ревью и убирать из набора инструментов всё лишнее — запуск пайплайнов, чтение вики, публикацию комментариев. Ведь защита работает лишь там, где кто-то не забыл её добавить, и надёжна ровно настолько, насколько прикрыт её самый уязвимый путь.


Источник: The Hacker News

Комментарии

Войдите, чтобы комментировать.

  • Пока нет комментариев.