Description
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.
Published: 2026-03-27
Score: 4.7 Medium
EPSS: < 1% Very Low
KEV: No
Impact: Cross‑Site Scripting via unescaped prototype‑polluted parts
Action: Patch
AI Analysis

Impact

Handlebars.js versions 4.0.0 through 4.7.8 allow an attacker to inject a specially crafted property into Object.prototype. When the runtime resolves a partial name, it performs a plain property lookup on options.partials without guarding against prototype‑chain traversal. If Object.prototype contains a string value whose key matches a partial reference, that string is used as the partial body and rendered without HTML escaping, leading to reflected or stored XSS. The weakness is a Prototype Pollution flaw (CWE‑1321) combined with a Reflected XSS condition (CWE‑79).

Affected Systems

The vulnerability affects projects that use Handlebars.js versions 4.0.0 through 4.7.8, including any Node.js applications that depend on the handlebars-lang:handlebars.js library. Versions starting at 4.7.9 are not impacted.

Risk and Exploitability

The CVSS score is 4.7, indicating a low to moderate severity, and the EPSS score is below 1%, suggesting a low exploitation probability in the wild. The vulnerability is not listed in the CISA KEV catalog. An attacker would need to supply a template that references the polluted partial name; once executed, the malicious payload can execute arbitrary JavaScript within the victim’s browser context. The attack can be carried out from the client side if an attacker controls template rendering, making it a practical risk in web applications that allow dynamic template injection.

Generated by OpenCVE AI on March 31, 2026 at 19:42 UTC.

Remediation

No vendor fix or workaround currently provided.

OpenCVE Recommended Actions

  • Upgrade Handlebars.js to version 4.7.9 or later.
  • If an upgrade is not immediately possible, add Object.freeze(Object.prototype) at application startup to prevent further prototype pollution.
  • Consider migrating to the Handlebars runtime‑only build (handlebars/runtime) which does not compile templates and reduces the attack surface.

Generated by OpenCVE AI on March 31, 2026 at 19:42 UTC.

Tracking

Sign in to view the affected projects.

Advisories
Source ID Title
Github GHSA Github GHSA GHSA-2qvq-rjwj-gvw9 Handlebars.js has Prototype Pollution Leading to XSS through Partial Template Injection
History

Tue, 31 Mar 2026 18:00:00 +0000

Type Values Removed Values Added
CPEs cpe:2.3:a:handlebarsjs:handlebars:*:*:*:*:*:node.js:*:*

Mon, 30 Mar 2026 16:15:00 +0000

Type Values Removed Values Added
Metrics ssvc

{'options': {'Automatable': 'no', 'Exploitation': 'poc', 'Technical Impact': 'partial'}, 'version': '2.0.3'}


Mon, 30 Mar 2026 08:15:00 +0000

Type Values Removed Values Added
First Time appeared Handlebarsjs
Handlebarsjs handlebars
Vendors & Products Handlebarsjs
Handlebarsjs handlebars

Sat, 28 Mar 2026 12:15:00 +0000

Type Values Removed Values Added
Weaknesses CWE-915
References
Metrics threat_severity

None

threat_severity

Moderate


Sat, 28 Mar 2026 03:15:00 +0000

Type Values Removed Values Added
Description 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.
Title Handlebars.js has Prototype Pollution Leading to XSS through Partial Template Injection
Weaknesses CWE-1321
CWE-79
References
Metrics cvssV3_1

{'score': 4.7, 'vector': 'CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:N'}


Subscriptions

Handlebarsjs Handlebars
cve-icon MITRE

Status: PUBLISHED

Assigner: GitHub_M

Published:

Updated: 2026-03-30T15:41:36.977Z

Reserved: 2026-03-24T15:41:47.492Z

Link: CVE-2026-33916

cve-icon Vulnrichment

Updated: 2026-03-30T15:41:32.546Z

cve-icon NVD

Status : Analyzed

Published: 2026-03-27T21:17:27.237

Modified: 2026-03-31T17:48:27.727

Link: CVE-2026-33916

cve-icon Redhat

Severity : Moderate

Publid Date: 2026-03-27T21:00:48Z

Links: CVE-2026-33916 - Bugzilla

cve-icon OpenCVE Enrichment

Updated: 2026-03-31T20:00:42Z

Weaknesses