CVE-2024-40631 is a high-severity (CVSS 8.1) Cross-site Scripting (XSS) vulnerability in @udecode/plate-media. A fix is available for @udecode/plate-media — see the affected versions and patch details below.
Cross-site Scripting (XSS) in media embed element when using custom URL parsers in plate media
Exploitation Status
No confirmed exploitation observed yet
- CISA’s own triage has not observed active exploitation or public proof-of-concept code for this CVE as of its last assessment.
Exploitation and automatability from CISA’s SSVC triage for CVE-2024-40631.
EPSS Exploitation Probability
Probability of exploitation in the next 30 days, from FIRST.org EPSS.
How urgent is this, really
Where this sits among everything scored
Real-World Exposure
How broadly this vulnerability is actually deployed: weekly install volume shows current usage, a proxy for how much of the ecosystem is exposed.
@udecode/plate-medianpmDescription
Impact
Editors that use MediaEmbedElement and pass custom urlParsers to the useMediaState hook may be vulnerable to XSS if a custom parser allows javascript:, data: or vbscript: URLs to be embedded. Editors that do not use urlParsers and instead consume the url property directly may also be vulnerable if the URL is not sanitised.
The default parsers parseTwitterUrl and parseVideoUrl are not affected.
Examples of vulnerable code:
const { embed } = useMediaState({
urlParsers: [
// Custom parser that does not use an allowlist or validate the URL protocol
(url) => ({ url }),
],
});
return (
<iframe
src={embed!.url}
// ...
/>
);
const { url } = useMediaState();
return (
<iframe
// url property used directly from useMediaState() with no sanitisation
src={url}
// ...
/>
);
const { url } = element;
return (
<iframe
// url property used directly from element with no sanitisation
src={url}
// ...
/>
);
Patches
@udecode/plate-media 36.0.10 resolves this issue by only allowing HTTP and HTTPS URLs during parsing. This affects only the embed property returned from useMediaState.
In addition, the url property returned from useMediaState has been renamed to unsafeUrl to indicate that it has not been sanitised. The url property on element is also unsafe, but has not been renamed. If you're using either of these properties directly, you will still need to validate the URL yourself.
Workarounds
Ensure that any custom urlParsers do not allow javascript:, data: or vbscript: URLs to be returned in the url property of their return values.
If url is consumed directly, validate the URL protocol before passing it to the iframe element.
References
How to verify the protocol of a URL: https://stackoverflow.com/a/43467144
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 📦npm | @udecode/plate-media | all versions | 36.0.10npm install @udecode/plate-media@36.0.10 |
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for @udecode/plate-media, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.
Fix
Update @udecode/plate-media to 36.0.10 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms CVE-2024-40631 is resolved across your whole dependency graph.
Workarounds
Stop feeding it untrusted input: reject or quarantine files and payloads from unverified sources until you can upgrade, restrict accepted formats to the ones you actually need, and run the parsing or decoding step in a least-privileged sandbox or short-lived worker so a crash or corrupted read cannot reach the rest of the process.
Frequently Asked Questions
Is CVE-2024-40631 in your dependencies?
Find it across npm, including transitive dependencies.