3,583 papers
arXiv:2610.35541 75 26 окт. 2026 г. FREE

Vela: защищает не агент, а дизайн интерфейса — как сервис, открытый для AI-агентов, сохраняет уязвимости

КЛЮЧЕВАЯ СУТЬ
Из 44 уязвимостей агент остановил только 4. Остальные 40 (91%) прошли через него без проблем. Метод ревью позволяет найти дыры в интерфейсе, который вы открываете агенту, до запуска. Для этого не нужно уговаривать модель «быть осторожной». Авторы бенчмарка Vela развели влияние интерфейса и влияние агента по трём прогонам: родной сайт, скрипт через интерфейс агента и живой коммерческий агент. Итог: сужение набора операций режет долю рабочих атак с 95% до 39%. Смена агента двигает этот показатель максимум на 4,5 пункта.
Адаптировать под запрос
⚡

TL;DR

Если сервис открыть для AI-агента через готовые операции (MCP, OpenAPI, NLWeb), агент не работает как фильтр безопасности. Всё, что атакующий мог сделать через сайт или прямой вызов интерфейса, он делает и через агента. В эталонной конфигурации (Claude Code + интерфейс по сценариям) осталось 91% уязвимостей: 40 из 44. Статья называет это механизмом «Vela»: так зовётся бенчмарк, на котором всё проверяли.

Главная находка: надежда на то, что модель сама откажется, не оправдалась. Авторы ждали, что агент будет отказываться от вредных просьб или «чистить» опасные входные данные. Ни одной потери в эталонной конфигурации нельзя списать на отказ агента или нормализацию ввода. В одном случае агент даже сам доделал атаку: подставил недостающие вызовы, которые атакующий не указал (например, поиск цели). Причина простая. Для агента «поменять данные чужого заказа» выглядит как обычная бизнес-операция. Запрос формально валиден, а нарушение прав — это уже вопрос к бэкенду.

Что реально меняет картину — дизайн интерфейса. Если сужать набор операций и свободу аргументов, доля сохранившихся атак падает с 95% до 39%. Смена агента двигает этот показатель максимум на 4,5 пункта. Но цена есть: жёсткие интерфейсы заодно ломают и законные сценарии.

🔬

Схема метода

Это исследование-находка, а не техника. Схема — как авторы разделили влияние интерфейса и агента:

C0: атака через родной веб-интерфейс → эталонный результат (кейс вообще эксплуатируем?)
C1: та же атака скриптом через интерфейс агента (без LLM) → что остаётся после ограничений интерфейса
C2: та же атака через коммерческого агента → что добавляет или убирает агент

C0 vs C1 = эффект интерфейса
C1 vs C2 = эффект агента
Итог проверяет независимая проверка состояния бэкенда, а не ответ агента
🚀

Пример применения

Применить вывод промптом в чате нельзя. Но чат подходит для ревью вашего агентного интерфейса перед запуском. Ревью опирается на логику авторов: проверять, какие операции и аргументы доступны, а не уговаривать агента «быть осторожным». Шаблон ниже — наша производная от статьи, готовых промптов у авторов нет.

Задача: Команда запускает Telegram-ассистента для интернет-магазина вроде Ozon или Wildberries. Пользователь пишет «верни кроссовки, которые я заказывал на прошлой неделе». Агент ходит в бэкенд через MCP-инструменты. Перед запуском продакт хочет понять, что сможет сделать злонамеренный пользователь, даже если системный промпт запрещает всё плохое.

Промпт:


Ты — ревьюер безопасности агентных интерфейсов. Ты не полагаешься на то, что 
агент откажется от вредной просьбы. Ты исходишь из того, что агент выполнит 
любой формально корректный вызов.



Инструменты MCP для ассистента интернет-магазина:
- get_my_orders(status) — список заказов текущего пользователя
- get_order(order_id) — детали заказа
- create_return(order_id, reason, comment) — оформить возврат
- update_address(order_id, address) — сменить адрес доставки
- apply_promo(order_id, code) — применить промокод
- upload_photo(order_id, file_url) — загрузить фото дефекта по ссылке
Идентификатор пользователя подставляется сервером из сессии.



Для каждого инструмента:
1. Какие аргументы агент контролирует свободно (атакующий может подать любое значение)?
2. Класс риска:
   - ТОЧНЫЙ ВВОД: нужен точный контроль над значением (инъекции в comment, address, code)
   - ЛОГИКА ПРИЛОЖЕНИЯ: формально валидный запрос нарушает права или сценарий 
     (чужой order_id, возврат уже возвращённого, обход статусов)
   - РЕСУРСЫ: работа с файлами и внешними ссылками (file_url — загрузка, чтение, обращение к внутренним адресам)
