Niska

ckan-mcp-server: zasób DataStore Table UI nie sprawdza pochodzenia postMessage (in) i wysyła dane do targetOrigin "*" (out)

  • Ujawniono: 16.10.2026
  • Aktualizacja: 20.10.2026 08:36

Podsumowanie

Zasób interfejsu użytkownika MCP Apps (interaktywna tabela DataStore renderowana w widoku webview/iframe hosta) komunikuje się ze swoim rodzicem za pośrednictwem postMessage. Odbiornik przychodzący message nie przeprowadza weryfikacji event.origin, a wiadomości wychodzące są wysyłane z docelowym pochodzeniem '*'. Dowolne okno lub ramka mogąca dotrzeć do dokumentu może wstrzyknąć dane do tabeli i zakłócić uzgadnianie (handshake) interfejsu MCP, a własne komunikaty JSON-RPC interfejsu są rozgłaszane bez ograniczeń dotyczących pochodzenia.

Kod podatny na zagrożenie

src/resources/datastore-table-ui.ts (wbudowany 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||{} }, '*');

Brak listy dozwolonych pochodzeń dla wiadomości przychodzących oraz brak zdefiniowanego docelowego pochodzenia dla wiadomości wychodzących.

Wpływ

  • Podszywanie się pod treść (Content spoofing). Ramka, która może wysłać postMessage do interfejsu, może przekazać dowolne fields/records, powodując wyrenderowanie w tabeli sfabrykowanych wierszy i linków (np. phishingowego __link_url), które wydają się pochodzić z odpytywanego portalu. (Wartości są traktowane funkcją escape dla formatu HTML, więc jest to podszywanie się pod treść wyświetlaną, a nie wstrzykiwanie skryptu — brak XSS).
  • Zakłócenia uzgadniania/interfejsu użytkownika. Ponieważ wiadomości przychodzące pasujące do oczekującego id zatwierdzają bądź odrzucają żądania MCP interfejsu, atakująca ramka może sfałszować odpowiedzi na uzgadnianie ui/initialize lub w inny sposób zakłócić działanie panelu.
  • Wyciek wychodzący. Wysyłanie do '*' oznacza, że komunikaty JSON-RPC interfejsu trafiają do dowolnego pochodzenia nadrzędnego; jeśli zasób zostanie osadzony w kontekście innym niż zaufany host, komunikaty te wyciekną do tego kontekstu.

Podatność na wykorzystanie zależy od modelu osadzania u hosta (w poprawnym hoście MCP Apps elementem nadrzędnym jest zaufany host, co ogranicza grono podmiotów mogących przesyłać wiadomości do ramki). Z tego względu jest to kwestia utwardzania zabezpieczeń i ochrony wielowarstwowej (defense-in-depth), a nie wada możliwa do bezpośredniego zdalnego wywołania — stąd niska ważność (Low).

Dowód koncepcji (PoC)

  • poc/verify-no-origin-check.mjs — statyczne potwierdzenie, że odbiornik nie sprawdza pochodzenia, a operacje wychodzące korzystają z '*':

    [x] validates event.origin             : NO
    [x] outgoing postMessage targetOrigin  : '*' (any)
    RESULT: VULNERABLE
  • poc/parent-spoof-poc.html — strona, która osadza interfejs i wstrzykuje sfabrykowane wiersze z innego pochodzenia bez procesu handshake; interfejs je renderuje.

Co trzeba zrobić

  • Weryfikuj event.origin pod kątem oczekiwanego pochodzenia hosta przy każdej wiadomości przychodzącej; odrzucaj wiadomości z innych źródeł.
  • Wysyłaj wychodzące postMessage ze sprecyzowanym docelowym pochodzeniem (pochodzenie hosta ustalone podczas inicjalizacji) zamiast '*'.
  • Opcjonalnie powiąż komunikację z wartością nonce lub kanałem ustanowionym podczas ui/initialize, aby panelem mógł sterować wyłącznie wynegocjowany host.
  • Zaktualizuj pakiet do wersji 0.4.112 lub nowszej.

Czego dotyczy

Kliknij technologię, aby zobaczyć wszystkie dotyczące jej podatności.

PlatformaPaczkaPodatne wersjePoprawka w wersji
Paczka npm @aborruso/ckan-mcp-server < 0.4.112 0.4.112

Odnośniki

Ocena CVSS 3.1/10
Wektor CVSS
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:N/A:N
Słabość (CWE)
CWE-345, CWE-940
Platforma
npm
Paczka
@aborruso/ckan-mcp-server
Ujawniono
16.10.2026
Aktualizacja
20.10.2026 08:36

Źródła i licencje · Redakcja lub tłumaczenie: DockRay. Zachowano prawa źródeł i obowiązujące licencje.

OSV / GitHub Advisory Database - GHSA-vqff-r82h-9crc - CC BY 4.0

Historia podatności: @aborruso/ckan-mcp-server

Wszystkie opisane podatności tej paczki (Paczka npm), od najnowszej. Widać, czy to jednorazowa wpadka, czy paczka, której trzeba pilnować.

Wszystkich wpisów
7
Pierwsza → ostatnia
03.2026 10.2026
Bez poprawki
0
Wykorzystywana w atakach
0

Rozkład istotności

  • Średnia 5
  • Niska 2

Ujawnienia w latach

  1. 2026: 7
  1. ckan-mcp-server: zasób DataStore Table UI nie sprawdza pochodzenia postMessage (in) i wysyła dane do targetOrigin "*" (out) ten wpis
    Niska · 3.1 CVE-2026-76894 < 0.4.112 0.4.112
  2. Niska · 3.7 CVE-2026-73844 < 0.4.112 0.4.112

Dowiedz się, które podatności dotyczą Twojej aplikacji

Po podłączeniu integracji DockRay i włączeniu raportowania oprogramowania DockRay porównuje zgłoszone wersje komponentów ze znanymi podatnościami i powiadamia o potwierdzonych dopasowaniach. Zakres zależy od obsługiwanej technologii i dostępnych biuletynów.

Podłącz swoją aplikację
Newsletter DockRay

Bezpieczeństwo aplikacji w Twojej skrzynce

Najważniejsze podatności, konkretne zalecenia i praktyczne wskazówki dla Twoich aplikacji. Wybierz technologie i śledź to, co ma znaczenie dla Twojego projektu.

  • Codzienne zestawienie nowych podatności, także krytycznych.
  • Powiadomienia o ważnych aktualizacjach.
  • Praktyczne porady o bezpieczeństwie i monitoringu aplikacji.

Pozostaw puste, aby otrzymywać informacje o wszystkich technologiach.

Zapis jest bezpłatny. Wypiszesz się jednym kliknięciem w wiadomości.