CVE-2026-33940

HIGH CVSS 3.1: 8,1 EPSS 0.06%
Обновлено 31 марта 2026
Handlebarsjs
Параметр Значение
CVSS 8,1 (HIGH)
Уязвимые версии 4.0.0 — 4.7.9
Устранено в версии 4.7.9
Тип уязвимости CWE-843 (Смешение типов), CWE-94 (Внедрение кода)
Поставщик Handlebarsjs
Публичный эксплойт Нет

Handlebars предоставляет пользователям возможность создавать семантические шаблоны. В версиях с 4.0.0 по 4.7.8 созданный объект, помещенный в контекст шаблона, может обойти все условные защиты в `resolvePartial()` и заставить `invokePartial()` вернуть `undefed`. Затем среда выполнения Handlebars рассматривает неразрешенный фрагмент как источник, который необходимо скомпилировать, передавая созданный объект в env.compile().

Поскольку объект представляет собой допустимый AST Handlebars, содержащий внедренный код, сгенерированный код JavaScript выполняет произвольные команды на сервере. Атака требует, чтобы злоумышленник контролировал значение, которое может быть возвращено в результате динамического частичного поиска. Версия 4.7.9 устраняет проблему.

Доступны некоторые обходные пути. Во-первых, используйте сборку только во время выполнения (`require('handlebars/runtime')`). Без `compile()` резервный путь компиляции в `invokePartial` недоступен.

Во-вторых, очистите данные контекста перед рендерингом: убедитесь, что никакое значение в контексте не является непримитивным объектом, который можно было бы передать в динамический партиал. В-третьих, избегайте динамических частичных поисков (`{{> (lookup ...)}}`), когда контекстные данные контролируются пользователем.

Показать оригинальное описание (EN)

Handlebars provides the power necessary to let users build semantic templates. In versions 4.0.0 through 4.7.8, a crafted object placed in the template context can bypass all conditional guards in `resolvePartial()` and cause `invokePartial()` to return `undefined`. The Handlebars runtime then treats the unresolved partial as a source that needs to be compiled, passing the crafted object to `env.compile()`. Because the object is a valid Handlebars AST containing injected code, the generated JavaScript executes arbitrary commands on the server. The attack requires the adversary to control a value that can be returned by a dynamic partial lookup. Version 4.7.9 fixes the issue. Some workarounds are available. First, use the runtime-only build (`require('handlebars/runtime')`). Without `compile()`, the fallback compilation path in `invokePartial` is unreachable. Second, sanitize context data before rendering: Ensure no value in the context is a non-primitive object that could be passed to a dynamic partial. Third, avoid dynamic partial lookups (`{{> (lookup ...)}}`) when context data is user-controlled.

Характеристики атаки

Способ атаки
По сети
Атака возможна удалённо
Сложность
Высокая
Сложно эксплуатировать
Нужны права
Не требуются
Права не нужны
Участие пользователя
Не требуется
Не нужно действие пользователя

Последствия

Конфиденциальность
Высокое
Полная утечка данных
Целостность
Высокое
Полная модификация данных
Доступность
Высокое
Полный отказ в обслуживании

Строка CVSS v3.1

Уязвимые продукты 1

Конфигурация От (включительно) До (исключительно)
Handlebarsjs Handlebars
cpe:2.3:a:handlebarsjs:handlebars:*:*:*:*:*:node.js:*:*
4.0.0 4.7.9