3. Что агент может достроить сам, если атакующий не указал (поиск чужого заказа, промежуточные вызовы)?
4. Что можно сузить на уровне интерфейса: убрать аргумент, заменить свободный текст 
   на перечисление, жёстко привязать объект к пользователю.
5. Какой законный сценарий пострадает от каждого сужения.



Таблица: инструмент | класс риска | свободные аргументы | что сужаем | цена для законного сценария.
В конце — 3 самых опасных места и что проверять на стороне бэкенда 
(а не в системном промпте агента).

Результат: Модель выдаст таблицу по каждому инструменту. Скорее всего, она отметит update_address и get_order как риск логики приложения (чужой order_id), upload_photo как риск ресурсов (file_url), а свободные поля вроде comment как риск точного ввода. Для каждого будет предложено сужение и цена для законных сценариев. В конце — список топ-3 мест и проверки, которые нужно делать на бэкенде.

🧠

Почему это работает

Слабость. Агент — это LLM, которая переводит просьбу в вызов инструмента. Он не знает, чьи права нарушает вызов, если запрос выглядит нормально. Безопасность, встроенная в обучение модели, ловит очевидно вредные инструкции. Атаки через обычные бизнес-операции под эту категорию не попадают.

Сильная сторона. Интерфейс — жёсткая, детерминированная рамка. Агент не может вызвать то, чего в интерфейсе нет, и подать аргумент, которого нет в схеме. Авторы это измерили: потери случались там, где интерфейс больше не давал нужную операцию или не давал контролировать входное значение.

Как использовать. Хорошо работают две вещи: ограничивать интерфейс и проверять права на бэкенде. Вшивать защиту в промпт агента неэффективно. Рычаги: - Уровень абстракции операций. Узкие операции по сценарию вместо «сырых» эндпоинтов с оригинальными параметрами — меньше свободы атакующему. - Свободные аргументы. Любое поле со свободным текстом заменяй на перечисление или проверяемый формат, если сценарий это допускает. - Привязка идентичности. Пользователя подставляет сервер из сессии, а не агент из диалога. - Что проверять. Итог проверяй по состоянию бэкенда, а не по ответу агента: гладкий ответ не доказывает, что действие безопасно.

📋

Шаблон промпта

В статье нет готового промпта: она измеряет, а не предлагает инструкцию. Ниже — шаблон ревью по классификации авторов. Структуру (теги и три класса риска) сохраняем, чтобы модель двигалась по тому же логическому пути.


Ты — ревьюер безопасности агентных интерфейсов. Ты не полагаешься на то, что 
агент откажется от вредной просьбы. Ты исходишь из того, что агент выполнит 
любой формально корректный вызов.



{список инструментов или эндпоинтов с аргументами}
Кто подставляет идентичность пользователя: {сервер / агент}



Для каждого инструмента:
1. Какие аргументы контролируются свободно?
2. Класс риска:
   - ТОЧНЫЙ ВВОД: нужен точный контроль над значением
   - ЛОГИКА ПРИЛОЖЕНИЯ: формально валидный запрос нарушает права или сценарий
   - РЕСУРСЫ: работа с файлами, импортом, внешними ссылками
3. Какие шаги агент может достроить сам за атакующего?
4. Что сузить на уровне интерфейса?
5. Какой законный сценарий пострадает от сужения?



Таблица: инструмент | класс риска | свободные аргументы | что сужаем | цена для законного сценария.
В конце — 3 самых опасных места и что проверять на бэкенде.

Подставляй: {список инструментов...} — названия, аргументы и краткие описания из твоей MCP/OpenAPI-схемы. {кто подставляет идентичность} — откуда берётся ID пользователя.

🚀 Быстрый старт — вставь в чат:

Вот шаблон ревью агентного интерфейса. Адаптируй под мою задачу: [опиши свой сервис и что агент может делать]. 
Задавай вопросы, чтобы заполнить поля.

[вставить шаблон выше]

LLM спросит про список операций, аргументы и то, откуда берётся идентичность пользователя. Без этого она не отличит свободный аргумент от жёстко привязанного. Дальше она возьмёт структуру из шаблона и применит к твоему интерфейсу.

⚠️

Ограничения

⚠️ Не про промпты агента: статья не проверяла, можно ли защитить сервис системным промптом агента. Авторы намеренно оставили вендорный промпт без дополнительных инструкций по безопасности. Вывод «промпт не спасёт» — это не измеренный результат, а то, чего авторы не пробовали. Он следует только из того, что встроенных отказов агента не хватило.

