CVE-2026-73845: CKAN MCP Server MQA Server Allowlist Bypass Vulnerability
MODERATECVE-2026-73845 is a MODERATE (CVSS 5.3) mqa server allowlist bypass vulnerability (CWE-20: Improper Input Validation) affecting CKAN MCP Server libraries in the npm ecosystem. The issue involves mqa server allowlist bypass via unanchored regex (`isvalidmqaserver`). Remediation is available by upgrading affected packages to version 0.4.112.
CVE-2026-73845 at a Glance
Security Impact
CVSS: 5.3
The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N).
How to Fix CVE-2026-73845
To remediate this vulnerability, upgrade all affected CKAN MCP Server dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.
npm install @aborruso/ckan-mcp-server@0.4.112
Run the following command in your project directory to verify that all resolved dependencies use the patched release:
npm ls @aborruso/ckan-mcp-server
How to Check if You Are Affected
To determine whether your Node.js application is affected by CVE-2026-73845, inspect your project dependencies using npm:
npm ls @aborruso/ckan-mcp-server
Analyze the terminal output to locate any version of CKAN MCP Server in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 0.4.112), your application is affected.
Note: The npm ls @aborruso/ckan-mcp-server command inspects dependencies declared in your package.json and lockfile; it does not perform automated runtime dynamic scanning.
Technical Details
Vulnerability Mechanism & Technical Analysis
This vulnerability is classified under CWE-20: Improper Input Validation, where the product receives input or data, but it does not validate or incorrectly validates that the input has the properties that are required to process the data safely and correctly. In CKAN MCP Server, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.
Source Advisory Statement
CVE-2026-73845 Affected CKAN MCP Server Versions
1 component(s)| Product / Package | Ecosystem | Affected Versions | Fixed Version |
|---|---|---|---|
|
@aborruso/ckan-mcp-server
|
npm |
< 0.4.112
|
0.4.112
|
References
Frequently Asked Questions
What is CVE-2026-73845?
Which CKAN MCP Server versions are affected?
What version fixes CVE-2026-73845?
Is @aborruso/ckan-mcp-server affected?
What is the CVSS score of CVE-2026-73845?
What CWE is associated with CVE-2026-73845?
How can I check npm dependencies for CVE-2026-73845?
Machine-readable OSV JSON
OSV v1.5 Schema
{
"schema_version" : "1.4.0",
"id" : "GHSA-83x6-42hr-jc76",
"modified" : "2026-09-02T14:52:21Z",
"published" : "2026-09-02T14:52:21Z",
"aliases" : [ "CVE-2026-73845" ],
"summary" : "CKAN MCP Server: MQA server allowlist bypass via unanchored regex (`isValidMqaServer`)",
"details" : "## Summary\n\nThe `ckan_get_mqa_quality` and `ckan_get_mqa_quality_details` tools restrict their `server_url` argument to `dati.gov.it` via a regular expression. The regex is anchored only at the start and places no boundary after the host, so any URL whose host merely **begins with** `dati.gov.it` — or that uses `dati.gov.it` as URL *userinfo* before an `@` — passes validation while actually targeting an attacker-controlled host.\n\n## Affected code\n\n```js\n// src/tools/quality.ts\nconst ALLOWED_SERVER_PATTERNS = [\n /^https?:\\/\\/(www\\.)?dati\\.gov\\.it/i // <-- no end anchor / host boundary\n];\nexport function isValidMqaServer(serverUrl: string): boolean {\n return ALLOWED_SERVER_PATTERNS.some(pattern => pattern.test(serverUrl));\n}\n```\n\nAll of the following return `true`:\n\n| URL | Real host |\n|-----|-----------|\n| `https://dati.gov.it.attacker.com/x` | `dati.gov.it.attacker.com` (attacker) |\n| `http://dati.gov.it.evil.example/api` | `dati.gov.it.evil.example` (attacker) |\n| `https://dati.gov.it@attacker.com/x` | `attacker.com` (userinfo trick) |\n\nAfter passing this check, `server_url` flows into `getMqaQuality`/`getMqaQualityDetails`, which call `makeCkanRequest(serverUrl, \"package_show\", { id })`. The server therefore issues a request to the attacker-controlled host and returns its (parsed) response to the caller.\n\n## Impact\n\n- The intended \"dati.gov.it only\" trust boundary for the MQA tools is defeated; they can be driven against arbitrary external hosts.\n- The attacker host receives the request (including the `dataset_id`) and controls the response body that is surfaced back to the model/user — enabling response spoofing and, in an agentic setting, indirect prompt-injection content delivered under the guise of a trusted-portal tool.\n- Contributes to SSRF surface: while `makeCkanRequest` blocks private/internal IPs, this bypass removes the domain restriction that the code intends to enforce for these tools.\n\nThe `@`-userinfo variant is the most severe form because validation passes on a string whose *actual* host is fully attacker-chosen.\n\n## Proof of concept\n\n`poc/mqa-allowlist-poc.mjs` runs the verbatim regex over benign and malicious URLs:\n\n```\naccepted expected_legit url\ntrue true https://dati.gov.it/opendata <- legit\ntrue false https://dati.gov.it.attacker.com/x <- BYPASS\ntrue false http://dati.gov.it.evil.example/api <- BYPASS\ntrue false https://dati.gov.it@attacker.com/x <- BYPASS\n```\n\n## Remediation\n\nValidate the parsed host, not the raw string. For example:\n\n```js\nfunction isValidMqaServer(serverUrl) {\n let u; try { u = new URL(serverUrl); } catch { return false; }\n if (u.protocol !== \"https:\") return false;\n const h = u.hostname.toLowerCase();\n return h === \"dati.gov.it\" || h === \"www.dati.gov.it\";\n // or: h === \"dati.gov.it\" || h.endsWith(\".dati.gov.it\")\n}\n```\n\nAnchoring the regex end-to-end (`/^https:\\/\\/(www\\.)?dati\\.gov\\.it(\\/|$)/i`) also closes the suffix trick, but URL-parsing + exact host comparison is the robust fix and also neutralizes the `@`-userinfo variant.",
"severity" : [ {
"type" : "CVSS_V3",
"score" : "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N"
} ],
"affected" : [ {
"package" : {
"ecosystem" : "npm",
"name" : "@aborruso/ckan-mcp-server"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"fixed" : "0.4.112"
} ]
} ]
} ],
"references" : [ {
"type" : "WEB",
"url" : "https://github.com/ondata/ckan-mcp-server/security/advisories/GHSA-83x6-42hr-jc76"
}, {
"type" : "ADVISORY",
"url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-73845"
}, {
"type" : "WEB",
"url" : "https://github.com/ondata/ckan-mcp-server/commit/8e1522f9bbfa1f3b21550f17887f60f133e24151"
}, {
"type" : "PACKAGE",
"url" : "https://github.com/ondata/ckan-mcp-server"
}, {
"type" : "WEB",
"url" : "https://github.com/ondata/ckan-mcp-server/releases/tag/v0.4.112"
} ],
"database_specific" : {
"cwe_ids" : [ "CWE-20", "CWE-625", "CWE-918" ],
"severity" : "MODERATE",
"github_reviewed" : true,
"github_reviewed_at" : "2026-09-02T14:52:21Z",
"nvd_published_at" : "2026-08-14T17:20:36Z"
}
}