10 из 10 по CVSS: уязвимость в Prompty позволяла выполнять произвольный код в Node.js через файлы .prompty
Критическая уязвимость обнаружилась в Prompty, открытом проекте Microsoft для разработки приложений на базе больших языковых моделей. Ошибка позволяла специально подготовленному файлу .prompty выйти за пределы обычной обработки шаблона и запустить произвольный JavaScript-код с правами процесса Node.js. Уязвимость получила максимальную оценку 10 из 10 по шкале CVSS.
Проблему обнаружили специалисты команды AppSec Research Positive Technologies при тестировании разрабатываемого инструмента на основе искусственного интеллекта (ИИ) для поиска уязвимостей. Недостаток зарегистрировали как CVE-2026-73299. Уязвимость затрагивала TypeScript-пакет @prompty/core версий до 0.1.4 включительно, а также ветку до 2.0.0-beta.4 включительно. Microsoft закрыла брешь в версиях 0.1.5 и 2.0.0-beta.5.
Prompty объединяет формат файлов .prompty и инструменты для создания, тестирования и запуска промптов в приложениях на базе генеративного ИИ. Файл состоит из YAML-конфигурации и тела промпта в Markdown, а также может содержать параметры модели, входные данные, инструменты и шаблонные конструкции. Разработчик способен использовать один файл в разных средах и подключать различные LLM-провайдеры.
Уязвимость относится к классу SSTI, или Server-Side Template Injection. При обработке файлов .prompty шаблонизатор Nunjucks недостаточно ограничивал доступ к объектам JavaScript. Специально сформированный шаблон позволял обратиться к свойствам constructor и prototype, выйти за пределы предусмотренной логики и добиться выполнения JavaScript внутри процесса Node.js.
Последствия эксплуатации зависели от прав процесса, в котором работало приложение. При достаточных привилегиях злоумышленник потенциально мог получить доступ к данным и секретам приложения, изменить файлы и настройки, вмешаться в работу сервисов или нарушить их доступность. Возможность выполнения произвольного кода с правами приложения стала причиной максимальной оценки опасности.
Обычного текстового запроса к языковой модели для эксплуатации CVE-2026-73299 недостаточно. Атака требует, чтобы приложение использовало уязвимую версию @prompty/core, обрабатывало файл .prompty через Nunjucks и получило специально подготовленный шаблон. В описании Microsoft отдельно указаны недоверенные, полученные от сообщества, клонированные и сгенерированные LLM файлы .prompty.
Повышенный риск возникает в системах, которые загружают подобные файлы из внешних репозиториев, принимают от сторонних разработчиков или создают автоматически с помощью языковых моделей. Файл с промптом в подобных сценариях уже нельзя считать исключительно текстовой инструкцией для LLM, поскольку шаблонная логика проходит обработку программным компонентом.
Для устранения проблемы Microsoft изменила рендерер Nunjucks. Исправленная реализация разрешает доступ только к собственным данным переданных объектов, блокирует переход через constructor и prototype, запрещает вызовы функций из шаблонов и очищает входные данные перед обработкой. Подстановка переменных, условия, циклы и обращение к обычным пользовательским данным при этом продолжают работать.
Защиту перенесли и в старую ветку @prompty/core. Отдельное исправление добавило аналогичные ограничения и тесты против SSTI, после чего появилась версия 0.1.5.
Уязвимость показывает, как развитие инструментов для генеративного ИИ меняет модель угроз для разработчиков. Файл с промптом может включать конфигурацию, шаблонные выражения и другие элементы, влияющие на работу приложения, поэтому получение подобных файлов из внешних источников создаёт риски, характерные для цепочки поставок программного обеспечения.
Пользователям уязвимых версий @prompty/core необходимо перейти как минимум на версию 0.1.5 в старой ветке или 2.0.0-beta.5 в новой.