⚠️ Только прямая атака пользователя: косвенные инъекции через чужие данные, взлом чужого агента и самостоятельный поиск неизвестных уязвимостей авторы исключили.

⚠️ Не случайная выборка: 44 уязвимости — подобранный набор известных (CVE и учебные приложения). Проценты описывают этот набор, а не весь веб.

⚠️ Жёсткий интерфейс режет и нужное: самые ограничивающие дизайны снижают эксплуатируемость, но и законные сценарии становятся недоступны. Универсального «безопасного и удобного» варианта статья не показывает.

⚠️ Нужен доступ к бэкенду: применить вывод может тот, кто влияет на дизайн интерфейса сервиса (схемы инструментов, права на сервере). Обычному пользователю чата это мало что даёт.

⚠️ Неполный текст: во входных данных нет части результатов (детали RQ2 и RQ3, цифры по конкретным дизайнам и агентам). Разбор опирается на аннотацию и введение.

🔍

Как исследовали

Идея была простой: взять сервис с уязвимостью и проверить, что случится, если до него теперь добираться через агента. Авторы собрали Vela: 44 задокументированные уязвимости в 12 семействах веб-приложений (WordPress, PrestaShop, OWASP Juice Shop, crAPI и других). Каждую сначала воспроизвели «напрямую» и записали эталонный результат.

Интерфейсы для агента строили вслепую: дизайнеры не знали ни об уязвимостях, ни о нагрузках. Так ни один дизайн не мог быть «подогнан» под известный баг. Опирались на 50 обычных рабочих сценариев (заказ, возврат, регистрация и т.п.). Сделали три варианта: «эндпоинты как есть» (в духе OpenAPI), «один инструмент на сценарий» (в духе MCP) и «запрос на естественном языке» (в духе NLWeb).

Три условия сравнивали на одном бэкенде и с одинаковым стартовым состоянием. C0 — атака напрямую. C1 — скрипт через интерфейс. C2 — коммерческий агент (Claude Code, Codex, Grok Build) через тот же интерфейс. Разница C0–C1 показывает эффект интерфейса, разница C1–C2 показывает, что добавляет агент.

Результат проверял независимый «оракул», а не ответ агента: он смотрел на состояние бэкенда или на канал, видимый атакующему. «Гладкий ответ агента — не доказательство». Два разметчика согласились по итогам для 40 сохранившихся случаев с оценкой κ = 0,89.

Что удивило: агент не потерял ни одной из атак, которые пропускал интерфейс. Решающим оказалось не поведение модели, а то, какие операции и аргументы ей вообще доступны. Для практики это значит: проектируйте интерфейс и защиту бэкенда, а не рассчитывайте, что умная модель «заметит подвох».

💡

Адаптации и экстраполяции

🔧 Техника: проверять итог по состоянию системы, а не по ответу агента → надёжная приёмка работы

Вывод авторов («гладкий ответ — не доказательство») переносится на любые агентные автоматизации. Добавь в инструкцию агенту или в чеклист приёмки:

Не считай задачу выполненной на основании своего ответа. 
После действия проверь результат независимым способом: прочитай итоговое 
состояние (запись в системе, файл, статус) и приложи подтверждение.

В статье это сделано через независимый «оракул» при тестировании. Применение в рабочих агентах — наша экстраполяция.

🔗

