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

CVE-2026-73846: Cache Key Canonicalization Collision in ondata ckan-mcp-server

Alon Barad
Alon Barad
Software Engineer

Sep 3, 2026·7 min read·4 visits

Executive Summary (TL;DR)

Unescaped delimiters in ckan-mcp-server's caching logic allow attackers to cause cache collisions, leading to cache poisoning and unauthorized data exposure.

A medium-severity cache key canonicalization collision vulnerability exists in the ckan-mcp-server prior to version 0.4.112. Unescaped delimiters in key-value parameters and server URLs allow structurally distinct requests to map to the same cryptographic hash, facilitating cache poisoning and unauthorized data exposure.

Vulnerability Overview

The ckan-mcp-server developed by ondata serves as an integration layer utilizing the Model Context Protocol (MCP) to query CKAN open data portals. To optimize retrieval latency and reduce backend load, the server implements a caching layer. This layer serializes request components to generate a deterministic cache key. A vulnerability exists in the serialization mechanism of versions prior to 0.4.112 which fails to safely isolate parameters, leading to cache collisions.

In standard deployments, caching engines rely on the uniqueness of cache keys to map user requests to stored responses. If two distinct requests generate the same cache key, the cache system cannot differentiate between them. This condition is known as a cache key collision. Under specific network and application states, it exposes the application to cache poisoning and unauthorized cache retrieval.

This flaw resides in the combination of the parameter serialization function canonicalizeParams and the main cache key generator buildCacheKey in src/utils/cache.ts. Because the application does not escape field delimiters or preserve data structure boundaries, external inputs can manipulate the logical interpretation of cache keys. This vulnerability represents a significant risk in environments serving sensitive, authenticated, or rate-limited open data.

Root Cause Analysis

The root cause of CVE-2026-73846 is an interpretation conflict (CWE-436) and insufficient verification of data authenticity (CWE-345) due to the unsafe concatenation of request boundaries. In the vulnerable implementation of canonicalizeParams, parameters are processed alphabetically and combined using standard URL-like delimiters. Specifically, key-value pairs are joined by the equals sign (=) and concatenated together using the ampersand (&) character.

The critical error is the absence of escaping or sanitization of these delimiter characters within the parameter values themselves. When a parameter value contains a literal & or =, the function processes it literally. This creates a structural ambiguity where the boundary between keys and values is lost during serialization. For example, a single parameter with a value containing an ampersand is serialized identically to two separate parameters.

Furthermore, the buildCacheKey function constructs the overall hash input by interpolating the server URL, action name, and serialized parameter string with a pipe delimiter (|). No escaping is applied to this delimiter either. An attacker capable of influencing the serverUrl or action string can shift boundaries across the three fields, leading to additional cache collision paths. Finally, the function does not differentiate between a nested object and its raw stringified equivalent, which creates another logical overlap vector.

Code Analysis

To understand the exact mechanics, we examine the pre-patch code in src/utils/cache.ts.

// Pre-patch implementation of canonicalizeParams
export function canonicalizeParams(params: Record<string, unknown>): string {
  const keys = Object.keys(params).sort();
  const pairs: string[] = [];
  for (const key of keys) {
    const value = params[key];
    if (value === undefined || value === null) continue;
    const serialized =
      typeof value === "object" ? JSON.stringify(value) : String(value);
    pairs.push(`${key}=${serialized}`);
  }
  return pairs.join("&");
}

In this vulnerable implementation, if params is { q: 'budget&rows=10' }, the loop yields a single element q=budget&rows=10. If params is { q: 'budget', rows: 10 }, the sorted keys produce pairs ['q=budget', 'rows=10'], which when joined with & result in the exact same string: q=budget&rows=10. This lack of structural preservation directly results in identical SHA1 hashes after processing through buildCacheKey.

The patch in commit 8e1522f9bbfa1f3b21550f17887f60f133e24151 shifts the serialization model from string concatenation to structured JSON serialization. The updated implementation is shown below:

// Patched implementation utilizing JSON array wrapping
function canonicalizeValue(value: unknown): unknown {
  if (Array.isArray(value)) return value.map(canonicalizeValue);
  if (value && typeof value === "object") {
    const sorted: Record<string, unknown> = {};
    for (const key of Object.keys(value as Record<string, unknown>).sort()) {
      sorted[key] = canonicalizeValue((value as Record<string, unknown>)[key]);
    }
    return sorted;
  }
  return value;
}
 
