CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-53946

CVE-2026-53946: Server-Side Request Forgery in Ghost CMS Mobiledoc Processing Workflow

Alon Barad
Alon Barad
Software Engineer

Aug 5, 2026·6 min read·57 visits

Executive Summary (TL;DR)

Medium-severity SSRF in Ghost CMS (v6.19.4 - v6.21.0) allows authenticated authors/editors to abuse image dimension parsing to probe internal services and access cloud metadata servers.

A Server-Side Request Forgery (SSRF) vulnerability exists in the Mobiledoc post-rendering component of Ghost CMS versions 6.19.4 through 6.21.0. This allows authenticated staff users with post creation or editing privileges to force the application server to perform arbitrary outbound HTTP GET requests, targeting internal endpoints, local loopback interfaces, or cloud metadata endpoints.

Vulnerability Overview

Ghost is an open-source, Node.js-based content management system widely used for professional publishing. Within Ghost, posts are structured using the Mobiledoc format, which utilizes standardized cards to embed rich content elements such as images, videos, and markdown blocks. To improve client-side rendering speeds, Ghost contains dynamic server-side functions that automatically capture and inject the height and width metrics of images referenced within post cards.

During the post saving, rendering, or previewing pipelines, the Ghost application server invokes a compilation function designed to fetch and record these dimensions. In vulnerable Ghost versions, the application server does not sufficiently validate the destination or domain of absolute image URLs before sending outbound requests. This creates an attack surface accessible to authenticated users with permissions to write, edit, or import drafts.

Because the HTTP client resides inside the internal network perimeter, the application server acts as an open proxy. By providing a crafted URL inside the image source metadata payload, an attacker forces the server to initiate arbitrary connections to local loopback addresses (127.0.0.1) or internal network resources that are isolated from the public internet.

Root Cause Analysis

The underlying technical flaw lies within the populateImageSizes function defined in the file ghost/core/core/server/lib/mobiledoc.js. When parsing an image card block inside a Mobiledoc layout, the application inspects whether the card contains pre-populated size metadata (width and height). If this metadata is absent, the function executes conditional logic to locate the image and identify its dimensions.

The logic evaluates the target image source using the following decision paths:

if (isRelativeImagePath || storageUtils.isLocalImage(payload.src)) {
    size = await imageSize.getOriginalImageSizeFromStorageUrl(payload.src);
} else {
    size = await imageSize.getImageSizeFromUrl(payload.src);
}

Under this implementation, any image source that is not recognized as a relative path or a locally stored image falls through to the final unvalidated else block. The application then immediately executes imageSize.getImageSizeFromUrl(payload.src). This function contains no host verification, protocol validation, or IP address filtering, allowing an arbitrary string to be passed straight to the HTTP request client.

This behavior allows the user to exploit trust relationships by supplying local system destinations or cloud metadata addresses like http://169.254.169.254/ directly in the image card definition. The application resolves the target and attempts to download the data to read the image's dimensions, making the system highly vulnerable to Server-Side Request Forgery.

Code Analysis & Patch Review

The vulnerability was patched by replacing the insecure else branch in ghost/core/core/server/lib/mobiledoc.js with an explicit check that validates the image source domain against the system's defined internal domains.

The patch changes the unvalidated fallback structure to use storageUtils.isInternalImage prior to execution:

@@ -140,7 +140,7 @@ module.exports = {
                     size = await getUnsplashSize(payload.src);
                 } else if (isRelativeImagePath || storageUtils.isLocalImage(payload.src)) {
                     size = await imageSize.getOriginalImageSizeFromStorageUrl(payload.src);
-                } else {
+                } else if (storageUtils.isInternalImage(payload.src)) {
                     size = await imageSize.getImageSizeFromUrl(payload.src);
                 }

This remediation ensures that arbitrary external URLs do not trigger outgoing server-side requests. The application only contacts external resources if they match configured boundaries defined under the urls:image keys or other trusted image paths.

