Severity by source
AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N
Admin API authentication required (PR:L); S3/GCS same-origin serving is deployment-specific but not complexity-raising for an authenticated attacker; XSS crosses browser origin boundary (S:C, UI:R); no availability impact applies.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
Ghost is a Node.js content management system. From 6.19.4 until 6.21.1, insufficient validation of the client-supplied Content-Type on Ghost's Admin API file upload endpoint allowed uploaded files to be served from the site with an attacker-chosen content type on S3/GCS storage backends. On installations that serve uploaded files from the same origin as the site, this could have been used to facilitate stored cross-site scripting against site visitors or staff. This vulnerability is fixed in 6.21.1.
AnalysisAI
Stored cross-site scripting in Ghost CMS (versions 6.19.4 through 6.21.0) is enabled by the Admin API file upload endpoint accepting and preserving attacker-supplied Content-Type headers without server-side validation. When Ghost is configured with S3 or GCS storage backends that serve uploaded files from the same origin as the site, an authenticated attacker can upload a file with a crafted Content-Type (e.g., text/html) that causes browsers to execute it as HTML or JavaScript, enabling stored XSS against visitors and staff. No public exploit code has been identified at time of analysis, and the vulnerability is fixed in Ghost 6.21.1.
Technical ContextAI
Ghost is a Node.js-based content management system (CPE: cpe:2.3:a:tryghost:ghost:*:*:*:*:*:*:*:*) commonly used for blogging and publishing workflows. The vulnerability manifests at the Admin API's multipart file upload endpoint, which fails to enforce server-side Content-Type sanitization or override - a textbook instance of CWE-434 (Unrestricted Upload of File with Dangerous Type). Object storage backends such as Amazon S3 and Google Cloud Storage faithfully preserve the MIME type metadata provided at upload time, meaning files are later served over HTTP with the attacker-chosen type. When the storage origin matches the Ghost site origin, browsers honor the content type and render or execute uploaded content accordingly, bypassing the Same-Origin Policy protections that would otherwise contain a cross-origin stored XSS.
RemediationAI
Upgrade Ghost to version 6.21.1, which introduces server-side enforcement of acceptable Content-Type values on the Admin API upload endpoint. The vendor advisory is available at https://github.com/TryGhost/Ghost/security/advisories/GHSA-944x-pm95-3jpr. For operators unable to upgrade immediately, the most effective compensating control is to configure the storage backend to serve uploaded files from a separate subdomain or CDN origin distinct from the Ghost site origin - this eliminates the XSS vector by enforcing cross-origin isolation, though it may require URL migration for existing media assets. An alternative is to tightly restrict Admin API access to fully trusted accounts only and audit existing uploaded files for unexpected content types, but this does not eliminate the vulnerability and carries the trade-off of operational friction. Blocking file uploads entirely via Web Application Firewall rules is a last-resort measure that would prevent the attack vector but break legitimate media publishing workflows.
A vulnerability in the NuPoint Unified Messaging (NPM) component of Mitel MiCollab through 9.8 SP1 FP2 (9.8.1.201) could
FortiOS and FortiProxy contain an authentication bypass via the Node.js websocket module allowing unauthenticated remote
Denial of service against HTTP/2 server implementations allows remote unauthenticated attackers to exhaust server resour
Eval injection vulnerability in the internals.batch function in lib/batch.js in the bassmaster plugin before 1.5.2 for t
Flowise version 3.0.5 contains a remote code execution vulnerability in the CustomMCP node. The mcpServerConfig paramete
Node.js 8.5.0 before 8.6.0 allows remote attackers to access unintended files, because a change to ".." handling was inc
An issue was discovered in the node-serialize package 0.0.4 for Node.js. Rated critical severity (CVSS 9.8), this vulner
OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph
Directory traversal vulnerability in the st module before 0.2.5 for Node.js allows remote attackers to read arbitrary fi
Multiple SQL injection vulnerabilities in the Manage Accounts page in the AccountManagement.asmx service in the Solarwin
The JS-YAML module before 2.0.5 for Node.js parses input without properly considering the unsafe !!js/function tag, whic
The AES-NI implementation in OpenSSL before 1.0.1t and 1.0.2 before 1.0.2h does not consider memory allocation during a
Share
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-39021
GHSA-944x-pm95-3jpr