export function canonicalizeParams(params: Record<string, unknown>): string {
  const filtered: Record<string, unknown> = {};
  for (const key of Object.keys(params)) {
    const value = params[key];
    if (value === undefined || value === null) continue;
    filtered[key] = value;
  }
  return JSON.stringify(canonicalizeValue(filtered));
}

In the patched code, parameters are filtered, recursively sorted by key to preserve order-independence, and then serialized via JSON.stringify(). This ensures that characters like & and = are safely wrapped in JSON string quotes and escaped, making serialization unique to the logical data structure. Additionally, buildCacheKey was modified to serialize its inputs within a JSON array, JSON.stringify([serverUrl, action, canonicalizeParams(params)]), eliminating the vulnerable | string interpolation.

Exploitation Methodology

Exploitation of this vulnerability requires an attacker to have network access to the MCP server to submit queries. The objective is to poison the cache for specific queries targeted at legitimate users. An attacker first identifies a target query that a victim is likely to make, such as querying a dataset for public budgets using specific row limits: { q: 'budget', rows: 10 }.

The attacker then sends a crafted query containing the injected delimiters within a single parameter: { q: 'budget&rows=10' }. The vulnerable server processes the attacker's query and serializes the parameter block to "q=budget&rows=10". The server then computes the SHA1 hash of the concatenated string and stores the attacker's customized response in the cache under that hash.

When the victim subsequently issues the legitimate request { q: 'budget', rows: 10 }, the server serializes the victim's parameters. Because of the delimiter collision, the victim's request serializes to the identical string "q=budget&rows=10". The caching layer generates the same SHA1 key, detects a cache hit, and returns the attacker-controlled cached response to the victim. This allows the attacker to forge query results, induce denial of service, or present manipulated information to users.

Technical Impact & Risk Assessment

The technical impact of CVE-2026-73846 is classified as medium severity, with a CVSS v3.1 base score of 6.5. The attack vector is Network, and the attack complexity is High because successful exploitation depends on temporal factors, active cache states, and predicting or forcing user queries. There is no requirement for privileges or user interaction, making it accessible to external unauthenticated actors who can interact with the server.

The primary impact is on data integrity. Attackers can bind malicious, empty, or altered responses to legitimate parameters, causing users to receive incorrect data. While the direct confidentiality impact is rated as Low, cache confusion could potentially expose specific query outputs to unauthorized parties if the caching layer is shared across multiple security contexts.

According to EPSS data, the vulnerability has a low immediate probability of exploitation in the wild, with an EPSS score of 0.00137 (0.137% over 30 days). It is currently not listed in the CISA Known Exploited Vulnerabilities (KEV) catalog, and there are no active, weaponized exploits publicly available. However, because MCP servers often act as bridges between LLMs (Large Language Models) and underlying data sources, a cache poisoning attack on an MCP server could corrupt the training data or prompt contexts of downstream AI systems.

Remediation and Mitigation

The primary and recommended remediation is to upgrade ckan-mcp-server to version 0.4.112 or higher. The official patch fundamentally resolves the parsing ambiguity by adopting JSON-safe serialization. This ensures that parameter delimiters cannot break out of their structural boundaries.

If upgrading is not immediately feasible, organizations should implement input validation at the API gateway or proxy layer. Specifically, input filtering should block any incoming user queries that contain raw delimiter characters, such as &, =, or | within the values of parameters. This prevents attackers from submitting the boundary-breaking strings necessary to trigger the collision.

Additionally, if the environment allows, disabling caching entirely or reducing the cache Time-To-Live (TTL) to a minimal duration can reduce the window of opportunity for an attacker to exploit the timing constraints of cache poisoning. This should be combined with monitoring logs for anomalous query parameters that resemble serialized parameter strings.

Official Patches

ondataCore Patch Commit
ondataRelease v0.4.112

Fix Analysis (2)

Technical Appendix

CVSS Score
6.5/ 10
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:H/A:N
EPSS Probability
0.14%
Top 97% most exploited

Affected Systems

ondata ckan-mcp-server

Affected Versions Detail

Product
Affected Versions
Fixed Version
ckan-mcp-server
ondata
< 0.4.1120.4.112
AttributeDetail
CWE IDCWE-345 / CWE-436
Attack VectorNetwork
CVSS Score6.5 (Medium)
EPSS Score0.00137 (Percentile: 3.39%)
ImpactCache Poisoning / Integrity Compromise
Exploit StatusNone (No Public PoC)
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1557Adversary-in-the-Middle
Credential Access
CWE-345
Insufficient Verification of Data Authenticity

The application does not sufficiently verify that the serialized parameters mapping to a cache key uniquely and authentically represent the actual logical structure of the request, allowing spoofed parameter alignments.

