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-70590

CVE-2026-70590: Blind Password Hash Disclosure in TryGhost Ghost Admin API via Insecure Filter Mapping

Alon Barad
Alon Barad
Software Engineer

Aug 5, 2026·7 min read·1 visit

Executive Summary (TL;DR)

Authenticated staff-level users can exploit insecure nested filter mapping in the Ghost Admin API to extract bcrypt password hashes of other users, including administrators, via boolean-based blind SQL side-channel queries.

An authenticated staff-level user can perform a side-channel, boolean-based blind database query attack through the Ghost Admin API to systematically extract the hashed passwords (bcrypt) of other staff users, including administrators, due to insecure filter mapping.

Vulnerability Overview

CVE-2026-70590 defines a security vulnerability in the administrative API of the Ghost content management system, specifically involving unauthorized exposure of sensitive information (CWE-200). The vulnerability surfaces in the query dynamic-filtering mechanism used within Ghost's Admin API. An authenticated attacker possessing staff-level privileges can query API resources, such as posts or pages, and instruct the application engine to evaluate comparisons against arbitrary backend database columns.

While the application layer actively filters and sanitizes API JSON payloads before they are returned to clients, it does not prevent the database execution engine from evaluating these comparative filters. Consequently, the API serves as an unintentional side-channel oracle. If the specified filter evaluates to true, the query succeeds and returns valid entries. If the filter evaluates to false, the system yields empty results.

This behavior allows a malicious actor with API access to iteratively reconstruct the bcrypt password hashes of administrative and other staff accounts. Although the hashes are stored using the computationally intensive bcrypt algorithm, they remain subject to offline brute-force and dictionary attacks. Complete compromise of target accounts becomes a secondary consequence if the offline cracking attempt succeeds.

Root Cause Analysis

The root cause of this vulnerability lies in the implementation of the Node Query Language (NQL / GQL) translation layer in Ghost. Ghost uses NQL to compile high-level filter query parameters, such as ?filter=status:published, directly into database queries via the Bookshelf.js and Knex.js query builders. When compiling these filters, the API prior to version 6.54.1 failed to validate the path depth and column names when traversing nested relations.

When a staff-level user requests a resource like /posts or /pages, they can supply a custom nested filter parameter, such as authors.password:~'a%'. The query translation logic parses the query and generates a SQL statement that joins the users (authors) table and executes a LIKE comparison against the password field. The Bookshelf model correctly excludes the password field from the final JSON serialization context, but the underlying database query execution has already occurred.

The exploitability of this side channel depends heavily on the underlying database engine and collation settings. On MySQL, which defaults to case-insensitive collations such as utf8mb4_general_ci, character comparisons using the LIKE operator (~ in NQL) are case-insensitive, returning positive matches for both uppercase and lowercase characters. On PostgreSQL or SQLite, exact binary matches are evaluated, allowing full-fidelity extraction of the precise case-sensitive bcrypt hash directly. This engine dependency dictates the complexity of the subsequent offline processing phase.

Code Analysis & Patch Walkthrough

To mitigate this issue, the Ghost development team implemented a unified filtering transformer within the query options execution path. The fix commit 63c31fad7e473caa62d8fbb4651a04a2a62b5d00 enforces the rejectAdminApiRestrictedFieldsTransformer across multiple endpoint controllers including posts, pages, and their associated export engines.

In the vulnerable implementation of the pages endpoint controller, the query parameters passed directly to models.Post.findPage(frame.options) without filtering or intercepting client-supplied AST fields. The patch inserts the mongoTransformer property into the options object:

// ghost/core/core/server/api/endpoints/pages.js
const {rejectAdminApiRestrictedFieldsTransformer} = require('./utils/api-filter-utils');
 
// ...
query(frame) {
    const options = {
        ...frame.options,
        mongoTransformer: rejectAdminApiRestrictedFieldsTransformer
    };
    return models.Post.findPage(options);
}

