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



GHSA-MQQ5-J7W8-2HGH

GHSA-MQQ5-J7W8-2HGH: Missing Authorization in Alchemy CMS API Pages Controller

Alon Barad
Alon Barad
Software Engineer

Jun 19, 2026·6 min read·12 visits

Executive Summary (TL;DR)

Unauthenticated remote attackers can dump the entire nested page structure and elements of Alchemy CMS via a missing authorization check on the API nested pages endpoint.

A critical missing authorization vulnerability exists in the API Pages Controller of Alchemy CMS. An unauthenticated remote attacker can exploit the 'nested' action to retrieve the entire nested page tree. Furthermore, by appending the query parameter '?elements=true', the attacker can extract sensitive content from draft, unpublished, and restricted pages, bypassing all access controls.

Vulnerability Overview

Alchemy CMS relies on an API-driven architecture to deliver content to headless frontends. The Api::PagesController manages the retrieval of page objects and their associated hierarchies. Under default operations, the application is expected to restrict access to unpublished nodes, drafts, and member-only sections unless a user possesses an authenticated session with sufficient privileges.

The API exposes several endpoints to allow external clients to reconstruct the site structure. One such endpoint is the nested action, which returns a structured page tree. Because this action is exposed to the public network, it represents a high-priority attack surface for automated enumeration and targeted information harvesting.

The vulnerability manifests as a complete omission of authorization validation within this API pathway. Unauthenticated remote actors can access the nested endpoint to bypass individual page access controls. The resulting behavior is the extraction of restricted structural data and sensitive text assets from database records.

Root Cause Analysis

The root cause of this vulnerability lies in the missing enforcement of access control policies within Api::PagesController#nested. While security policies are correctly declared via CanCanCan rules on sibling endpoints like show and index, the nested action completely bypassed these checks. The controller processed requests for nested page trees without evaluating user sessions or invoking permission validation libraries.

Database queries executed during the processing of this endpoint were entirely unscoped. The PageTreePreloader service class queried the self_and_descendants Active Record association directly from the page model. Because the database query lacked scoping constraints like .accessible_by(current_ability, :read), the application loaded all descendants into memory regardless of their status.

The data serialization layer introduced an additional point of failure. When the query parameter ?elements=true was specified, PageTreeSerializer automatically retrieved and appended elements associated with each node. The serializer did not verify whether the active session had permission to read the parent page, leading to the direct disclosure of restricted text, configurations, and metadata.

Code Analysis

A direct comparison of the vulnerable and patched code paths demonstrates how the authorization gap was closed. The primary controller modification introduces a direct authorization call using CanCanCan integration before constructing the preloader instance.

# Vulnerable Controller Implementation
def nested
  @page = Page.find_by(id: params[:page_id]) || Language.current_root_page
  preloaded_page = PageTreePreloader.new(page: @page, user: current_alchemy_user).call
  # ...
end
# Patched Controller Implementation
def nested
  @page = Page.find_by(id: params[:page_id]) || Language.current_root_page
  authorize! :show, @page
  preloaded_page = PageTreePreloader.new(
    page: @page,
    user: current_alchemy_user,
    ability: current_ability
  ).call
  # ...
end

The PageTreePreloader class was updated to accept the active user's ability context. This context is then applied directly to the Active Record relation using the .accessible_by scope, ensuring that only authorized pages are queried from the database layer.

# Patched Preloader Query Scoping
def call
  pages = page.self_and_descendants.accessible_by(ability, :read)
  # ...
end

Exploitation & Proof of Concept

Exploitation of this vulnerability is straightforward and requires no prior authentication or specialized tools. An attacker can map the complete structure of an Alchemy CMS instance using a single unauthenticated HTTP GET request. This mapping reveals unpublished pages, hidden drafts, and restricted member directories.

To initiate the attack, a client queries the nested API endpoint. The server responds with the complete JSON hierarchy of pages, including elements marking nodes as restricted or public.

curl -s http://localhost:3000/api/pages/nested | grep -E '"name"|"restricted"'

To extract the actual text content and sensitive elements from these restricted pages, the attacker appends the elements query parameter. This forces the server to serialize and return the internal elements of all listed pages, including those behind authorization barriers.

curl -s "http://localhost:3000/api/pages/nested?elements=true"

