В последнее время появляется множество предупреждений об уязвимостях, связанных с непрямыми атаками через prompt injection. Главный вывод: LLM легковерны, и никто не знает, как сделать их полностью устойчивыми. Следовательно, ни одна ИИ-система не безопасна.
Это, конечно, чистая правда, и внимание, которое привлекают такие атаки, можно только приветствовать, но главный вопрос остаётся без ответа: что со всем этим делать?
Пуристы потребовали бы запретить любой внешний ввод, способный привести к prompt injection, но, честно говоря, я бы не был столь категоричен. Множество по-настоящему полезных приложений опирается на внешний ввод, так что, боюсь, нам придётся отступить к последнему рубежу: инженерной дисциплине.
Существуют разные схемы, где хитрое взаимодействие нескольких моделей минимизирует их уязвимость к атакам (см., например, статью о CaMeL). Мне, однако, кажется, что мы уделяем недостаточно внимания простой санитизации входных данных.
Многие такие атаки полагаются на текст, скрытый от человека, но видимый машине. Обнаружить и удалить такой текст относительно тривиально (в программистском смысле), хотя работать придётся уже на уровне контейнера, за пределами самого текста. Эта техника (называемая, кстати, Content Disarm & Reconstruction) существует уже довольно давно. Честно говоря, я удивлён, что она не внедрена повсеместно. Все атаки она не предотвратит, но жизнь неискушённому атакующему заметно усложнит.
А тем, кто настаивает, что 99% в безопасности — это незачёт, хочу напомнить фундаментальный принцип: стопроцентно защищённых систем не бывает. Роль безопасности в том, чтобы сделать атаку дороже потенциальной выгоды от неё (см. модель Гордона — Лоэба).
С этой парадигмой в голове мы можем строить надёжные и безопасные ИИ-системы даже из небезопасных по отдельности компонентов.