Although the patch restricts direct SSRF attempts, a thorough evaluation shows that residual risks might persist if security teams do not monitor dynamic redirects or domain resolution. If the validation engine relies on storageUtils.isInternalImage(payload.src) and parses the authority component differently than the underlying HTTP fetching library, an attacker might bypass validation using authority spoofing patterns or dynamic DNS rebinding techniques. Furthermore, if the HTTP fetcher automatically follows HTTP 3xx redirects, an attacker could potentially register an approved domain that redirects the server to local resources.

Exploitation Methodology

To exploit this vulnerability, an attacker must first obtain a valid authenticated session on the Ghost instance. The required roles include Author, Editor, or Administrator, each of which has permission to create or modify post structures.

Once authenticated, the attacker creates a new post draft and manipulates the backend JSON content to structure an image card with an arbitrary URL instead of a valid image path. The payload represents the image card structure within the Mobiledoc formatting block:

{
  "cards": [
    ["image", {
      "src": "http://169.254.169.254/latest/meta-data/",
      "alt": "Exploit Test"
    }]
  ]
}

Saving the post or requesting a preview forces the Ghost server to compile the post content. The populateImageSizes function identifies the missing width and height properties, evaluates the external IP address, and issues an HTTP GET request to the target IP address on behalf of the application server.

While this represents a semi-blind SSRF vector where the direct body content of the target service is not fully returned in the HTTP response body to the client interface, an attacker can extract critical details through side-channel metrics. For instance, the server's response time, specific error outputs (e.g., connection timed out vs connection refused), and the presence or absence of parsed metadata in the returned post payload reveal whether specific ports are open or closed inside the internal subnet.

Impact Assessment & Threat Context

The impact of CVE-2026-53946 is classified as moderate, with a CVSS v3.1 score of 5.4. Because the target scope changes from the application itself to internal services, the Scope metric is marked as Changed ('C'). This change in scope significantly broadens the potential impact area of the exploit.

In standard cloud hosting environments (such as AWS, Google Cloud, or Azure), the loopback-accessible link local IP address 169.254.169.254 serves instance configuration and IAM authorization tokens. An attacker exploiting this SSRF can retrieve metadata credentials and potentially escalate their privileges to compromise the underlying cloud resources hosting the Ghost application.

In local system environments, the attack vector allows scanning and interaction with administrative services running on internal loopback interfaces (such as Redis caches, database administration tools, or local container management APIs). If these services trust requests originating from 127.0.0.1 without requiring strong credentials, the SSRF can lead to remote command execution on the host machine.

Remediation & Hardening Guidance

The primary resolution for this vulnerability is upgrading the Ghost instance to version 6.21.1 or higher. This release integrates the domain validation patch that blocks unvetted HTTP lookups for image dimensions.

If patching cannot be executed immediately, administrators must implement network-level egress blocking rules. Configure firewall configurations (such as iptables, firewalld, or cloud security groups) on the Ghost server host to block outbound traffic destined for private address spaces (RFC 1918 networks: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) and local loopback limits. Additionally, block all requests targeting the cloud metadata address 169.254.169.254 unless strictly required by system architecture.

Finally, apply the principle of least privilege by auditing staff user roles. Demote untrusted users and disable public registration mechanisms that might allow untrusted parties to obtain Author or Editor permissions.

Official Patches

TryGhostFix pull request introducing validation filters to Mobiledoc image size populator
TryGhostOfficial commit patch by Kevin Ansfield restricting outbound requests to trusted internal images

Fix Analysis (1)

Technical Appendix

CVSS Score
5.4/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N
EPSS Probability
0.12%
Top 98% most exploited

Affected Systems

Ghost CMS

Affected Versions Detail

Product
Affected Versions
Fixed Version
Ghost
TryGhost
>= 6.19.4, < 6.21.16.21.1
AttributeDetail
CWE IDCWE-918 (Server-Side Request Forgery)
Attack VectorNetwork (AV:N)
CVSS Severity Score5.4 (Medium)
EPSS Score0.00122 (~2.31% probability of exploitation)
ImpactUnauthorized retrieval of internal server and metadata resources
Exploit StatusProof-of-Concept / Code-level analysis
KEV StatusNot listed

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1005Data from Local System
Collection
CWE-918
Server-Side Request Forgery (SSRF)

