REDHAT-BUG-2452508: High severity Handlebars Handlebars vulnerability
Handlebars provides the power necessary to let users build semantic templates. In versions 4.0.0 through 4.7.8, when a Handlebars template contains decorator syntax referencing an unregistered decorator (e.g. {{n}}), the compiled template calls lookupProperty(decorators, "n"), which returns undefined. The runtime then immediately invokes the result as a function, causing an unhandled TypeError: ... is not a function that crashes the Node.js process. Any application that compiles user-supplied templates without wrapping the call in a try/catch is vulnerable to a single-request Denial of Service. Version 4.7.9 fixes the issue. Some workarounds are available. Wrap compilation and rendering in try/catch. Validate template input before passing it to compile(); reject templates containing decorator syntax ({{...}}) if decorators are not used in your application. Use the pre-compilation workflow; compile templates at build time and serve only pre-compiled templates; do not call compile() at request time.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
Handlebarsto a version that resolves this vulnerability.Fixed in 4.7.9 - Configuration
Use the pre-compilation workflow: compile templates at build time and serve only pre-compiled templates; do not call `compile()` at request time.
Handlebars template compilation workflow request-time template compilation (compile()) = disabled - Configuration
Validate template input before passing it to `compile()`; reject templates containing decorator syntax (`{{*...}}`) if decorators are not used in your application.
Handlebars template input validation decorator syntax allowance = reject `{{*...}}` when decorators are not used - Configuration
Wrap compilation and rendering in `try/catch` to prevent unhandled `TypeError: ... is not a function` from crashing the Node.js process.
Node.js runtime handling of Handlebars compilation/rendering error handling for compilation and rendering = wrap in try/catch