Repository navigation
Update dependency happy-dom to v21 [SECURITY] - #136
Merged
Merged
Conversation
renovate
Bot
force-pushed
the
renovate/npm-happy-dom-vulnerability
branch
4 times, most recently
from
August 30, 2026 18:17
441446d to
e573c97
Compare
renovate
Bot
force-pushed
the
renovate/npm-happy-dom-vulnerability
branch
6 times, most recently
from
September 4, 2026 02:01
168e8bc to
6f42caa
Compare
renovate
Bot
force-pushed
the
renovate/npm-happy-dom-vulnerability
branch
6 times, most recently
from
September 11, 2026 00:38
d765584 to
38cc971
Compare
renovate
Bot
force-pushed
the
renovate/npm-happy-dom-vulnerability
branch
8 times, most recently
from
September 19, 2026 00:54
bc87398 to
59762d9
Compare
renovate
Bot
force-pushed
the
renovate/npm-happy-dom-vulnerability
branch
2 times, most recently
from
September 25, 2026 12:30
73560e3 to
7c4a055
Compare
renovate
Bot
force-pushed
the
renovate/npm-happy-dom-vulnerability
branch
from
October 1, 2026 15:34
7c4a055 to
21a4bf2
Compare
…lnerability' into tmp-136
happy-dom 21 defines OffscreenCanvas but getContext('2d') returns null, so the canvas-presence guard in wrap.test.ts now checks the context. The same 9 measureContent tests stay skipped under happy-dom and still run in real browsers.
Contributor
Author
Edited/Blocked NotificationRenovate will not automatically rebase this PR, because it does not recognize the last commit author and assumes somebody else may have edited the PR. You can manually request rebase by checking the rebase/retry box above. |
This was referenced Oct 28, 2026
mcpx: the privileged plugin surface -- runtime hooks, variables, internal commands, detachment
#1873
Open
Open
Closed
Closed
Closed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Note
This PR body was truncated due to platform limits.
This PR contains the following updates:
^17.6.3→^21.0.0Happy DOM: VM Context Escape can lead to Remote Code Execution
CVE-2025-61927 / GHSA-37j7-fg3j-429f
More information
Details
Escape of VM Context gives access to process level functionality
Summary
Happy DOM v19 and lower contains a security vulnerability that puts the owner system at the risk of RCE (Remote Code Execution) attacks.
A Node.js VM Context is not an isolated environment, and if the user runs untrusted JavaScript code within the Happy DOM VM Context, it may escape the VM and get access to process level functionality.
It seems like what the attacker can get control over depends on if the process is using ESM or CommonJS. With CommonJS the attacker can get hold of the
require()function to import modules.Happy DOM has JavaScript evaluation enabled by default. This may not be obvious to the consumer of Happy DOM and can potentially put the user at risk if untrusted code is executed within the environment.
Reproduce
CommonJS (Possible to get hold of require)
ESM (Not possible to get hold of import or require)
Potential Impact
Server-Side Rendering (SSR)
Testing Frameworks
Any test suite using Happy-DOM with untrusted content may be at risk
Attack Scenarios
Recommended Immediate Actions
eval()andFunction()can still be used within the Happy DOM VM without any known security riskTechnical Root Cause
All classes and functions inherit from Function. By walking the constructor chain it's possible to get hold of Function at process level. As Function can evaluate code from strings, it's possible to execute code at process level.
Running Node with the "--disallow-code-generation-from-strings" flag protects against this.
Severity
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/E:PReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Happy DOM ECMAScriptModuleCompiler: unsanitized export names are interpolated as executable code
CVE-2026-33943 / GHSA-6q6h-j7hj-3r64
More information
Details
Summary
A code injection vulnerability in
ECMAScriptModuleCompilerallows an attacker to achieve Remote Code Execution (RCE) by injecting arbitrary JavaScript expressions insideexport { }declarations in ES module scripts processed by happy-dom. The compiler directly interpolates unsanitized content into generated code as an executable expression, and the quote filter does not strip backticks, allowing template literal-based payloads to bypass sanitization.Details
Vulnerable file:
packages/happy-dom/src/module/ECMAScriptModuleCompiler.ts, lines 371-385The "Export object" handler extracts content from
export { ... }using the regexexport\s*{([^}]+)}, then generates executable code by directly interpolating it:The issue has three root causes:
STATEMENT_REGEXPuses{[^}]+}which matches any content inside braces, not just valid JavaScript identifiersimportNameis placed in code context (as a JS expression to evaluate), not in string context.replace(/["']/g, '')strips"and'but not backticks, so template literal strings like`child_process`survive the filterAttack flow:
Note: This is a different vulnerability from CVE-2024-51757 (SyncFetchScriptBuilder injection) and CVE-2025-61927 (VM context escape). Those were patched in v15.10.2 and v20.0.0 respectively, but this vulnerable code path in
ECMAScriptModuleCompilerremains present in v20.8.4 (latest). In v20.0.0+ where JavaScript evaluation is disabled by default, this vulnerability is exploitable when JavaScript evaluation is explicitly enabled by the user.PoC
Standalone PoC script — reproduces the vulnerability without installing happy-dom by replicating the compiler's exact code generation logic:
Execution result:
HTML attack vector — when processed by happy-dom with JavaScript evaluation enabled:
Impact
An attacker who can inject or control HTML content processed by happy-dom (with JavaScript evaluation enabled) can achieve arbitrary command execution on the host system.
Realistic attack scenarios:
Suggested fix: Validate that
importNameis a valid JavaScript identifier before interpolating it into generated code:Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:HReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Happy DOM's fetch credentials include uses page-origin cookies instead of target-origin cookies
CVE-2026-34226 / GHSA-w4gp-fjgq-3q4g
More information
Details
Summary
happy-dommay attach cookies from the current page origin (window.location) instead of the request target URL whenfetch(..., { credentials: "include" })is used. This can leak cookies from origin A to destination B.Details
In
packages/happy-dom/src/fetch/utilities/FetchRequestHeaderUtility.ts(getRequestHeaders()), cookie selection is performed withoriginURL:Here,
originURLrepresents the page URL, not the request destination URL. For outgoing requests, cookie lookup should use the request URL (for example:new URL(options.request[PropertySymbol.url])).PoC Script Content
Environment:
happy-dom20.6.1*.127.0.0.1.nip.ioReproduction steps:
page_cookie=PAGE_ONLYona.127.0.0.1.nip.ioapi_cookie=API_ONLYonb.127.0.0.1.nip.iocredentials: "include"Cookieheader received by the target hostExpected:
api_cookie=API_ONLYpage_cookie=PAGE_ONLYActual (observed):
page_cookie=PAGE_ONLYapi_cookie=API_ONLYObserved output:
Impact
Cross-origin sensitive information disclosure (cookie leakage).
Impacted users are applications relying on
happy-dombrowser-like fetch behavior in authenticated/session-based flows (for example SSR/test/proxy-like scenarios), where cookies from one origin can be sent to another origin.Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Release Notes
capricorn86/happy-dom (happy-dom)
v21.0.4Compare Source
👷♂️ Patch fixes
data:iframes cannot access their parent or top window - By @capricorn86v21.0.3Compare Source
👷♂️ Patch fixes
v21.0.2Compare Source
👷♂️ Patch fixes
v21.0.1Compare Source
👷♂️ Patch fixes
--cssand--iframefor enabling CSS and iframe loading to @happy-dom/server-renderer - By @capricorn86v21.0.0Compare Source
💣 Breaking Changes
<iframe>or<link rel="stylesheet">elements in untrusted HTML to make Happy DOM send HTTP requests from the server to attacker-chosen URLs, including internal services. This could allow access to otherwise unreachable endpoints or trigger unintended actions, depending on the application and its network access.disableCSSFileLoadinghas been deprecated<=v20.14.6by sending in{ enableCSSFileLoading: true, enableIframePageLoading: true }as broswer settings (e.g.new Window({ settings }));v20.14.6Compare Source
👷♂️ Patch fixes
v20.14.5Compare Source
👷♂️ Patch fixes
v20.14.4Compare Source
👷♂️ Patch fixes
v20.14.3Compare Source
👷♂️ Patch fixes
v20.14.2Compare Source
👷♂️ Patch fixes
getComputedStyle()- By @klaesra in task #2344v20.14.1Compare Source
👷♂️ Patch fixes
v20.14.0Compare Source
🎨 Features
v20.13.2Compare Source
👷♂️ Patch fixes
v20.13.1Compare Source
👷♂️ Patch fixes
v20.13.0Compare Source
🎨 Features
v20.12.2Compare Source
👷♂️ Patch fixes
v20.12.1Compare Source
🎨 Features
CSSStyleDeclaration- By @capricorn86 in task #2256CSSStyleDeclaration- By @capricorn86 in task #2256👷♂️ Patch fixes
v20.12.0Compare Source
🎨 Features
Animation,AnimationTimeline,DocumentTimelineandKeyframeEffect- By @capricorn86Element.animate()- By @capricorn86v20.11.15Compare Source
👷♂️ Patch fixes
v20.11.14Compare Source
👷♂️ Patch fixes
v20.11.13Compare Source
👷♂️ Patch fixes
v20.11.12Compare Source
👷♂️ Patch fixes
v20.11.11Compare Source
👷♂️ Patch fixes
v20.11.10Compare Source
👷♂️ Patch fixes
v20.11.9Compare Source
👷♂️ Patch fixes
v20.11.8Compare Source
👷♂️ Patch fixes
adoptedStyleSheetarray should be validated - By @capricorn86 in task #2315v20.11.7Compare Source
👷♂️ Patch fixes
Document.adoptedStyleSheetsandShadowRoot.adoptedStyleSheetsshould validate it's value - By @capricorn86 in task #2313v20.11.6Compare Source
👷♂️ Patch fixes
v20.11.5Compare Source
👷♂️ Patch fixes
querySelector<HTMLInputElement>(".my-input")) - By @cyphercodesv20.11.4Compare Source
👷♂️ Patch fixes
fetch()to match origins instead of host and protocol - By @rexxars in task #1490v20.11.3Compare Source
👷♂️ Patch fixes
v20.11.2Compare Source
👷♂️ Patch fixes
v20.11.1Compare Source
👷♂️ Patch fixes
v20.11.0Compare Source
🎨 Features
v20.10.6Compare Source
👷♂️ Patch fixes
v20.10.5Compare Source
👷♂️ Patch fixes
v20.10.4Compare Source
👷♂️ Patch fixes
v20.10.3Compare Source
👷♂️ Patch fixes
v20.10.2Compare Source
👷♂️ Patch fixes
v20.10.1Compare Source
v20.10.0Compare Source
🎨 Features
v20.9.0Compare Source
🎨 Features
Window.onkeydown) - By @capricorn86 in task #2131v20.8.9Compare Source
👷♂️ Patch fixes
v20.8.8Compare Source
👷♂️ Patch fixes
v20.8.7Compare Source
👷♂️ Patch fixes
Consolewith commonIConsoleinterface to support latest version of Bun - By @YevheniiKotyrlo in task #1845v20.8.6Compare Source
👷♂️ Patch fixes
Request.formData()should honor "Content-Type" header - By @brianhelba in task #2106v20.8.5Compare Source
👷♂️ Patch fixes
connectedCallback()- By @capricorn86 in task #2110v20.8.4Compare Source
👷♂️ Patch fixes
v20.8.3Compare Source
👷♂️ Patch fixes
EventinEventTarget.dispatchEvent()- By @capricorn86 in task #2054v20.8.2Compare Source
👷♂️ Patch fixes
Event.cancelBubbleandEvent.defaultPreventedwhen callingEvent.initEvent()- By @capricorn86 in task #2090v20.8.1Compare Source
👷♂️ Patch fixes
v20.8.0Compare Source
🎨 Features
v20.7.2Compare Source
👷♂️ Patch fixes
v20.7.1Compare Source
👷♂️ Patch fixes
>) and universal (*) query selectors - By @Cherry in task #2078v20.7.0Compare Source
🎨 Features
Window.getScreenDetails()- By @TrevorBurnham in task #1923ScreenfromEventTarget- By @TrevorBurnham in task #1923v20.6.5Compare Source
👷♂️ Patch fixes
v20.6.4Compare Source
👷♂️ Patch fixes
v20.6.3Compare Source
👷♂️ Patch fixes
[data-value="it's a test"]) - By @capricorn86 in task #2034v20.6.2Compare Source
👷♂️ Patch fixes
v20.6.1Compare Source
👷♂️ Patch fixes
rgba()- By @atzzCokeK in task #2042v20.6.0Compare Source
🎨 Features
@happy-dom/global-registratorpackage - By @capricorn86 in task #2060v20.5.5Compare Source
👷♂️ Patch fixes
v20.5.4Compare Source
👷♂️ Patch fixes
v20.5.3Compare Source
👷♂️ Patch fixes
v20.5.2Compare Source
👷♂️ Patch fixes
v20.5.1Compare Source
👷♂️ Patch fixes
HTMLInputElement.stepUp()andHTMLInputElement.stepDown()to work according to spec - By @stevematney in task #1955Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.