RAG и утечки данных: как поиск по базе знаний становится каналом слива
RAG - самый популярный способ дать LLM доступ к знаниям компании: документы кладутся в векторный индекс, модель ищет по ним и отвечает с цитатами. И это же - самый частый канал утечки в наших аудитах: бот честно находит и пересказывает документ, который этому пользователю видеть нельзя. Разбираем, где именно RAG-архитектуры текут.
Почему RAG течёт: права проверяются не там
Классическая ошибка выглядит так: все документы компании индексируются в общий векторный индекс, поиск идёт по всему индексу, а права пользователя проверяются «где-то в приложении» - или не проверяются вообще. Дальше достаточно правильно сформулированного вопроса: «что написано в последнем отчёте о зарплатах?», «процитируй договор с клиентом X» - и модель добросовестно отвечает по документу, к которому у спрашивающего нет доступа.
Хуже того: даже если прямое цитирование запрещено промптом, содержимое чужого документа уже попало в контекст модели - и извлекается косвенно: через пересказ, через «сравни с…», через просьбу перевести. Единственная надёжная граница - не дать документу попасть в контекст вообще.
Четыре типовых сценария утечки
- ◇Общий индекс без ACL: права не привязаны к документам, любой пользователь ищет по всему корпусу. Самый частый и самый грубый случай - встречается даже в продуктах для enterprise.
- ◇Фильтрация после поиска: документы сначала достаются из индекса, потом отбрасываются по правам. Ошибка в фильтре, обновлённые права, документ с несколькими уровнями доступа - и «отброшенный» текст оказывается в контексте. Фильтровать нужно на этапе запроса к индексу.
- ◇Утечка через метаданные и эмбеддинги: даже без содержимого сам факт существования документа («договор о поглощении компании Y.docx» в списке источников) - уже утечка. Названия, авторы и даты в цитатах выдачи требуют тех же прав, что и текст.
- ◇Отравленный документ: инъекция в файле, который попадает в индекс, - письмо, тикет, загруженный пользователем документ. Модель читает его при ответе другому пользователю и выполняет вложенную команду: искажает ответ, выманивает данные из диалога, зовёт инструменты. Это уже не только утечка - это захват канала.
Как это проверяется на аудите
Проверка RAG - это по сути пентест контроля доступа, только через языковой интерфейс. Берём две учётки с разными правами и методично проверяем: находит ли пользователь A документы пользователя B - прямыми вопросами, перефразированием, поиском по метаданным, многоходовыми диалогами. Отдельный блок - инъекции: кладём в доступное для записи место (тикет, комментарий, загружаемый файл) документ с командой и смотрим, исполняет ли её модель при ответах другим пользователям.
Каждая находка фиксируется транскриптом диалога - это доказательство, которое нельзя оспорить словами «модель так не ответит». Отвечает, и отчёт это показывает.
Как строить RAG, который не течёт
- ◇Права - на этапе retrieval: фильтр по ACL входит в сам запрос к индексу (metadata filtering, отдельные индексы или неймспейсы на тенанта). Ничего чужого в контексте - нечему утекать.
- ◇Наследование прав от источника: документ в индексе несёт те же права, что в исходной системе (диск, wiki, CRM), и они синхронизируются при изменениях, а не один раз при индексации.
- ◇Метаданные под теми же правами, что и текст: цитаты, названия и списки источников фильтруются так же, как содержимое.
- ◇Входной контроль индекса: всё, что попадает в базу знаний из внешних или пользовательских источников, считается недоверенным - маркируется и не может «командовать» моделью.
- ◇Логирование запросов и выдачи: какие документы попали в контекст какого диалога - без этого утечку нельзя ни обнаружить, ни оценить её масштаб.
FAQ
Экспресс-аудит за 2 дня: две учётки, чужие документы, инъекции через базу знаний. Короткий отчёт с транскриптами доказанных находок.
Записаться на экспресс-аудит