The efficacy of this bypass can be verified by attempting a direct request to the show API endpoint for a restricted page. The target endpoint correctly enforces authorization and returns a 403 Forbidden status, while the nested action returns the same data without restriction.

Impact Assessment

The security impact of this vulnerability is high. It permits unauthenticated remote actors to bypass access controls, compromising the confidentiality of all content stored within the CMS database. This includes embargoed marketing copy, internal documentation, confidential product specs, and proprietary corporate communications.

Because the vulnerability affects a core API endpoint, automated scanners can easily discover and exploit exposed installations. The CVSS score of 7.5 reflects high impact to confidentiality, with no impact to integrity or availability. The vulnerability does not require user interaction or elevated privileges to execute.

CVSS v3.1 Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N

No evidence of active exploitation in ransomware campaigns has been recorded, and the vulnerability is not currently listed on the CISA Known Exploited Vulnerabilities catalog. However, the availability of public proof-of-concept material increases the risk of opportunistic exploitation by threat actors mapping web assets.

Remediation & Mitigation

Remediation requires upgrading the alchemy_cms gem to a patched version. Security administrators must identify the current major and minor release branch of their installation and apply the corresponding patch.

For systems running on the 8.2 branch, upgrade to version 8.2.6 or higher. For systems on the 8.1 branch, upgrade to version 8.1.14 or higher. For systems on the 8.0 branch, upgrade to 8.0.15 or higher. For legacy deployments on the 7.4 branch, upgrade to 7.4.15 or higher.

If immediate patching is not possible, a temporary hotfix can be applied by creating a Rails initializer. This initializer intercepts incoming requests to the nested pages API and enforces basic role-based access checks.

# config/initializers/alchemy_api_nested_hotfix.rb
ActiveSupport.on_load(:action_controller) do
  before_action if: -> { request.path == "/api/pages/nested" } do
    unless current_alchemy_user&.has_role?(:author, :admin)
      render json: { error: "Forbidden" }, status: :forbidden
    end
  end
end

The official fix is complete. By applying authorization checks at the controller level, scoping database queries in the preloader service, and validating abilities inside the serializer, the developers implemented a defense-in-depth strategy that prevents variant exploitation.

Official Patches

AlchemyCMSOfficial fixing commit for the nested pages authorization bypass

Fix Analysis (1)

Technical Appendix

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

Affected Systems

Alchemy CMS installations relying on the API Pages Controller

Affected Versions Detail

Product
Affected Versions
Fixed Version
alchemy_cms
AlchemyCMS
<= 7.4.147.4.15
alchemy_cms
AlchemyCMS
>= 8.0.0.a, <= 8.0.148.0.15
alchemy_cms
AlchemyCMS
>= 8.1.0, <= 8.1.138.1.14
alchemy_cms
AlchemyCMS
>= 8.2.0, <= 8.2.58.2.6
AttributeDetail
CWE IDCWE-862 (Missing Authorization)
Attack VectorNetwork (Unauthenticated)
CVSS Score7.5 (High)
Exploit StatusProof-of-concept (PoC) available
KEV StatusNot listed
ImpactFull disclosure of unpublished, draft, and restricted pages and elements

MITRE ATT&CK Mapping

T1083File and Directory Discovery
Discovery
T1213Data from Information Repositories
Collection
CWE-862
Missing Authorization

The software does not perform an authorization check when an actor attempts to access a resource or perform an action.

Vulnerability Timeline

Vulnerability remediated in repository via commit 8417a2e9dcb00653c8b238f8a040b09532dd4c0f
2026-06-18
Official GitHub Security Advisory GHSA-MQQ5-J7W8-2HGH published
2026-06-19
Patched versions of the alchemy_cms gem pushed to RubyGems
2026-06-19

References & Sources

  • [1]GitHub Security Advisory GHSA-MQQ5-J7W8-2HGH
  • [2]Repository Security Advisory for GHSA-MQQ5-J7W8-2HGH
  • [3]Official Patch Commit
  • [4]Alchemy CMS GitHub Repository

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

•6 minutes ago•CVE-2026-68945
8.8

CVE-2026-68945: Cache-Key Ambiguity in Angular HttpTransferCache Leading to State Poisoning

