Przejdź do treści
INDEKS ANALIZ BREACHROAD / NOTA TECHNICZNA

MCP Atlassian CVE-2026-73498: agent AI może wysłać lokalny plik do Confluence

Brak walidacji file_path w confluence_upload_attachment pozwala odczytać każdy plik dostępny dla serwera. Prompt injection może uruchomić ten przepływ.

MATERIAŁ PUBLICZNY
AUTOR
/ CEO Breachroad · OSCP · PNPT
PUBLIKACJA
13 sierpnia 2026
CZAS CZYTANIA
14 min czytania
TEMAT
Bezpieczeństwo AI
MCP Atlassian CVE-2026-73498: agent AI może wysłać lokalny plik do Confluence

CVE-2026-73498, opublikowane 13 sierpnia 2026 roku, dotyczy serwera MCP Atlassian integrującego agentów AI z Jira i Confluence. Narzędzie confluence_upload_attachment przyjmowało file_path, otwierało wskazany plik i wysyłało go jako załącznik do Confluence bez sprawdzenia, czy ścieżka mieści się w dozwolonym katalogu. Uwierzytelniony klient MCP mógł więc odczytać każdy plik dostępny dla procesu serwera. Jeżeli agent został zmanipulowany przez treść zadania lub strony, prompt injection mógł skłonić go do wywołania tego narzędzia bez świadomej decyzji operatora.

Podatne są wersje wcześniejsze niż 0.22.0, a MCP Atlassian 0.22.0 zawiera poprawkę. Advisory GHSA-g5r6-gv6m-f5jv ocenia lukę na 7,7 w CVSS 3.1: sieć, niska złożoność, niskie uprawnienia, brak interakcji, zmiana zakresu i wysoki wpływ na poufność. Źródło opisuje potwierdzoną technicznie ścieżkę prompt injection, ale nie dowodzi masowej kampanii przeciw wszystkim wdrożeniom.

Gdzie zabrakło jednej granicy

Kod uploadu przekazywał ścieżkę wprost do open(file_path, "rb"). Ten sam moduł w funkcji pobierania pliku korzystał już z validate_safe_path, co pokazuje, że projekt miał mechanizm ochronny, ale nie zastosował go symetrycznie. Commit naprawczy dodaje brakującą walidację i stanowi część szerszego hardeningu serwera.

To nie jest klasyczny directory traversal ograniczony do sekwencji ../. Narzędzie przyjmowało dowolną ścieżkę absolutną lub względną, a granicą były jedynie uprawnienia systemowego użytkownika procesu. W kontenerze mogą to być pliki aplikacji, token ServiceAccount, zamontowane sekrety, katalog domowy i /proc/self/environ. Na hoście bez izolacji zakres może być jeszcze szerszy.

Kanałem eksfiltracji jest sama prawidłowa funkcja biznesowa: plik trafia do Confluence jako załącznik. Dlatego firewall wychodzący zezwalający wyłącznie na Atlassian nie zatrzyma przepływu. Z perspektywy sieci jest to oczekiwane połączenie HTTPS z zaufanym SaaS. Detekcja musi rozumieć, jaki plik, przez które narzędzie i do jakiej strony został wysłany.

Dlaczego MCP zmienia model zagrożeń

W tradycyjnej aplikacji osoba z dostępem do API musiałaby świadomie podać ścieżkę. W systemie agentowym argument może zostać wygenerowany przez model po przeczytaniu nieufnej treści. Ticket Jira, komentarz, opis błędu lub strona Confluence stają się danymi, które wpływają na decyzję o użyciu narzędzia. Model nie powinien być traktowany jako niezależna kontrola autoryzacji.

Prompt injection i luka path validation pełnią różne role. Prompt injection kieruje agentem i dostarcza intencję wywołania. CVE sprawia, że narzędzie akceptuje zasób spoza przeznaczonego workspace. Bez jednego z elementów łańcuch może się zatrzymać: agent o dobrze ograniczonych narzędziach nie odczyta dowolnej ścieżki, a podatne API niedostępne dla nieufnych klientów ma mniejszą osiągalność.

Nie wolno więc ograniczyć naprawy do „lepszego promptu systemowego”. Instrukcja modelu może zmniejszać częstotliwość błędnych działań, ale nie jest granicą bezpieczeństwa. Serwer narzędzia musi niezależnie sprawdzić ścieżkę, tożsamość, politykę i dozwolony cel, nawet jeśli wywołanie pochodzi od zatwierdzonego agenta.

Jakie dane mogły zostać odczytane

Zakres zależy od wdrożenia. W Dockerze trzeba sprawdzić mounty, zmienne środowiskowe i UID procesu. W Kubernetes dochodzą Secret, ConfigMap, projected ServiceAccount token i wolumeny współdzielone. W instalacji lokalnej konto może widzieć klucze SSH, konfigurację użytkownika, cache narzędzi i repozytoria. Sam CVE nie potwierdza, że każdy z tych zasobów istniał.

Najbardziej prawdopodobne sekrety to CONFLUENCE_API_TOKEN, dane do Jira, zmienne środowiskowe aplikacji, klucze chmurowe oraz credentiale baz. Jeśli token Confluence wycieknie przez załącznik umieszczony w tej samej usłudze, napastnik potrzebuje jeszcze dostępu do strony lub załącznika. Złośliwy agent może jednak wybrać stronę, do której kontrolujący treść użytkownik ma prawa.