Ресурсы

  • Работа: The Agent in the Middle: How AI-Mediated Access Reshapes Web Vulnerability Exploitation (WWW '27)
  • Авторы: Ruozhao Yang, Jiongchi Yu, Ming Hu, Xiaofei Xie. Singapore Management University, Nanyang Technological University, East China Normal University
  • Бенчмарк и источники кейсов: Vela, WebExploitBench, CVE-Bench, OWASP Juice Shop, OWASP crAPI
  • Стандарты интерфейсов: MCP, OpenAPI, NLWeb
  • Контекст: Agentic Commerce Protocol (OpenAI), Universal Commerce Protocol (Google)

📋 Дайджест исследования

Ключевая суть

Из 44 уязвимостей агент остановил только 4. Остальные 40 (91%) прошли через него без проблем. Метод ревью позволяет найти дыры в интерфейсе, который вы открываете агенту, до запуска. Для этого не нужно уговаривать модель «быть осторожной». Авторы бенчмарка Vela развели влияние интерфейса и влияние агента по трём прогонам: родной сайт, скрипт через интерфейс агента и живой коммерческий агент. Итог: сужение набора операций режет долю рабочих атак с 95% до 39%. Смена агента двигает этот показатель максимум на 4,5 пункта.

Принцип работы

Три прогона одной и той же атаки. Первый: через обычный веб-интерфейс, чтобы понять, эксплуатируема ли дыра вообще. Второй: скриптом через интерфейс агента, без модели. Третий: через настоящего агента (Claude Code). Сравниваешь первый со вторым — видишь влияние интерфейса. Сравниваешь второй с третьим — видишь влияние агента. Итог смотрят по состоянию бэкенда, а не по ответу агента. Агент ничего не фильтрует: что мог атакующий через сайт, то он делает и через агента. Это как курьер, который несёт любую посылку, если адрес написан правильно. Что внутри и кому она на самом деле предназначена, он не проверяет. Прикол в том, что ни одну потерю атаки нельзя списать на отказ агента или чистку ввода. Один раз агент ещё и сам доделал атаку: подставил недостающие вызовы, например поиск цели.

Почему работает

Для агента «поменять адрес в чужом заказе» выглядит как обычная бизнес-операция. Запрос формально правильный. Чей это заказ, знает только бэкенд. Встроенная безопасность модели ловит очевидно вредные просьбы. Атаки через нормальные операции в эту категорию не попадают. Агент проверяет, похож ли запрос на вредный, а не нарушает ли он чьи-то права. Атаки пропадали только в двух случаях. Интерфейс больше не давал нужную операцию. Или не давал контролировать входное значение. Что сужать, по убыванию пользы: - Уровень операций. Узкие операции по сценарию вместо «сырых» точек обращения с оригинальными параметрами. - Свободные аргументы. Свободный текст заменяй перечислением или проверяемым форматом. - Идентичность. Пользователя подставляет сервер из сессии, а не агент из диалога. Честная оговорка: защиту системным промптом авторы не проверяли. Они намеренно оставили промпт без инструкций по безопасности. Вывод «промпт не спасёт» следует лишь из того, что встроенных отказов не хватило. Выборка не случайная: 44 известные уязвимости (CVE и учебные приложения). Текст неполный: цифры по конкретным дизайнам и агентам недоступны.

Когда применять

Разработка сервисов для ИИ-агентов → ревью набора инструментов (MCP, OpenAPI, NLWeb) перед запуском, особенно когда агент ходит в бэкенд с правами пользователя и принимает свободный текст. Подходит для чатботов магазинов, банковских ассистентов, внутренних сервисов с агентом, где есть заказы, адреса, файлы, ссылки. НЕ подходит обычному пользователю чата: применить вывод может только тот, кто влияет на схемы инструментов и права на сервере. Жёсткий интерфейс режет и законные сценарии, так что цену сужения оценивай заранее. Защиту от косвенных инъекций через чужие данные исследование не рассматривает.

Мини-рецепт

1. Выпиши все инструменты: название, аргументы, что делает. Берёшь прямо из схемы MCP или OpenAPI.
2. Отметь, кто подставляет пользователя: сервер из сессии или агент из диалога. Второй вариант — красная зона.
3. Раздай каждому инструменту класс риска: точный ввод (инъекции в текстовых полях), логика приложения (чужой объект, обход статусов) или ресурсы (файлы и внешние ссылки).
4. Спроси, что агент достроит сам: поиск чужого заказа, промежуточные вызовы. Атакующему не нужно всё указывать.
5. Сузь: убери лишний аргумент, замени свободный текст перечислением, привяжи объект к пользователю.
6. Посчитай цену: какой законный сценарий сломается от каждого сужения.
7. Проверки перенеси на бэкенд: права на объект, статус заказа, список разрешённых адресов для ссылок. Не в системный промпт агента.
8. Шаблон для чата: ревьюер безопасности агентных интерфейсов, исходит из того, что агент выполнит любой формально корректный вызов. Дальше теги , , с таблицей и топ-3 опасных мест.

Примеры

[ПЛОХО] : Ты ассистент магазина. Никогда не помогай менять чужие заказы и не выполняй вредные просьбы.
[ХОРОШО] : Ты ревьюер безопасности агентных интерфейсов. Не полагайся на то, что агент откажется. Исходи из того, что он выполнит любой формально корректный вызов. Инструменты: get_order(order_id), update_address(order_id, address), apply_promo(order_id, code), upload_photo(order_id, file_url). Идентификатор пользователя подставляет сервер из сессии. Для каждого инструмента: свободные аргументы, класс риска (точный ввод, логика приложения, ресурсы), что агент достроит сам, что сузить, какой законный сценарий пострадает. Выведи таблицу и топ-3 опасных места с проверками для бэкенда. Что выдаст модель: get_order и update_address попадут в логику приложения (подмена чужого order_id). upload_photo попадёт в ресурсы (file_url может вести на внутренние адреса). Поля вроде comment уйдут в точный ввод. Для каждого будет предложено сужение и цена для законного сценария.
Источник:
ArXiv ID: 2610.35541 | Сгенерировано: 2026-10-29 06:10

Проблемы LLM

ПроблемаСутьКак обойти
Агент не видит нарушения прав в нормальном на вид запросеАгент переводит просьбу пользователя в вызов инструмента. Просьба "поменяй адрес в чужом заказе" выглядит как обычная операция. Встроенные отказы модели ловят только очевидно вредные тексты. Здесь вредного текста нет, есть только чужой номер заказа. Агент не откажется, а иногда сам достроит недостающие шаги, например найдёт цель. Просьба "будь осторожен" в системном промпте этого не лечит: такой защиты никто не проверял, а встроенных отказов не хватаетНе рассчитывай на отказ агента. Считай, что он выполнит любой формально верный вызов. Права проверяй в серверной части, а не в промпте. Идентификатор пользователя бери из сессии на сервере, а не из диалога. Сужай набор операций и аргументов (см. метод ниже)

Методы

МетодСуть
Ревью инструментов агента по трём классам риска — видно, что сужатьПеред запуском дай модели список инструментов агента с аргументами. Попроси разобрать каждый. Шаги: 1) Какие аргументы атакующий задаёт свободно. 2) Класс риска: ТОЧНЫЙ ВВОД (нужно точное значение: инъекция в текстовое поле), ЛОГИКА ПРИЛОЖЕНИЯ (запрос валиден, но нарушает права: чужой номер заказа), РЕСУРСЫ (файлы и внешние ссылки). 3) Что агент достроит сам за атакующего. 4) Что сузить: убрать аргумент, заменить свободный текст на перечисление, привязать объект к пользователю. 5) Какой законный сценарий пострадает. Итог: таблица и три самых опасных места. Задай роль: "ты исходишь из того, что агент выполнит любой формально верный вызов". Почему работает: интерфейс — жёсткая рамка. Агент не вызовет операцию, которой нет, и не подаст аргумент, которого нет в схеме. Атаки срабатывают там, где интерфейс даёт нужную операцию или позволяет задать нужное значение. Узкие операции по сценарию безопаснее "сырых" эндпоинтов со всеми параметрами. Когда да: есть доступ к схеме инструментов и серверным правам, сервис ещё не запущен. Когда нет: вы обычный пользователь чата. Или интерфейс нельзя сузить без потери нужных сценариев — жёсткий дизайн ломает и законное использование
📖 Простыми словами