An in-depth technical analysis of CVE-2026-68945, a high-severity security vulnerability in Angular's `@angular/common/http` package. The flaw stems from an ambiguity in how query parameters are serialized to generate cache keys during Server-Side Rendering (SSR) within the `HttpTransferCache` component. By failing to encode delimiters and implicitly coercing arrays to comma-joined strings, the serialization mechanism yields identical cache keys for distinct requests, facilitating State Poisoning and Cross-Request Response Reuse.

Amit Schendel
Amit Schendel
0 views•5 min read
•about 2 hours ago•CVE-2026-43501
9.8

CVE-2026-43501: Heap Out-of-Bounds Write in Linux Kernel IPv6 RPL Segment Routing Header Processing

A critical heap out-of-bounds (OOB) write vulnerability exists in the Linux kernel's IPv6 RPL (Routing Protocol for Low-Power and Lossy Networks) Segment Routing Header (SRH) processing logic. The vulnerability is located within net/ipv6/exthdrs.c, specifically in the ipv6_rpl_srh_rcv function. Under specific circumstances, when a packet containing a compressed RPL Source Routing Header is processed, segment swapping can reduce the common-prefix length, causing the recompressed header to grow. Because the kernel fails to validate available headroom on intermediate segments, a buffer underflow occurs during skb_push. This leads to an integer wrap in the MAC header offset pointer during MAC header rebuilding, causing a 14-byte out-of-bounds memory write roughly 64 KiB past the socket buffer.

Alon Barad
Alon Barad
2 views•10 min read
•2 days ago•CVE-2026-58263
7.2

CVE-2026-58263: Mutation Cross-Site Scripting (mXSS) in Jodit Editor clean-html Sanitizer

CVE-2026-58263 is a high-severity Mutation Cross-Site Scripting (mXSS) vulnerability affecting Jodit Editor prior to version 4.12.28. The flaw exists in Jodit's built-in clean-html sanitizer plugin, which fails to securely parse and sanitize nested elements containing foreign namespaces like MathML and SVG. Attackers can bypass sanitization by smuggling malicious payload elements inside rawtext container tags like style inside a MathML node, leading to DOM mutation and unauthenticated arbitrary script execution in the context of the user's browser session.

Amit Schendel
Amit Schendel
10 views•6 min read
•2 days ago•CVE-2026-65841
5.3

CVE-2026-65841: Client-Side Cross-Site Scripting (XSS) via Foreign Namespace Sanitization Bypass in Jodit Editor

Jodit Editor versions prior to 4.13.6 are vulnerable to client-side Cross-Site Scripting (XSS). The clean-html plugin's sanitization routine performs case-sensitive lookups against uppercase-only element blacklists. When processing XML-based foreign namespaces such as SVG or MathML, DOM engines preserve the lowercase format of tags. Because Jodit's denyTags check fails to normalize tag casing, malicious script blocks nested inside foreign namespace elements completely bypass validation and serialize directly into the editor output.

Amit Schendel
Amit Schendel
7 views•6 min read
•2 days ago•CVE-2026-53510
8.1

CVE-2026-53510: Remote Code Execution via Dynamic WSDL Parsing in Savon Ruby SOAP Client

A critical code injection vulnerability exists in Savon, a widely used SOAP client library for Ruby, prior to version 2.17.2. The vulnerability resides within the Savon::Model.all_operations module, where operation names fetched from a target Web Services Description Language (WSDL) document are dynamically evaluated via module_eval without sanitization. An attacker capable of manipulating the target WSDL document (e.g., through Man-in-the-Middle attacks, DNS hijacking, or Server-Side Request Forgery) can execute arbitrary Ruby code in the context of the parent application process.

Alon Barad
Alon Barad
12 views•6 min read
•2 days ago•CVE-2026-53466
6.5

CVE-2026-53466: Integer Conversion Overflow in ImageMagick XCF Decoder

An integer conversion overflow vulnerability exists in the XCF decoder of ImageMagick before version 6.9.13-51 and 7.1.2-26. The issue arises from mixed-type arithmetic that promotes calculation results to floating-point representations, causing an undefined cast back to integer. Under optimizing compilers, this undefined behavior results in bounds checks being bypassed, allowing out-of-bounds heap reads.

Amit Schendel
Amit Schendel
6 views•6 min read