CVE-2026-76894: ckan-mcp-server: missing postMessage origin checks in UI

GHSA-vqff-r82h-9crcLOW
Published October 16, 2026
CISO Take

The MCP Apps UI in @aborruso/ckan-mcp-server (a DataStore table rendered in a host webview/iframe) accepts postMessage events without checking event.origin and sends its own messages to target origin '*'. A frame able to reach the document can inject fabricated rows and links (display spoofing, not XSS, since values are HTML-escaped) or spoof the ui/initialize handshake. Exploitation requires a non-standard embedding model and user interaction, so the advisory itself rates it Low (CVSS 3.1), with no EPSS data, no KEV listing, no public exploit and no scanner template. The package has 506 downstream dependents and 79 other CVEs, so it is worth tracking as a hygiene issue rather than an emergency. Upgrade to 0.4.112 in normal patch cycles and confirm your MCP host embeds the UI only in a trusted parent.

Sources:NVDGitHub AdvisoryATLASOpenSSF

What is the risk?

Low. CVSS 3.1 is 3.1 (AV:N/AC:H/PR:N/UI:R, confidentiality-only impact). It is a defense-in-depth gap rather than a directly remotely triggerable flaw, because in a correct MCP Apps host the parent is trusted. Exploitation needs a hostile frame able to message the UI plus a user acting on spoofed content. No KEV listing, no public exploit, no Nuclei template and no EPSS data. The package's 79 other CVEs and 6.7/10 OpenSSF score suggest an uneven security track record.

How does the attack unfold?

Initial Access
The attacker places a malicious frame or window in the same hierarchy as the MCP host displaying the DataStore table UI.
AML.T0078
Message Injection
The frame sends postMessage payloads that the UI accepts because it never checks event.origin, injecting fabricated fields and records or spoofing the ui/initialize handshake.
AML.T0073
Impact
The table shows fake rows and phishing links as if from the trusted portal, leading to user deception or reliance on false data.
AML.T0048.003

What systems are affected?

PackageEcosystemVulnerable RangePatched
Panelnpm< 0.4.1120.4.112
5.8KOpenSSF 6.9512 dependentsPushed 7d ago67% patched~15d to patchFull package profile →

Do you use Panel? You're affected.

How severe is it?

CVSS 3.1
3.1 / 10
EPSS
N/A
Exploitation Status
No known exploitation
Sophistication
Moderate

What is the attack surface?

AVACPRUISCIA
AVNetwork
ACHigh
PRNone
UIRequired
SUnchanged
CLow
INone
ANone

What should I do?

1 step
  1. Upgrade @aborruso/ckan-mcp-server to 0.4.112 or later. Inventory MCP servers that ship interactive UI resources and check how your host embeds them (sandboxed iframe, trusted parent only). Avoid embedding these UI resources alongside untrusted frames or content. Train users not to click links rendered in MCP tool UIs without verifying the destination. Review other MCP UI resources for the same pattern: no event.origin validation and postMessage with '*'.

How is it classified?

Which compliance frameworks are affected?

This CVE is relevant to:

ISO 42001
A.10.3-Suppliers
NIST AI RMF
MANAGE 2.3-Response to previously unknown risks
OWASP LLM Top 10
LLM03-Supply Chain

Frequently Asked Questions

What is CVE-2026-76894?

The MCP Apps UI in @aborruso/ckan-mcp-server (a DataStore table rendered in a host webview/iframe) accepts postMessage events without checking event.origin and sends its own messages to target origin '*'. A frame able to reach the document can inject fabricated rows and links (display spoofing, not XSS, since values are HTML-escaped) or spoof the ui/initialize handshake. Exploitation requires a non-standard embedding model and user interaction, so the advisory itself rates it Low (CVSS 3.1), with no EPSS data, no KEV listing, no public exploit and no scanner template. The package has 506 downstream dependents and 79 other CVEs, so it is worth tracking as a hygiene issue rather than an emergency. Upgrade to 0.4.112 in normal patch cycles and confirm your MCP host embeds the UI only in a trusted parent.

Is CVE-2026-76894 actively exploited?

No confirmed active exploitation of CVE-2026-76894 has been reported, but organizations should still patch proactively.

How to fix CVE-2026-76894?

Upgrade @aborruso/ckan-mcp-server to 0.4.112 or later. Inventory MCP servers that ship interactive UI resources and check how your host embeds them (sandboxed iframe, trusted parent only). Avoid embedding these UI resources alongside untrusted frames or content. Train users not to click links rendered in MCP tool UIs without verifying the destination. Review other MCP UI resources for the same pattern: no event.origin validation and postMessage with '*'.