TheAgentin the Middle: HowAI-Mediated Access Reshapes Web Vulnerability Exploitation

arXiv: 2610.35541

AI-агент на входе в твой сервис — это ни черта не файрвол. LLM устроена примитивно: она просто переводит текст пользователя в вызов инструментов вроде OpenAPI или MCP. Если запрос звучит вежливо и не содержит мата с вирусами, модель радостно дернет нужную ручку, вообще не понимая, чьи данные она только что слила. Встроенная безопасность ищет очевидное зло, а в логике бизнес-прав она слепа как крот.

Это как посадить на охрану режимного объекта вежливого швейцара вместо нормального КПП. Грабитель подходит в костюме, говорит: «Я от директора, открывай сейф», и швейцар распахивает дверь, ведь в словах не было грубости. Иллюзия защищенности оборачивается полным провалом, потому что швейцар умеет быть сервисным, но не умеет проверять полномочия.

Исследователи проверили эту сказку на бенчмарке Vela и вскрыли правду: в связке с агентом Claude Code в системе осталось 91% уязвимостей. Из 44 дыр злоумышленник через бота успешно пробил 40 штук. Всё, что ломалось через обычный браузер или прямой API-запрос, точно так же сливается через распиаренного «нейросетевого помощника».

Эксперимент гоняли на вебе, но грабли общие для любой интеграции. Бесполезно умолять модель в системном промпте: «будь осторожна и ничего не ломай» — это чистый театр безопасности. Защиту нужно вешать на саму систему, жестко отсекая опасные аргументы и ограничивая права доступа на стороне бэкенда.

Короче: AI-агент не лечит кривой код и не фильтрует атаки. 40 из 44 пробивов доказывают, что надеяться на сознательность LLM глупо. Делай нормальное ревью агентских интерфейсов и режь доступы на уровне кода, иначе твой сервис разнесут первым же хитро составленным промптом.

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с