@fastify/view в node.js@fastify/view — плагин для Fastify, который позволяет использовать шаблонизаторы (view engines) для генерации HTML-страниц на сервере.Ранее в модуле
@fastify/view для Node.js была зарегистрирована потенциальная уязвимость под идентификатором CVE-2025-47240. Однако после детального анализа выяснилось, что описанное поведение связано с неправильным использованием API со стороны разработчиков, а не с уязвимостью в самом программном обеспечении. В результате идентификатор CVE-2025-47240 был официально отозван.Тем не менее некоторые эксплойты, опубликованные в открытом доступе, продолжают ссылаться на этот идентификатор — это может вводить в заблуждение.
@fastify/view, который используется с движком EJS и шаблоном reply.view({ raw: <user-controlled-string> }) , позволяет выполнять произвольные EJS. Это приводит к удаленному выполнению кода (RCE).Детали неправильной конфигурации API
Ключевой ошибкой является небезопасное использование метода reply.view() из Fastify-плагина
@fastify/view. Рассмотрим следующий фрагмент уязвимого кода:
fastify.post('/render', (req, reply) => {
const template = req.body.text;
return reply.view({ raw: template }, { require }, { async: false });
});🫡 Сервер принимает POST-запрос на эндпоинт
/render.🫡
const template получает шаблон из тела сообщения без фильтрации 🫡
reply.view используется для рендеринга шаблона с помощью движка EJS🫡
{ raw: template } интерпретирует пользовательский ввод как шаблон🫡
{ require } передаёт в шаблон функцию require, давая полный доступ к Node.js API🫡
{ async: false } асинхронный рендерингЭксплуатация
Для успешной эксплуатации этой конфигурационной уязвимости достаточно отправить POST-запрос с произвольным телом, содержащим следующий шаблон EJS:
<%= (this.constructor.constructor('return process.mainModule.require')())('child_process').execSync('ls'); %>Этот код позволяет пользователю выполнять произвольный JavaScript-код на сервере. В нашем случае результатом выполнения кода станет вывод команды ls. Это классическая Server-Side Template Injection (SSTI), перерастающая в Remote Code Execution (RCE). Js-код внутри шаблона может быть любым❗️
Как защищаться
1️⃣ Никогда не используйте raw с пользовательским вводом
2️⃣ Используйте уже готовые шаблоны
3️⃣ Для детектирования попыток сканирования на эндпоинтах, использующих данную библиотеку, установите правило на обнаружение внедрения шаблона через подобное регулярное выражение
^<%.+%>$