Warto ustalić, czy konto integracji miało możliwość tworzenia załączników w publicznych przestrzeniach, przestrzeniach wielu tenantów albo na stronach dostępnych dla zewnętrznych gości. Uprawnienia Atlassian określają kanał odbioru, a prawa filesystemu określają źródło danych.

Co zrobić teraz

  1. Znajdź wszystkie instancje mcp-atlassian, w tym lokalne procesy, obrazy, integracje desktopowe, serwery zespołowe i środowiska eksperymentalne.
  2. Zaktualizuj do 0.22.0 lub nowszego, wymień pody i procesy oraz potwierdź wersję w działającym środowisku.
  3. Wyłącz narzędzie uploadu do czasu aktualizacji, jeśli nie można natychmiast wymienić komponentu. Sam prompt zabraniający ścieżek nie jest mitygacją techniczną.
  4. Ogranicz filesystem procesu do jednego workspace; użyj read-only root, dedykowanego UID, minimalnych mountów i bez automatycznego tokenu ServiceAccount.
  5. Przejrzyj historię załączników utworzonych przez konto integracji: nazwy, rozmiary, strony, autora wywołania i czas względem odczytanych ticketów.
  6. Skoreluj logi MCP z Confluence audit log, historią Jira, EDR i odczytami plików. Szukaj ścieżek spoza zatwierdzonego workspace.
  7. Rotuj sekrety, których odczyt jest wiarygodny, po usunięciu podatności i potwierdzeniu, że złośliwe załączniki nie są już dostępne.

Aktualizacja musi objąć również klienta lub konfigurację agenta, jeśli pinują stary obraz albo pakiet Pythona. Centralny serwer może być nowy, a lokalny proces uruchamiany przez desktop nadal podatny. SBOM i inventory MCP powinny rejestrować zarówno serwer, jak i narzędzia udostępniane konkretnemu agentowi.

Dochodzenie bez kopiowania sekretów

Nie otwieraj podejrzanych załączników na zwykłej stacji ani nie wklejaj ich treści do ticketu. Zabezpiecz metadane, kontrolę dostępu i skrót, a analizę wykonaj w odseparowanym środowisku. Jeśli plik zawiera zmienne środowiskowe lub klucz prywatny, każde dodatkowe kopiowanie zwiększa zakres incydentu.

Ustal oś czasu: treść, którą przeczytał agent; decyzja modelu; wywołanie narzędzia; ścieżka; utworzony załącznik; późniejsze odczyty. Nie każdy załącznik systemowy oznacza złośliwy prompt — operator mógł legalnie przesłać plik diagnostyczny. Najsilniejszy dowód tworzy korelacja ścieżki spoza workspace, nieautoryzowanej strony i wcześniejszej treści instruującej agenta.

Jeżeli log MCP nie zapisuje argumentu z powodu redakcji, użyj telemetrii filesystemu i audit log Atlassian. Docelowo log powinien przechowywać znormalizowany identyfikator zasobu lub ścieżkę względną, nie pełną zawartość. Alert może wykrywać ścieżkę absolutną, .., /proc, katalog domowy albo rozszerzenie typowe dla klucza, ale podstawą jest allowlista korzenia.

Jak projektować bezpieczne narzędzie plikowe dla agenta

Najlepszym API nie jest upload(file_path: string). Serwer powinien przyjąć nieprzewidywalny identyfikator pliku utworzonego wcześniej w kontrolowanym workspace. Mapowanie identyfikatora do ścieżki pozostaje po stronie zaufanego kodu. Po kanonikalizacji wynik musi leżeć pod konkretnym korzeniem, nie być dowiązaniem prowadzącym na zewnątrz i spełniać limit rozmiaru oraz typu.

Osobna polityka powinna sprawdzić docelową stronę Confluence i tożsamość wywołującą. Agent nie powinien sam rozszerzać zakresu z „przeczytaj ticket” do „wyślij lokalny sekret”. Operacja wysokiego ryzyka może wymagać zatwierdzenia człowieka prezentującego nazwę pliku, źródło i cel. Zatwierdzenie musi wiązać się z konkretnymi argumentami, aby model nie podmienił ich później.

Testy bezpieczeństwa powinny instrumentować odczyt plików. Wartości absolutne, traversal, zakodowane separatory, symlinki i race condition między sprawdzeniem a otwarciem muszą zostać odrzucone. Najsilniejszą techniką jest otwarcie względem uchwytu do katalogu z mechanizmem systemowym zapobiegającym ucieczce, a nie tylko porównanie stringów.

Fakty i wnioski

Faktem z advisory jest brak validate_safe_path, odczyt pliku przez proces, możliwość przesłania go do Confluence, zakres <0.22.0 i technicznie potwierdzony wariant z prompt injection. Nie ma podstaw do stwierdzenia, że wszystkie instalacje były wykorzystane. Zakres danych, priorytet rotacji i projekt bezpiecznego API są analizą Breachroad opartą na prawach konkretnego workera.

CVE-2026-73498 pokazuje, że bezpieczeństwo agenta nie kończy się na modelu. Prompt, schema narzędzia, walidacja serwera, sandbox, uprawnienia Atlassian i logi tworzą jedną ścieżkę. Takie przypadki omawiamy praktycznie podczas szkoleń cyberbezpieczeństwa i bezpieczeństwa AI. Architekturę MCP, uprawnienia i granice danych można pogłębić przez bezpieczne wdrożenie AI.

UDOSTĘPNIJ / KOPIUJ