Vulnerability Timeline

Core fixes implemented in commit 8e1522f9bbfa1f3b21550f17887f60f133e24151
2026-07-09
GitHub Advisory GHSA-78x9-fhhx-v2g6 published
2026-08-14
CVE-2026-73846 officially assigned
2026-08-14
NVD registers the vulnerability and publishes score
2026-08-14
CVE record updated and analyzed
2026-08-17

References & Sources

  • [1]GitHub Security Advisory GHSA-78x9-fhhx-v2g6
  • [2]Official Fix Commit
  • [3]Release v0.4.112
  • [4]NVD - CVE-2026-73846

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

•3 minutes ago•CVE-2026-73295
5.4

CVE-2026-73295: DOM-based Cross-Site Scripting (XSS) in Material for MkDocs Search Suggestions

CVE-2026-73295 is a DOM-based Cross-Site Scripting (XSS) vulnerability affecting Material for MkDocs versions 7.2.0 through 9.7.6. When the optional 'search.suggest' feature is enabled, the client-side 'mountSearchSuggest' function processes user-controlled inputs from the URL 'q' parameter and writes them directly to the DOM using an unsafe innerHTML sink without sanitization.

Alon Barad
Alon Barad
0 views•6 min read
•about 1 hour ago•CVE-2026-71869
9.3

CVE-2026-71869: Remote Code Execution in Orval via OpenAPI Default Value Template Literal Injection

CVE-2026-71869 is a critical-severity code injection vulnerability in the Orval code generator (packages: orval, @orval/core, @orval/zod) prior to version 8.21.0. This flaw allows remote attackers to execute arbitrary JavaScript code at import-time by embedding malicious payloads into the default values of OpenAPI or Swagger specifications. This report details the root cause, exploitation mechanism, and patch remediation.

Amit Schendel
Amit Schendel
3 views•7 min read
•about 2 hours ago•CVE-2026-61625
6.8

CVE-2026-61625: Arbitrary File Write via Path Traversal in VictoriaMetrics vmrestore

CVE-2026-61625 is a path traversal vulnerability (CWE-22) within the `vmrestore` utility of VictoriaMetrics. When restoring database shards from a compromised or malicious backup source, the application fails to validate the paths of backup parts before creating and writing files. By injecting objects with directory traversal sequences (such as `../`) into the remote backup storage, an attacker can write arbitrary files to out-of-bounds locations on the system executing the restore operation. Depending on the process privileges, this can result in host compromise via remote code execution.

Amit Schendel
Amit Schendel
4 views•6 min read
•about 4 hours ago•GHSA-99RQ-75J6-5J9F
8.7

GHSA-99rq-75j6-5j9f: Stored and Reflected XSS in SiYuan via SVG Sanitizer Bypass

A stored and reflected Cross-Site Scripting (XSS) vulnerability was identified in the SiYuan kernel before version v3.7.3. The flaw occurs due to a parser differential between the backend Go-based HTML sanitizer and the browser-side XML rendering engine. Attackers can bypass the SVG sanitizer to execute arbitrary JavaScript within the context of the application's origin, leading to complete workspace compromise, data exfiltration, and full local kernel API manipulation.

Amit Schendel
Amit Schendel
3 views•5 min read
•about 5 hours ago•GHSA-GW25-M53R-QH88
6.5

GHSA-gw25-m53r-qh88: Path Traversal Bypass in SiYuan Notebook via /export/temp/ Short-Circuit Branch

An incomplete mitigation in the export-handling logic of SiYuan Notebook allowed authenticated users to bypass directory traversal protections. By crafting a request with percent-encoded path navigation sequences targeting the /export/temp/ route prefix, attackers can trigger an unvalidated short-circuit block that serving arbitrary files from the host server. This bypass renders previous path-traversal mitigations ineffective for the affected endpoint.

Amit Schendel
Amit Schendel
5 views•5 min read
•about 6 hours ago•CVE-2026-62669
7.4

CVE-2026-62669: Critical Two-Factor Authentication Bypass in Grav CMS Login Plugin

CVE-2026-62669 is a critical Improper Authentication vulnerability (CWE-287) in the Grav Login Plugin for Grav CMS. Prior to version 3.8.11, the plugin's key rotation task failed to verify if a user session was fully authorized before regenerating and returning two-factor authentication (2FA) secrets. Consequently, an attacker possessing a victim's primary credentials could invoke this endpoint to replace the 2FA secret, retrieve the replacement, and bypass the MFA constraint entirely.

Amit Schendel
Amit Schendel
2 views•8 min read