chore(deps): update devdependency happy-dom to v20 [security] - autoclosed #237
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.
This PR contains the following updates:
^18.0.1
->^20.0.0
GitHub Vulnerability Alerts
CVE-2025-61927
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.
CVE-2025-62410
Summary
The mitigation proposed in GHSA-37j7-fg3j-429f for disabling eval/Function when executing untrusted code in happy-dom does not suffice, since it still allows prototype pollution payloads.
Details
The untrusted script and the rest of the application still run in the same Isolate/process, so attackers can deploy prototype pollution payloads to hijack important references like "process" in the example below, or to hijack control flow via flipping checks of undefined property. There might be other payloads that allow the manipulation of require, e.g., via (univeral) gadgets (https://www.usenix.org/system/files/usenixsecurity23-shcherbakov.pdf).
PoC
Attackers can pollute builtins like Object.prototype.hasOwnProperty() to obtain important references at runtime, e.g., "process". In this way, attackers might be able to execute arbitrary commands like in the example below via spawn().
Impact
Arbitrary code execution via breaking out of the Node.js' vm isolation.
Recommended Immediate Actions
Users can freeze the builtins in the global scope to defend against attacks similar to the PoC above. However, the untrusted code might still be able to retrieve all kind of information available in the global scope and exfiltrate them via fetch(), even without prototype pollution capabilities. Not to mention side channels caused by the shared process/isolate. Migration to isolated-vm is suggested instead.
Cris from the Endor Labs Security Research Team, who has worked extensively on JavaScript sandboxing in the past, submitted this advisory.
Release Notes
capricorn86/happy-dom (happy-dom)
v20.0.2
Compare Source
v20.0.1
Compare Source
v20.0.0
Compare Source
I avoid making breaking changes as much as possible in Happy DOM. When I have to make a breaking change, I try to keep it as minimal as possible. This could be a breaking change that impacts many projects, and I am truly sorry if you are negatively affected by this.
💣 Breaking Changes
v19.0.2
Compare Source
👷♂️ Patch fixes
:scope
that didn't work correctly for direct descendants to root - By @capricorn86 in task #1620v19.0.1
Compare Source
👷♂️ Patch fixes
@happy-dom/server-renderer
config using CLI - By @capricorn86 in task #1908v19.0.0
Compare Source
💣 Breaking Changes
require()
@happy-dom/jest-environment
package - By @capricorn86 in task #1730@happy-dom/jest-environment
- By @capricorn86 in task #1730🎨 Features
@happy-dom/server-renderer
- By @capricorn86 in task #1730import.meta
to the ESM compiler - By @capricorn86 in task #1730:scope
- By @capricorn86 in task #1620MediaList
- By @capricorn86 in task #1730CSSKeywordValue
,CSSStyleValue
,StylePropertyMap
,StylePropertyMap
,StylePropertyMapReadOnly
- By @capricorn86 in task #1730Browser
instance - By @capricorn86 in task #1730setTimeout()
andrequestAnimationFrame()
- By @capricorn86 in task #1730beforeContentCallback
andheaders
toBrowserFrame.goto()
,BrowserFrame.goBack()
,BrowserFrame.goForward()
,BrowserFrame.goSteps()
andBrowserFrame.reload()
- By @capricorn86 in task #1730PopStateEvent
and trigger the event when navigating the page history usingHistory.pushState()
- By @capricorn86 in task #1730ResponseCache.fileSystem.load()
andResponseCache.fileSystem.save()
for storing and loading cache from the file system - By @capricorn86 in task #1730👷♂️ Patch fixes
BrowserFrame.goto()
- By @capricorn86 in task #1730XMLHttpRequest
to prevent it from being set to an invalid state if a listener throws an Error - By @capricorn86 in task #1730Configuration
📅 Schedule: Branch creation - "" (UTC), Automerge - At any time (no schedule defined).
🚦 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.