FlawOpen

flawopen.com/Teardowns/cve-2026-77244-mcp-atlassian-http-auth-bypass

● CVE-2026-77244 · CVSS 10.0[1] · Kritisch
Sicherheitsforschung · FlawOpen

CVE-2026-77244: Unauthentifizierter HTTP-Toolzugriff bei mcp-atlassian

CVE-2026-77244 ermöglichte nicht authentifizierten Aufrufern den Zugriff auf die HTTP-Toolhandler des Communityprojekts mcp-atlassian, die auf Jira- oder Confluence-Zugangsdaten aus der Betreiberumgebung zurückgreifen konnten. Der Hauptfix kam mit 0.22.0; SSE-Nutzer benötigen wegen eines separaten Transportfehlers 0.23.1 oder neuer.[1], [4], [5], [6]

CVSS-VektorCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N[1]
💡 Einfache Erklärung (ELI5)

Der Empfang muss den Besucherausweis prüfen, bevor er eine Tür für Mitarbeitende öffnet. Im alten Ablauf verlieh der Empfang ohne Ausweis seinen Generalschlüssel. Der Fehler verband zwei fehlende Prüfungen: Eine HTTP-Anfrage konnte die Tools ohne verifizierte Nutzeridentität erreichen, und diese konnten die gemeinsam genutzten Atlassian-Zugangsdaten des Betreibers verwenden. Der Fix weist nicht authentifizierte HTTP-Anfragen ab und macht diesen Rückgriff auf Zugangsdaten zustimmungspflichtig.[1], [3]

Kernkonzepte & Begriffe

MCP-Transport
Kanal, über den Model-Context-Protocol-Anfragen zwischen Client und Server laufen. Diese CVE betrifft den HTTP-Transport von mcp-atlassian; stdio ist laut Advisory nicht betroffen.[1], [4]
Globale Zugangsdaten-Rückfallebene
Jira- oder Confluence-Zugangsdaten aus der Serverumgebung werden verwendet, wenn eine Anfrage keine eigene Nutzeridentität hat. Bei remote erreichbarem HTTP kann eine anonyme Anfrage so als Betreiber handeln.[1], [4]
Authentifizierungsgrenze
Serverseitige Prüfung, die eine Identität feststellt, bevor eine Anfrage geschützte Toolhandler erreicht. Netzwerkerreichbarkeit, ein nicht leerer Token oder eine angenommene Proxy-Vertrauensstellung beweisen allein keine Identität.[1], [7]
CWE-287
Fehlerhafte Authentifizierung: Die Anwendung weist die behauptete Identität vor der Zugriffsgewährung nicht ausreichend nach.[1], [7]
CWE-303
Der Tokenprüfer implementiert die Authentifizierung fehlerhaft: Er akzeptiert jedes nicht leere Token, ohne dessen Gültigkeit zu prüfen.[1], [9]
CWE-862
Die HTTP-Anfrage konnte privilegierte Toolhandler ohne Autorisierungsprüfung erreichen, die eine verifizierte Nutzeridentität verlangt.[1], [10]

Framework-Zuordnungen

Ursachenanalyse

Das GitHub-Sicherheits-Advisory beschreibt eine Angriffskette im Communityprojekt mcp-atlassian, keine Schwachstelle eines Atlassian-Produkts. Vor Version 0.22.0 konnte die HTTP-Middleware eine Anfrage ohne Nutzeridentität an Toolhandler weiterreichen. Wenn der Betrieb Zugangsdaten des Betreibers aus Umgebungsvariablen verwendete, konnten JiraFetcher oder ConfluenceFetcher auf diese globalen Zugangsdaten zurückfallen. Das Advisory dokumentiert außerdem einen Verifier für opake Token, der jeden nicht leeren String akzeptierte; das beweist keine echte Identität des Aufrufers. Die Grenze muss Identität und Zugangsdatenwahl gemeinsam schützen: Ein fehlender oder ungeprüfter Nutzer darf nie die privilegierten Zugangsdaten des Betreibers erben. Der Fix 0.22.0 liefert für nicht authentifizierte streamable-HTTP-MCP-POSTs HTTP 401 und sperrt den globalen Rückfall im HTTP-Kontext, sofern nicht ALLOW_GLOBAL_CRED_FALLBACK=true ausdrücklich für einen Einzelbenutzerbetrieb gesetzt ist. stdio bleibt unverändert. Separat beschreibt GHSA-5j8j-256g-vvp5 einen SSE-Pfadabgleichfehler, der in 0.23.1 behoben wurde; er ist nicht CVE-2026-77244. Aktualisieren Sie SSE-Installationen auf 0.23.1 oder neuer und nehmen Sie nicht an, dass der CVE-Fix in 0.22.0 auch dieses andere Advisory behebt. Das Advisory bestätigt keine Ausnutzung; dieser Artikel behauptet keinen realen Einbruch. Das CVE-Advisory führt CWE-287, CWE-303 und CWE-862 für die Authentifizierungs-, Tokenprüfungs- und Autorisierungsfehler dieser Kette auf. Das Advisory nennt crazydude123 als meldende Person.[1], [3], [4], [5], [6], [7], [9], [10]