This structural modification prevents the query builder from mapping forbidden database columns. The transformer recursively sweeps the AST structure parsed from the NQL expression. If a restricted field such as password is detected within the query path, the transformer blocks or normalizes the filter payload before Knex.js compiles it to raw SQL. This prevents the execution of arbitrary comparisons on administrative credential tables, closing the boolean oracle side-channel entirely.

Exploitation & Attack Methodology

Exploiting CVE-2026-70590 requires a valid administrative or staff-level session token to interact with the Ghost Admin API. The attacker leverages the dynamic filter parameter exposed on endpoints like /ghost/api/admin/posts/ or /ghost/api/admin/pages/. An attack starts by querying a post associated with the target author while appending a wildcard comparison matching the expected prefix of a bcrypt hash.

Because bcrypt hashes start with a predictable prefix, such as $2b$12$, the attacker can verify the oracle function by requesting /ghost/api/admin/posts/?filter=authors.password:~'$2b$'. A successful match confirms the target hash structure. The attacker then builds an automated script to systematically cycle through the base64 character set ([a-zA-Z0-9./$]) for each character index of the hash.

Character 1: $ -> True
Character 2: 2 -> True
Character 3: b -> True
Character 4: $ -> True
Character 5: 1 -> True
Character 6: 2 -> True
Character 7: $ -> True
Character 8: [Iterate through a-z, A-Z, 0-9] -> Match: a

This serial lookup yields the target's complete bcrypt hash. In a MySQL environment, the resulting extracted hash is case-insensitive. The attacker must feed the case-insensitive hash into an offline cracking tool like Hashcat or John the Ripper, configured to mutate alphabetical positions. Under PostgreSQL or SQLite, the exact hash is retrieved, enabling a direct dictionary attack against the clean bcrypt string.

Impact Assessment

The concrete impact of CVE-2026-70590 is unauthorized access to sensitive credential material, leading to potential account takeover. The CVSS score for this vulnerability is assessed at 4.8 (Medium). The score reflects the requirement for high-privilege access (PR:H) and high attack complexity (AC:H) due to the need for a staff session, collation issues, and the necessity of offline brute-forcing.

Importantly, Ghost includes a security control called Device Verification. If an attacker successfully cracks an administrator's bcrypt hash and attempts to authenticate from an unrecognized device or IP address, Ghost prompts for a verification code sent to the owner's registered email. This verification step serves as a secondary line of defense that prevents immediate, direct account takeover unless the attacker also compromises the user's email inbox.

Furthermore, the requirement of high privileges limits the attack surface primarily to trusted users or compromised staff credentials. However, in multi-author publications, a rogue junior writer could exploit this vulnerability to elevate their privileges to a full administrator. This scenario bypasses role-based access controls entirely, presenting a severe risk to large-scale, collaborative editorial teams.

Remediation & Mitigation

The primary remediation path is upgrading the Ghost instance to version 6.54.1 or higher. This update applies the necessary NQL transformer filters across all post and page API controllers, preventing unauthorized SQL comparisons. Administrators running self-hosted installations can update their environments using the Ghost-CLI command:

ghost update

If patching cannot be executed immediately, administrators should implement defensive configuration controls. Deploying a Web Application Firewall (WAF) rule to intercept and inspect URI queries targeting the Admin API is highly recommended. The following ModSecurity rule blocks requests containing references to restricted fields within query parameters:

SecRule ARGS:filter "(?i)\bpassword\b" "id:100001,phase:2,deny,status:400,msg:'Insecure filter mapping attempt detected'"

Additionally, security teams should audit the Admin API access logs for anomalous, high-frequency requests targeting /ghost/api/admin/posts/ or /ghost/api/admin/pages/ containing complex filter query structures. Standard operational traffic rarely requires highly nested relational password comparisons, making these patterns highly visible indicators of compromise.

Official Patches

TryGhostGitHub Security Advisory GHSA-jm22-3w23-5q7w

Fix Analysis (1)

Technical Appendix

CVSS Score
4.8/ 10
CVSS:3.1/AV:N/AC:H/PR:H/UI:R/S:U/C:L/I:H/A:N

Affected Systems

Ghost (TryGhost/Ghost) CMS

Affected Versions Detail

