← AI agent security: from prompt injection to the OWASP LLM Top 10
04 / 07 · 50 min

Sandboxing, permission scoping, and least-privilege tools

How to limit what an agent can do at all: environment isolation, narrow tools, short-lived minimally scoped tokens, and human approval gates.

Lesson content is currently available in Russian.

What you will learn

  • →Распознавать избыточные привилегии и опасные инструменты в архитектуре агента.
  • →Предотвращать эскалацию через sandboxing, least-privilege инструменты и скоупинг токенов.
  • →Реагировать на риск, встраивая human approval gates и dual-LLM в критичные операции.

Sandboxing: ограничить радиус поражения

Раз модель считается скомпрометируемой, задача — заранее ограничить радиус поражения удавшейся атаки. Sandboxing изолирует исполнение агента от остальной системы. Если агент выполняет код или команды, они должны идти в одноразовом контейнере или микро-VM с минимальной файловой системой, без доступа к секретам хоста, с квотами на CPU/память/время и, критично, с контролем сети.

Сетевая изоляция (egress control) здесь — половина дела. Даже идеально песочный код бесполезно изолирован, если из песочницы открыт весь интернет: это готовый канал эксфильтрации из прошлого урока. Практика — default-deny на исходящие соединения и allowlist только нужных адресов; всё остальное блокируется на сетевом уровне, а не «просьбой к модели».

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

Least privilege в дизайне инструментов

Самый мощный рычаг безопасности агента — не в модели, а в наборе инструментов, которые вы ей дали. Принцип наименьших привилегий: агент получает ровно те возможности, что нужны его задаче, и ни одной сверх. Инструмент execute_sql(query) с произвольным запросом — это фактически полный доступ к базе; вместо него дайте узкие операции: get_order_status(order_id), list_user_invoices(user_id). Узкий инструмент валидирует аргументы детерминированным кодом и физически не способен сделать то, чего в нём не предусмотрено.

Разделяйте чтение и запись: read-only инструменты гораздо безопаснее и их можно давать щедрее. Опасные действия (удаление, отправка наружу, платёж, изменение прав) выносите в отдельные, редкие, обвешанные проверками инструменты. Полезная практика — allowlist инструментов на сценарий: агент поддержки не должен иметь в своём наборе инструмент деплоя, даже если технически мог бы.

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

Скоупинг токенов и идентичность агента

Инструменты ходят во внешние системы под какими-то учётными данными — и здесь чаще всего прячется избыточная привилегия. Антипаттерн: единый сервисный токен с широкими правами, зашитый в агента; любая удавшаяся инъекция наследует всю его мощь. Правильный подход — минимальный скоуп и короткое время жизни. OAuth-скоупы выдаются под конкретную операцию (repo:read, а не repo), токены живут минуты, а не месяцы, и по возможности привязаны к ресурсу.

По возможности агент должен действовать от имени пользователя и в границах его прав (delegated access), а не под всемогущим сервис-аккаунтом. Тогда даже полностью захваченный агент не выйдет за пределы того, что дозволено этому пользователю, — цена инцидента резко падает. Секреты не кладут в промпт или в код инструмента: их держит окружение/секрет-менеджер, а инструмент получает уже готовый узкий токен.

Отдельно — идентичность и аудит: каждое действие агента должно быть атрибутируемо (какой агент, от чьего имени, каким токеном), чтобы при инциденте можно было мгновенно отозвать конкретные права. OWASP в редакции 2025 выделяет «Excessive Agency» (LLM06) как отдельный риск именно про избыток разрешений, автономности и функциональности. Скоупинг токенов — прямой ответ на этот риск: сузить полномочия так, чтобы даже полный контроль над моделью давал атакующему минимум.

Human approval gates и dual-LLM

Некоторые действия слишком опасны, чтобы доверять их автономному решению модели: перевод денег, удаление данных, рассылка внешним адресатам, изменение прав доступа, деплой в прод. Для них ставят human-in-the-loop — approval gate: агент готовит действие, но выполнение требует явного подтверждения человека, которому показывают, что именно и с какими аргументами будет сделано. Важно, чтобы решение принимал детерминированный код (это действие → нужен аппрув), а не сама модель решала, спрашивать ли разрешение.

Гейты стоит ставить по риску, а не на всё подряд: слишком частые подтверждения приучают людей нажимать «ок» не глядя (alert fatigue), и защита деградирует. Дизайн — редкие, но содержательные подтверждения на действительно необратимых операциях.

Архитектурный паттерн, снижающий число гейтов, — dual-LLM (Simon Willison). Привилегированная модель управляет инструментами, но не видит сырой недоверенный контент; карантинная модель обрабатывает недоверенные данные, но не имеет доступа к привилегированным инструментам. Между ними — строго типизированный, ограниченный интерфейс. Так недоверенный текст не может напрямую спровоцировать привилегированное действие. Вместе least privilege, скоуп токенов, sandbox, approval gates и dual-LLM образуют оборону, которая держится, даже когда модель обманута, — а мы уже приняли, что рано или поздно так и будет.

Practice

Аудит разрешений и гейтов

Составьте реестр всех инструментов агента и всех токенов/учёток, под которыми они ходят. Для каждого инструмента ответьте: read или write, какой минимальный скоуп реально нужен, что сделает атакующий, полностью управляющий аргументами, нужен ли approval gate.

Deliverable

Таблица «инструмент → права → минимально необходимый скоуп → нужен ли гейт» и план сокращения: какие широкие токены заменить узкими короткоживущими, какие инструменты разбить на узкие, где добавить human approval.

Checkpoint

Объясните, почему набор инструментов и скоуп токенов — более надёжная граница безопасности, чем инструкции в промпте.

  • ✓ Сказано, что модель может вызвать только предоставленные функции, и инъекция это не переписывает.
  • ✓ Показана связь least privilege и скоупа токенов с ограничением радиуса поражения.
  • ✓ Названо, какие действия закрываются human approval gate и почему их не должно быть слишком много.

Check yourself

Почему узкий инструмент безопаснее универсального (например, get_order_status вместо execute_sql)?

01Почему узкий инструмент безопаснее универсального (например, get_order_status вместо execute_sql)?

Зачем нужен egress control в песочнице агента?

02Зачем нужен egress control в песочнице агента?

В чём смысл скоупинга токенов и delegated access?

03В чём смысл скоупинга токенов и delegated access?

Как правильно применять human approval gates?

04Как правильно применять human approval gates?

В чём идея dual-LLM паттерна?

05В чём идея dual-LLM паттерна?

Sources

Sandboxing, permission scoping, and least-privilege tools · AI agent security: from prompt injection to the OWASP LLM Top 10 · VORCL