Schritt-für-Schritt Angriffsablauf

Schritt 1

Ein HTTP-MCP-Endpunkt ist erreichbar

Der Betrieb führt den Communityserver mcp-atlassian über HTTP aus und eine nicht authentifizierte Partei kann den Transport erreichen. Nur-stdio-Installationen liegen außerhalb des von dieser CVE betroffenen Pfads.[1]

Schritt 2

Die Anfrage erreicht ein Tool ohne verifizierten Nutzer

Vor 0.22.0 konnte eine HTTP-Anfrage ohne eigene Identität die Middleware passieren, statt an der Transportgrenze abgewiesen zu werden. Das Advisory weist außerdem darauf hin, dass ein nicht leerer String nicht unabhängig als Identität verifiziert wurde.[1], [3]

Schritt 3

Ein Tool wählt gemeinsam genutzte Betreiber-Zugangsdaten

Fehlt eine eigene Identität und liegen Jira- oder Confluence-Zugangsdaten in der Serverumgebung, kann der Fetcher globale Zugangsdaten verwenden. Die Anfrage kann dann die aktivierten Toolrechte des Betreibers ausüben; die genaue Wirkung hängt von Berechtigungen und Konfiguration ab.[1], [3]

Schritt 4

An der Transportgrenze abweisen und bei der Zugangsdatenwahl geschlossen scheitern

Version 0.22.0 liefert für nicht authentifizierte streamable-HTTP-Anfragen HTTP 401 und blockiert den globalen Rückfall im HTTP-Kontext ohne ausdrückliche Freigabe. Für SSE ist 0.23.1 oder neuer nötig, da dort ein separater Pfadfehler behoben wurde.[1], [4], [5], [6]

Quellcode: Verwundbar vs. Sicher

Verdichtete Darstellung des Ablaufs, keine wörtliche Kopie der vollständigen Funktionen. Der Upstream-Fix fügt HTTP 401 an der Transportgrenze und eine zweite Sperre vor dem globalen Fetcher im HTTP-Kontext hinzu; beide verlangen die ausdrückliche Option ALLOW_GLOBAL_CRED_FALLBACK.[1], [3], [4]

VERWUNDBARE IMPLEMENTIERUNG
# Vereinfachte Darstellung des betroffenen Kontrollflusses.
async def handle_request(scope, ctx):
    user_identity = scope.get("state", {}).get("user_atlassian_auth_type")
    # Eine fehlende Identität wurde an der HTTP-Grenze nicht abgewiesen.
    return await call_tool_handler(ctx, user_identity=user_identity)

def get_fetcher(user_identity, global_config):
    if user_identity:
        return fetcher_for_user(user_identity)
    # Verwendet ersatzweise die in der Umgebung konfigurierten Betreiber-Zugangsdaten.
    return fetcher_from_config(global_config)
GEHÄRTETER SICHERHEITS-PATCH
# Gezielte Darstellung der in Version 0.22.0 zusammengeführten Schutzmaßnahmen.
async def handle_request(scope, ctx):
    user_identity = scope.get("state", {}).get("user_atlassian_auth_type")
    if is_mcp_http_post(scope) and not user_identity and not allow_global_fallback():
        return http_401("Authentication required")
    return await call_tool_handler(ctx, user_identity=user_identity)

def get_fetcher(user_identity, global_config, *, in_http_context):
    if user_identity:
        return fetcher_for_user(user_identity)
    if in_http_context and not allow_global_fallback():
        raise PermissionError("Refusing operator credentials for an unauthenticated HTTP request")
    return fetcher_from_config(global_config)

Checkliste für Engineering & Systemsicherheit

Quellen