Skip to main content
← All vulnerabilities
CVE-2026-33916GHSA-2QVQ-RJWJ-GVW9

Handlebars.js has Prototype Pollution Leading to XSS through Partial Template Injection

Published
Last modified
published
Not listed in CISA KEV
Fix
Fixed in 4.7.9
None on Exploit-DB, Metasploit or GitHub
  • Exploitation: poc
  • Automatable: no
  • Technical impact: partial

Summary

Handlebars provides the power necessary to let users build semantic templates. In versions 4.0.0 through 4.7.8, `resolvePartial()` in the Handlebars runtime resolves partial names via a plain property lookup on `options.partials` without guarding against prototype-chain traversal. When `Object.prototype` has been polluted with a string value whose key matches a partial reference in a template, the polluted string is used as the partial body and rendered without HTML escaping, resulting in reflected or stored XSS. Version 4.7.9 fixes the issue. Some workarounds are available. Apply `Object.freeze(Object.prototype)` early in application startup to prevent prototype pollution. Note: this may break other libraries, and/or use the Handlebars runtime-only build (`handlebars/runtime`), which does not compile templates and reduces the attack surface.

Timeline

  1. CVE published
  2. CISA SSVC assessment

    Exploitation: poc · Automatable: no · Technical impact: partial

  3. Record last updated

Affected versions

  • handlebars-lang handlebars.js

    From 4.0.0 · fixed in 4.7.9

  • handlebarsnpm

    From 4.0.0 · fixed in 4.7.9

References 3

GitHub · handlebars-lang/handlebars.js