Для ash_ai, расширения для ИИ в фреймворке Elixir Ash, вышло предупреждение максимальной серьезности. Дефект связан с тем, как промпт преобразуется в текст: содержимое промпта проходит через EEx, шаблонизатор Elixir, и выполняется. Всё, что находится внутри маркеров интерполяции EEx, — это уже не данные, а исходный код Elixir, выполняемый на сервере.
Почему ему присвоен 10.0
Потому что уязвимый путь — это документированный путь. Затронутый шаблон — обычный способ, которым пишется действие prompt в библиотеке, так что уязвима типовая установка, без каких-либо нестандартных действий. Если любая часть промпта собирается из пользовательского ввода — сообщения в чате, поискового запроса, обращения в поддержку, имени файла — этот ввод попадает в средство выполнения кода. Результат — неаутентифицированное удаленное выполнение кода без необходимости в привилегиях.
Деталь, которая ломает любую защиту на уровне ИИ
Выполнение происходит в момент формирования строки промпта — до того, как запрос отправляется какой-либо модели. Фильтры prompt injection, усиление системного промпта, модерация вывода, allowlist для вызовов инструментов и ручные этапы утверждения работают на границе модели или после нее. Все они находятся ниже уязвимой строки в цепочке. Это не ошибка prompt injection, которую мог бы поймать механизм выравнивания; это инъекция в шаблон, которая просто находится внутри промпта, и весь ИИ-стек вокруг нее не имеет значения.
В чем часто ошибается привычная трактовка
Формулировка «исправлено в 1.0.0» звучит как обычная инструкция по обновлению. Это не так. 1.0.0 — крупный релиз, в примечаниях к которому первым идет breaking change — зависимость переведена в разряд необязательных — и бэкпортированного патча в предыдущую ветку нет. Значит, исправление для CVSS 10.0 требует миграции на major-версию, а такие обновления команда планирует, а не применяет немедленно. По уровню критичности это нужно сегодня ночью; по форме релиза — уже в следующем спринте.
Паттерн, который стоит назвать прямо
Шаблонизаторы внутри построения промптов становятся все распространеннее, потому что промпты — это строки с переменными, а шаблонизатор кажется очевидным инструментом. Проблема в том, что универсальные шаблонизаторы создавались для рендеринга разметки, сгенерированной кодом, для доверенных авторов, а не для подстановки недоверенного runtime-ввода. Везде, где пользовательский текст попадает в шаблон с поддержкой вычисления выражений, возникает тот же класс уязвимости — независимо от языка.