Product
Affected Versions
Fixed Version
Ghost
TryGhost
< 6.54.16.54.1
AttributeDetail
CWE IDCWE-200
Attack VectorNetwork (AV:N/AC:H/PR:H/UI:R/S:U/C:L/I:H/A:N)
CVSS Score4.8
EPSS Score0.0
ImpactInformation Disclosure (Password Hashes)
Exploit StatusNone (No public weaponized exploit)
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1005Data from Local System
Collection
T1552Unsecured Credentials
Credential Access
CWE-200
Exposure of Sensitive Information to an Unauthorized Actor

Exposure of Sensitive Information to an Unauthorized Actor

Vulnerability Timeline

Vulnerability reported and patched internally by the Ghost maintainers
2026-07-27
Security advisory GHSA-jm22-3w23-5q7w published and CVE-2026-70590 assigned
2026-08-04
Public release of patched version Ghost v6.54.1
2026-08-04

References & Sources

  • [1]GitHub Security Advisory GHSA-jm22-3w23-5q7w
  • [2]Fix Commit
  • [3]Pull Request #29628
  • [4]Release Tag v6.54.1
  • [5]CVE Registry Record

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

•27 minutes ago•CVE-2026-53946
5.4

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

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.

Alon Barad
Alon Barad
0 views•6 min read
•about 2 hours ago•CVE-2026-70591
4.1

CVE-2026-70591: Server-Side Request Forgery in Ghost Admin Image Fetching

A comprehensive technical analysis of CVE-2026-70591, a Server-Side Request Forgery (SSRF) vulnerability identified in the Ghost Content Management System. The flaw resides in the server-side image fetching mechanism of the ImageSize class, which allows authenticated, staff-level users to force the backend to perform unvalidated HTTP GET requests targeting local or private network services. This report provides an in-depth exploration of the root cause, vulnerable code structures, patch implementations, and mitigation steps.

Alon Barad
Alon Barad
2 views•7 min read
•about 3 hours ago•CVE-2026-70592
5.5

CVE-2026-70592: Path Traversal Vulnerability in Ghost CMS Database Exporter

A path traversal vulnerability (CWE-22) in Ghost CMS versions 1.20.1 through 6.54.0 allows authenticated administrators to escape the backup directory and perform arbitrary file write operations on the hosting system. This vulnerability was resolved in version 6.54.1.

Amit Schendel
Amit Schendel
3 views•5 min read
•about 4 hours ago•CVE-2026-70593
6.6

CVE-2026-70593: Path Traversal and Arbitrary File Write via Custom Theme Upload in Ghost CMS

CVE-2026-70593 is a path traversal and arbitrary file write vulnerability affecting Ghost CMS. Versions from 0.10.0 up to 6.54.0 are vulnerable. Authenticated administrators can exploit this flaw by uploading a custom theme in a ZIP archive that contains path traversal characters. The vulnerability is mitigated in version 6.54.1.

Alon Barad
Alon Barad
5 views•5 min read
•about 5 hours ago•CVE-2026-70594
6.7

CVE-2026-70594: Session Fixation in Ghost Admin Panel

A critical session fixation vulnerability exists in the Ghost Admin panel from version 2.2.0 until 6.54.1. The Express-based authentication backend fails to invalidate or rotate the session identifier during login, allowing attackers to hijack administrative sessions.

Alon Barad
Alon Barad
3 views•5 min read
•about 6 hours ago•CVE-2026-53950
7.5

CVE-2026-53950: DOM-based Cross-Site Scripting in @tryghost/activitypub

A high-severity Cross-Site Scripting (XSS) vulnerability was identified in the @tryghost/activitypub package, the social and federation client library for the Ghost publishing platform. Prior to version 3.1.0, the ActivityPub client rendered incoming federated posts from external servers directly in the web user interface without proper sanitization. A maliciously customized ActivityPub server federated with a Ghost instance could transmit crafted posts containing embedded HTML payloads. When viewed by a user inside the ActivityPub client interface, the browser executes the injected JavaScript within the security context of the Ghost application domain.

Amit Schendel
Amit Schendel
4 views•6 min read