The web application fetches a remote resource without validating the user-supplied destination URL.

Vulnerability Timeline

Fix commit ba692df7f27162d0440d57487f16c530416a8eb2 authored and merged
2026-03-10
Official security advisory GHSA-g366-23fw-ggp6 published by TryGhost team
2026-06-24
CVE-2026-53946 assigned and published to CVE.org catalog
2026-06-24
CVE details populated in the National Vulnerability Database (NVD)
2026-06-25

References & Sources

  • [1]CVE.org Record Page
  • [2]NVD CVE Details
  • [3]GitHub Advisory Database Record
  • [4]Ghost v6.21.1 Release Notes

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 1 hour ago•CVE-2026-107397
4.4

CVE-2026-107397: Stored Cross-Site Scripting via Collaborative Editor Conflict Resolution and Custom Link Fields in Indico

A technical analysis of CVE-2026-107397, a stored Cross-Site Scripting (XSS) vulnerability in Indico's collaborative notes editor and custom link generation fields. Prior to version 3.3.13, Marshmallow serialization schemas omitted HTML sanitization during conflict resolution, and form validators failed to enforce strict URI schemes, enabling authenticated low-privilege attackers to execute arbitrary JavaScript.

Alon Barad
Alon Barad
0 views•7 min read
•about 2 hours ago•CVE-2026-107395
4.3

CVE-2026-107395: Missing Authorization in Indico Legacy Session Export API

An authorization bypass vulnerability exists in the legacy session export API of Indico, an open-source event management system developed at CERN. Due to a missing object-level access check, authenticated users can bypass configuration-level restrictions to extract private session metadata (including session titles, descriptions, and list of conveners) from events that they are otherwise authorized to view.

Alon Barad
Alon Barad
5 views•5 min read
•about 3 hours ago•CVE-2026-107394
6.8

CVE-2026-107394: Server-Side Request Forgery Bypass via Parser Differential in Indico

An incomplete Server-Side Request Forgery (SSRF) validation check in Indico prior to version 3.3.13 allows authenticated event organizers to bypass outbound network restrictions. By utilizing backslash characters within crafted URLs, attackers can exploit a parser differential between the application's validator and the downstream HTTP client library to access internal network resources.

Alon Barad
Alon Barad
5 views•6 min read
•about 4 hours ago•CVE-2026-107717
6.5

CVE-2026-107717: Chat Role Injection and Prompt Boundary Bypass in Banks Library

CVE-2026-107717 represents a critical prompt boundary bypass and chat role injection vulnerability in the Banks Python package (versions prior to 2.5.0). The library parses generated template outputs line-by-line, attempting to validate each segment as a JSON-serialized ChatMessage object without validating the source boundaries of the text. If an application integrates user input directly into a prompt template, a remote, unauthenticated attacker can supply multi-line inputs with structured JSON payloads. This input is then parsed as high-privilege system instructions or tool execution responses, completely hijacking downstream Large Language Model behavior.

Alon Barad
Alon Barad
8 views•6 min read
•about 5 hours ago•CVE-2026-107716
7.3

CVE-2026-107716: Path Traversal and Link Following in banks DirectoryPromptRegistry

Improper pathname limitation and link resolution (CWE-22 and CWE-59) in the banks library prior to version 2.5.1 allow local attackers to read or write arbitrary files via crafted symbolic links in the prompt directory registry.

Amit Schendel
Amit Schendel
8 views•7 min read
•about 6 hours ago•CVE-2026-107726
9.3

CVE-2026-107726: Unrestricted Deserialization in Hazelcast Zero Config Compact Serialization

Improper validation of dynamic class resolution within Hazelcast's Zero Config Compact Serialization allows unauthenticated clients to trigger reflective class instantiation. This flaw can be exploited to read arbitrary JVM heap or off-heap memory, crash cluster nodes, or achieve arbitrary code execution under specific classpath conditions. This issue is resolved in Hazelcast versions 5.4.5, 5.5.10, 5.6.1, and 5.7.0.

Alon Barad
Alon Barad
6 views•6 min read