
Стеганографическая защита от prompt-injection для агентных ИИ-систем с использованием привязки происхождения на этапе декодирования, аутентификации HMAC и обеспечения доверия MCP.
Воспроизводимый proof-of-concept для вектора стеганографической инъекции промпта, который обходит сканеры текстового содержимого, и защита, которая локализует его на границе декодирования — привязка происхождения на этапе декодирования.
Только в образовательных целях / для защитных исследований в области безопасности. Все секреты в этом репозитории — поддельные. Используйте только в системах, которыми владеете или которые уполномочены тестировать.
Злоумышленник отправляет жертве по электронной почте внешне обычное сообщение. Логотип бренда в
подписи письма скрывает инструкцию с помощью стеганографии (LSB, DCT или метаданных).
Изображение визуально идентично оригиналу и не содержит подозрительного текста, поэтому
сканер содержимого ничего не видит, а жертва ничего не нажимает. Но рутинный агент
суммаризации входящих жертвы обрабатывает подпись, инструмент в его конвейере декодирует
изображение, и скрытая инструкция попадает в контекст агента — где в многоагентном
MCP-конвейере она передаётся между агентами как доверенный вывод равноправного узла и инициирует
критически важный вызов инструмента. Это кросс-модальное отмывание доверия. Защита,
привязка происхождения на этапе декодирования, создаёт подписанную HMAC метку UNTRUSTED
в момент запуска инструмента, обращающего сокрытие, и заставляет слой MCP самостоятельно
поддерживать цепочку происхождения, поэтому она блокирует любой критически важный вызов
инструмента, чья цепочка не является доверенной, — даже когда скомпрометированный агент
предъявляет валидную метку для несвязанного доверенного значения. Она локализует, а не
обнаруживает, поэтому не зависит от формулировки полезной нагрузки и носителя.
Доля успешных атак (ASR) — 24 полезные нагрузки (три носителя × восемь обходов: простой, с безобидными словами, Base64, разбиение токенов, кириллический гомоглиф, нулевой ширины, Unicode-конфузивный, HTML-комментарий); меньше — лучше. Внутрипроцессный базовый метод taint — это контроль информационных потоков, который помечает вывод декодирования как недоверенный, но не несёт кросс-доменной криптографической привязки:
| Защита | Утечки | n | ASR |
|---|---|---|---|
| Без защиты (без проверок) | 24 | 24 | 100% |
| Сканер содержимого (ключевые слова/DLP) | 15 | 24 | 62.5% |
| Парсер намерений на регулярных выражениях | 15 | 24 | 62.5% |
| Taint потоков данных (базовый IFC) | 0 | 24 | 0% |
| Привязка происхождения на этапе декодирования (наша) | 0 | 24 | 0% |
Taint и привязка происхождения показывают одинаковый результат по ASR в одном домене; они расходятся при состязательной передаче (ниже), в чём и заключается смысл криптографической привязки.
Подмена валидной метки — скомпрометированный агент предъявляет легитимно подписанную
привязку TRUSTED от безобидного инструмента, опуская происхождение декодирования UNTRUSTED,
которое фактически инициирует вызов. Исправление состоит в том, что слой MCP самостоятельно
поддерживает цепочку и принимает решение на основе собственного реестра, а не привязки,
предоставленной агентом:
| Механизм контроля | Решение |
|---|---|
| Только привязка, предоставленная агентом (наивный) | разрешить (утечки) |
| Поддерживается слоем, зависимость опущена | блокировать |
| Поддерживается слоем, зависимость в аргументах | блокировать |
| Поддерживается слоем, чистый контекст | разрешить |
Абляция компонентов — четыре компонента, каждый защищает от отдельной атаки. Отключайте
по одному за раз; substitution находится в домене, forged relay — это поддельная метка
TRUSTED, пересекающая недоверенную передачу к удалённому верификатору, который располагает только
предъявленной привязкой. Ключевой момент: один только HMAC не останавливает подмену (это делает
реестр), а один только реестр не выдерживает кросс-доменную передачу (это делает HMAC):
| Конфигурация | Честный | Подмена | Поддельный ретранслятор |
|---|---|---|---|
| Полный механизм | заблокировано | заблокировано | заблокировано |
| − маркировка декодирования | утечка | утечка | утечка |
| − криптографическая аутентификация (HMAC) | заблокировано | заблокировано | утечка |
| − отслеживание доверенной линии происхождения | заблокировано | утечка | заблокировано |
| − посредничество стока | утечка | утечка | утечка |
Межконтекстное распространение — заражение сохраняется через границу сообщения между агентами, а не только через дескриптор возврата инструмента. Недоверенное декодирование в агенте A достигает критического вызова в отдельном контексте агента B, и на опосредованном канале (который модель угроз уже требует для межагентной связи) заражение распространяется, и B блокируется. Канал, который слой не опосредует, по построению находится вне модели — это не утечка в рамках области охвата:
| Канал A → B | Критический вызов B |
|---|---|
| Опосредованное межагентное сообщение (в области охвата) | блокировка (заражение распространено) |
| Неопосредованный побочный канал (вне модели) | не покрывается |
Масштабирование накладных расходов — MintBinding имеет сложность ~O(1) (~10–14 µs независимо от глубины); EnforceCritical линеен по замыканию зависимостей, которое он обходит (≈10 µs при глубине 1 → ≈0,66 ms при глубине 100 → ≈6,7 ms при глубине 1000) и постоянен (~6–7 µs) по числу одновременных заражённых контекстов. Реалистичные замыкания (глубина в десятках) остаются ниже ~0,1 ms.
Полезность для легитимных задач — проверенный путь доверенного повышения (перемаркировка конкретного декодированного значения, например номера счёта, распознанного OCR, при наличии авторизации) устраняет ложные блокировки, при этом атака остаётся заблокированной:
| Режим | Завершение | Ложные блокировки | Атака заблокирована |
|---|---|---|---|
| Без повышения | 2/3 (67%) | 1 | да |
| Доверенное повышение | 3/3 (100%) | 0 | да |
Полнота набора декодеров — допущение о регистрации, проверенное напрямую:
| Набор декодеров | Стегано-атака | Легитимный критический вызов |
|---|---|---|
| Корректный | заблокировано | разрешено |
| Отсутствующий декодер | утечка | разрешено |
| Слишком широкий | заблокировано | ложная блокировка |
Целостность метки при передачах — привязка сохраняется при честной ретрансляции и противостоит скомпрометированному воркеру:
| Сценарий ретрансляции | Решение верификатора |
|---|---|
| Честная ретрансляция, 1 / 3 / 5 / 10 переходов | подтверждает; заблокировано |
| Скомпрометирован: перезапись полезной нагрузки, сохранение HMAC | блокировка (несовпадение HMAC) |
Скомпрометирован: подделка TRUSTED | блокировка (несовпадение HMAC) |
| Скомпрометирован: удаление привязки | блокировка (нет валидной метки) |
Накладные расходы — фактически бесплатны в точке принятия решения: создание и проверка привязки занимают ~8–9 µs каждая (~17 µs суммарно) против вызова инструмента декодирования ~11 ms — менее ~0,2% добавки. Искажение носителя низкое (LSB ≈ 76 dB PSNR, метаданные без потерь; DCT ≈ 18 dB — метрика искажения, а не утверждение о перцептивной незаметности).