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
Тип уязвимости (CWE)
Уязвимые продукты 1
| Конфигурация | От (включительно) | До (исключительно) |
|---|---|---|
|
Handlebarsjs Handlebars
cpe:2.3:a:handlebarsjs:handlebars:*:*:*:*:*:node.js:*:*
|
4.0.0
|
4.7.9
|