What systems are affected by CVE-2026-76894?

This vulnerability affects the following AI/ML architecture patterns: MCP servers with interactive UI resources, agent frameworks, LLM tool-calling hosts, open data retrieval pipelines.

What is the CVSS score for CVE-2026-76894?

CVE-2026-76894 has a CVSS v3.1 base score of 3.1 (LOW).

What is the AI security impact?

Affected AI Architectures

MCP servers with interactive UI resourcesagent frameworksLLM tool-calling hostsopen data retrieval pipelines

MITRE ATLAS Techniques

AML.T0011.003Malicious Link
AML.T0073Impersonation
AML.T0099AI Agent Tool Data Poisoning

Compliance Controls Affected

ISO 42001: A.10.3
NIST AI RMF: MANAGE 2.3
OWASP LLM Top 10: LLM03

What are the technical details?

Original Advisory

## Summary The MCP Apps UI resource (an interactive DataStore table rendered in the host's webview/iframe) communicates with its parent via `postMessage`. Its inbound `message` listener performs no `event.origin` validation, and its outbound messages are sent with target origin `'*'`. Any window/frame able to reach the document can inject data into the table and interfere with the MCP UI handshake, and the UI's own JSON-RPC messages are broadcast without an origin restriction. ## Affected code `src/resources/datastore-table-ui.ts` (inline HTML): ```js window.addEventListener('message', function (event) { var msg = event.data; // no check of event.origin if (!msg || typeof msg !== 'object') return; if (msg.id !== undefined && _pending[msg.id]) { ... resolve/reject pending MCP request ... } ... if (data && (data.fields || data.records)) initTable(data); // renders attacker-supplied data }); // outbound: window.parent.postMessage({ jsonrpc: '2.0', id: id, method: method, params: params || {} }, '*'); mcpNot: window.parent.postMessage({ jsonrpc:'2.0', method:method, params:params||{} }, '*'); ``` There is no allowlist of accepted origins for inbound messages and no fixed target origin for outbound messages. ## Impact - **Content spoofing.** A frame that can `postMessage` to the UI can supply arbitrary `fields`/`records`, causing the table to render fabricated rows and links (e.g. a phishing `__link_url`) that appear to come from the queried portal. (Values are HTML-escaped, so this is display spoofing, not script injection — no XSS.) - **Handshake/UX interference.** Because inbound messages matching a pending `id` resolve/reject the UI's MCP requests, an attacker frame can spoof responses to the `ui/initialize` handshake or otherwise disrupt the panel. - **Outbound leakage.** Posting to `'*'` means the UI's JSON-RPC messages are delivered to whatever the parent origin is; if the resource is ever embedded by a context other than the trusted host, those messages leak to it. Exploitability depends on the host embedding model (in a correct MCP Apps host the parent is the trusted host, which limits who can message the frame), so this is a hardening / defense-in-depth issue rather than a directly remotely-triggerable one — hence Low. ## Proof of concept - `poc/verify-no-origin-check.mjs` — static confirmation that the listener has no origin check and outbound uses `'*'`: ``` [x] validates event.origin : NO [x] outgoing postMessage targetOrigin : '*' (any) RESULT: VULNERABLE ``` - `poc/parent-spoof-poc.html` — a page that embeds the UI and injects fabricated rows cross-origin with no handshake; the UI renders them. ## Remediation - Validate `event.origin` against the expected host origin on every inbound message; drop messages from other origins. - Send outbound `postMessage` with an explicit target origin (the host origin established at initialize time) instead of `'*'`. - Optionally, bind to a nonce/channel established during `ui/initialize` so only the negotiated host can drive the panel.

Exploitation Scenario

An attacker gets a malicious page or frame into the same window hierarchy as an MCP host showing the CKAN DataStore table, for example through a compromised embedded widget. The frame posts a crafted message with fabricated fields and records, including a phishing __link_url. The table renders the rows as if they came from the government open-data portal. An analyst, or an agent-assisted user, clicks the link or trusts the false data, leading to credential phishing or decisions based on poisoned data.

Weaknesses (CWE)

CWE-345 — Insufficient Verification of Data Authenticity: The product does not sufficiently verify the origin or authenticity of data, in a way that causes it to accept invalid data.

Source: MITRE CWE corpus.

CVSS Vector

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

Timeline

Published
October 16, 2026
Last Modified
October 16, 2026
First Seen
October 16, 2026

Related Vulnerabilities