CVE-2026-33916
Full vulnerability record from the local CVENow database.
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.
View original CVE JSON
{
"id": "CVE-2026-33916",
"sourceIdentifier": "[email protected]",
"published": "2026-03-27T21:17:27.237",
"lastModified": "2026-10-26T22:10:00.163",
"vulnStatus": "Analyzed",
"cveTags": [],
"descriptions": [
{
"lang": "en",
"value": "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."
},
{
"lang": "es",
"value": "Handlebars proporciona la potencia necesaria para permitir a los usuarios construir plantillas semánticas. En las versiones 4.0.0 a 4.7.8, “resolvePartial()” en el tiempo de ejecución de Handlebars resuelve nombres de parciales a través de una búsqueda de propiedad simple en “options.partials” sin proteger contra el recorrido de la cadena de prototipos. Cuando “Object.prototype” ha sido contaminado con un valor de cadena cuya clave coincide con una referencia de parcial en una plantilla, la cadena contaminada se utiliza como cuerpo del parcial y se renderiza sin escape HTML, lo que resulta en XSS reflejado o almacenado. La versión 4.7.9 corrige el problema. Algunas soluciones alternativas están disponibles. Aplique “Object.freeze(Object.prototype)” al principio del inicio de la aplicación para evitar la contaminación de prototipos. Nota: esto puede romper otras bibliotecas, y/o use la compilación solo en tiempo de ejecución de Handlebars (“handlebars/runtime”), que no compila plantillas y reduce la superficie de ataque."
}
],
"affected": [
{
"source": "[email protected]",
"affectedData": [
{
"vendor": "handlebars-lang",
"product": "handlebars.js",
"versions": [
{
"version": ">= 4.0.0, < 4.7.9",
"status": "affected"
}
]
}
]
}
],
"metrics": {
"cvssMetricV31": [
{
"source": "[email protected]",
"type": "Secondary",
"cvssData": {
"version": "3.1",
"vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:N",
"baseScore": 4.7,
"baseSeverity": "MEDIUM",
"attackVector": "NETWORK",
"attackComplexity": "HIGH",
"privilegesRequired": "NONE",
"userInteraction": "REQUIRED",
"scope": "CHANGED",
"confidentialityImpact": "LOW",
"integrityImpact": "LOW",
"availabilityImpact": "NONE"
},
"exploitabilityScore": 1.6,
"impactScore": 2.7
},
{
"source": "[email protected]",
"type": "Primary",
"cvssData": {
"version": "3.1",
"vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:N",
"baseScore": 4.7,
"baseSeverity": "MEDIUM",
"attackVector": "NETWORK",
"attackComplexity": "HIGH",
"privilegesRequired": "NONE",
"userInteraction": "REQUIRED",
"scope": "CHANGED",
"confidentialityImpact": "LOW",
"integrityImpact": "LOW",
"availabilityImpact": "NONE"
},
"exploitabilityScore": 1.6,
"impactScore": 2.7
}
],
"ssvcV203": [
{
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"ssvcData": {
"timestamp": "2026-03-30T15:41:27.326408Z",
"id": "CVE-2026-33916",
"options": [
{
"exploitation": "poc"
},
{
"automatable": "no"
},
{
"technicalImpact": "partial"
}
],
"role": "CISA Coordinator",
"version": "2.0.3"
}
}
]
},
"weaknesses": [
{
"source": "[email protected]",
"type": "Secondary",
"description": [
{
"lang": "en",
"value": "CWE-79"
},
{
"lang": "en",
"value": "CWE-1321"
}
]
}
],
"configurations": [
{
"nodes": [
{
"operator": "OR",
"negate": false,
"cpeMatch": [
{
"vulnerable": true,
"criteria": "cpe:2.3:a:handlebarsjs:handlebars:*:*:*:*:*:node.js:*:*",
"versionStartIncluding": "4.0.0",
"versionEndExcluding": "4.7.9",
"matchCriteriaId": "A9D1F9A7-8359-4C3F-9932-4A085094F388"
}
]
}
]
}
],
"references": [
{
"url": "https://github.com/handlebars-lang/handlebars.js/commit/68d8df5a88e0a26fe9e6084c5c6aaebe67b07da2",
"source": "[email protected]",
"tags": [
"Patch"
]
},
{
"url": "https://github.com/handlebars-lang/handlebars.js/releases/tag/v4.7.9",
"source": "[email protected]",
"tags": [
"Release Notes"
]
},
{
"url": "https://github.com/handlebars-lang/handlebars.js/security/advisories/GHSA-2qvq-rjwj-gvw9",
"source": "[email protected]",
"tags": [
"Exploit",
"Vendor Advisory"
]
}
]
}