CVE-2026-33940

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.
Configurations

Configuration 1 (hide)

cpe:2.3:a:handlebarsjs:handlebars:*:*:*:*:*:node.js:*:*

History

26 Oct 2026, 22:10

Type Values Removed Values Added
Summary
  • (es) Handlebars proporciona la potencia necesaria para permitir a los usuarios construir plantillas semánticas. En las versiones 4.0.0 hasta la 4.7.8, un objeto especialmente diseñado colocado en el contexto de la plantilla puede eludir todas las protecciones condicionales en ’resolvePartial()’ y hacer que ’invokePartial()’ devuelva ’undefined’. El tiempo de ejecución de Handlebars entonces trata el parcial no resuelto como una fuente que necesita ser compilada, pasando el objeto especialmente diseñado a ’env.compile()’. Debido a que el objeto es un AST de Handlebars válido que contiene código inyectado, el JavaScript generado ejecuta comandos arbitrarios en el servidor. El ataque requiere que el adversario controle un valor que pueda ser devuelto por una búsqueda de parcial dinámico. La versión 4.7.9 corrige el problema. Algunas soluciones alternativas están disponibles. Primero, use la compilación solo en tiempo de ejecución (’require(’handlebars/runtime’)’). Sin ’compile()’, la ruta de compilación de respaldo en ’invokePartial’ es inalcanzable. Segundo, sanee los datos del contexto antes de renderizar: Asegúrese de que ningún valor en el contexto sea un objeto no primitivo que pueda ser pasado a un parcial dinámico. Tercero, evite las búsquedas de parciales dinámicos (’{{> (lookup ...)}}’) cuando los datos del contexto son controlados por el usuario.

Information

Published : 2026-03-27 22:16

Updated : 2026-10-26 22:10


NVD link : CVE-2026-33940

Mitre link : CVE-2026-33940

CVE.ORG link : CVE-2026-33940


JSON object : View

Products Affected

handlebarsjs

  • handlebars
CWE
CWE-94

Improper Control of Generation of Code ('Code Injection')

CWE-843

Access of Resource Using Incompatible Type ('Type Confusion')