Uwierzytelnianie i autoryzacja MCP: OAuth 2.1, delegacja tokenów i problem pomylonego zastępcy

MCP Security OAuth 2.1 Authentication AI Security

Uwierzytelnianie to strażnik, który określa, czy potężne możliwości serwera MCP są dostępne dla uprawnionych użytkowników, czy dla atakujących. Jeśli zrobisz to źle, każda inna kontrola bezpieczeństwa staje się nieistotna — nieuwierzytelniony lub słabo uwierzytelniony serwer MCP z dostępem do poczty e-mail, plików i baz danych jest krytyczną podatnością, niezależnie od tego, jak dobrze zabezpieczyłeś wszystko inne.

Przewodnik projektu OWASP GenAI Security Project identyfikuje uwierzytelnianie i autoryzację jako jedną z ośmiu podstawowych domen bezpieczeństwa dla serwerów MCP, ze szczegółowymi wymaganiami, które wykraczają poza to, co większość programistów implementuje domyślnie. Ten post wyjaśnia, dlaczego te wymagania istnieją i jak je poprawnie wdrożyć.

Wyzwanie uwierzytelniania w MCP

Serwery MCP stają przed bardziej złożonym krajobrazem uwierzytelniania niż tradycyjne usługi, ponieważ pośredniczą między wieloma podmiotami:

  • Użytkownik, którego instrukcje kierują asystentem AI
  • Model AI, który interpretuje instrukcje i wywołuje narzędzia
  • Klient MCP (aplikacja hostująca AI)
  • Serwer MCP, który wykonuje wywołania narzędzi
  • Usługi podrzędne, które serwer MCP wywołuje w imieniu użytkownika

Każda z tych relacji wymaga własnych kontroli uwierzytelniania i autoryzacji. Słabość w którymkolwiek ogniwie może zostać wykorzystana do ominięcia pozostałych.

Obowiązkowe: OAuth 2.1 i OIDC dla serwerów zdalnych

Dla zdalnych serwerów MCP — tych dostępnych przez sieć, a nie przez lokalne STDIO lub gniazda Unix — przewodnik OWASP GenAI jest jednoznaczny: OAuth 2.1 z OIDC jest obowiązkowy, nie opcjonalny.

To wymaganie istnieje, ponieważ:

OAuth 2.1 zapewnia jawną kontrolę zakresu. Każdy token dostępu deklaruje dokładnie, które zasoby i działania autoryzuje. Serwer MCP może zweryfikować w czasie wywołania narzędzia, że przedstawiony token ma określony zakres potrzebny do tego działania — nie tylko, że użytkownik jest uwierzytelniony, ale że jest autoryzowany do tej konkretnej operacji.

OIDC zapewnia kryptograficzną tożsamość. OpenID Connect dodaje asercje tożsamości (token ID), które serwer MCP może zweryfikować bez komunikacji zwrotnej z dostawcą tożsamości. Serwer waliduje iss (wystawca), aud (odbiorcy), exp (wygaśnięcie) i podpis przy każdym żądaniu.

Tokeny OAuth 2.1 są z założenia krótkotrwałe. Nowoczesna specyfikacja OAuth (która konsoliduje i zastępuje najlepsze praktyki OAuth 2.0) kładzie nacisk na krótkotrwałe tokeny dostępu, które muszą być regularnie odświeżane. To ogranicza okno szkód, jeśli token zostanie skompromitowany.

Co walidować przy każdym żądaniu

Nie waliduj tokenów tylko przy ustanawianiu sesji. Waliduj przy każdym wywołaniu narzędzia:

def validate_token(token: str, required_scope: str) -> TokenClaims:
    claims = jwt.decode(
        token,
        key=get_public_key(claims_preview['kid']),
        algorithms=["RS256", "ES256"]
    )

    assert claims['iss'] == EXPECTED_ISSUER
    assert EXPECTED_AUDIENCE in claims['aud']
    assert claims['exp'] > time.time()
    assert required_scope in claims['scope'].split()

    return claims

Nigdy nie buforuj wyników walidacji między żądaniami. Token, który był ważny na początku sesji, może zostać cofnięty w trakcie sesji.

Dynamiczne środowiska klienckie

W środowiskach, gdzie klienci MCP zmieniają się często (np. różni asystenci AI łączący się z tym samym serwerem), statyczne klucze API lub wstępnie udostępnione sekrety są niewystarczające. Użyj dynamicznej rejestracji klienta z OAuth 2.1 lub OIDC, aby zweryfikować tożsamość klienta w czasie połączenia. Listy dozwolonych, zakodowane na stałe zasady połączeń lub wzajemny TLS (mTLS) są odpowiednie dla znanych statycznych relacji między określonymi klientami a serwerami.

Logo

Gotowy na rozwój swojej firmy?

Rozpocznij bezpłatny okres próbny już dziś i zobacz rezultaty w ciągu kilku dni.

Problem pomylonego zastępcy

Zrozumienie ataku

Pomylony zastępca to klasyczna podatność autoryzacji o szczególnie niebezpiecznym przejawie w architekturach MCP. Atak wykorzystuje niejednoznaczność tego, czyim autorytetem działa serwer MCP.

Rozważmy ten scenariusz:

  • Użytkownik Alicja jest uwierzytelniona na serwerze MCP z ograniczonymi uprawnieniami — może czytać własne pliki, ale nie innych
  • Serwer MCP ma szerokie uprawnienia konta usługi do odczytu wszystkich plików w organizacji
  • Serwer MCP używa przekazywania tokenów: przekazuje token Alicji do usług podrzędnych

Gdy Alicja prosi asystenta AI o “podsumowanie mojego folderu projektu”, serwer używa tokenu Alicji do dostępu do jej plików — poprawne zachowanie. Ale jeśli atakujący nakłoni serwer do wykonania żądania przy użyciu własnych poświadczeń usługi (być może przez atak zatruwania narzędzi lub pośrednią iniekcję promptu), podwyższone uprawnienia serwera są używane do dostępu do plików, do których Alicja nie jest autoryzowana.

Serwer jest “pomylonym zastępcą” — został nakłoniony do użycia swojego autorytetu w imieniu kogoś, kto nie ma tego autorytetu, działając jako pośrednik dla eskalacji uprawnień.

Dlaczego przekazywanie tokenów tworzy tę podatność

Wiele implementacji MCP przekazuje token klienta do podrzędnych API dla uproszczenia. Wydaje się to intuicyjne — token użytkownika reprezentuje uprawnienia użytkownika, więc używanie go do wszystkich wywołań podrzędnych utrzymuje poprawną kontrolę dostępu.

Problem: podrzędne API, które rozpoznają serwer MCP jako zaufanego pośrednika, mogą przyznawać żądania przy użyciu poziomu tożsamości serwera, a nie poziomu przekazanego tokenu użytkownika. A jeśli serwer MCP kiedykolwiek działa z własnej inicjatywy — poprzez podejmowanie decyzji AI, o które użytkownik nie prosił jawnie — może użyć własnych poświadczeń zamiast tokenu użytkownika.

Przekazywanie tokenów użytkowników również:

  • Przerywa ścieżki audytu (logi podrzędne pokazują tożsamość użytkownika, a nie tożsamość serwera, zasłaniając warstwę MCP)
  • Daje atakującemu, który skompromituje serwer MCP, dostęp do wszystkich przekazanych tokenów użytkowników
  • Tworzy problemy zgodności, jeśli tokeny dla różnych użytkowników mogą zostać pomylone lub odtworzone

Rozwiązanie: jawna delegacja tokenów z przepływami On-Behalf-Of

Zamiast przekazywać tokeny klientów, serwer MCP powinien uzyskać własne tokeny dla dostępu do usług podrzędnych przy użyciu przepływu On-Behalf-Of (OBO) OAuth:

Użytkownik uwierzytelnia się na kliencie MCP → klient otrzymuje token dostępu użytkownika
Klient MCP przedstawia token użytkownika serwerowi MCP
Serwer MCP wymienia token użytkownika na token serwera przez przepływ OBO:
  POST /token
  grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer
  assertion=<user_access_token>
  scope=<minimum_required_scope>
Serwer MCP używa własnego tokenu OBO do wywołań podrzędnych

Token OBO:

  • Jest jawnie ograniczony do minimalnych uprawnień potrzebnych do konkretnego wywołania narzędzia
  • Identyfikuje serwer MCP jako stronę wywołującą (z użytkownikiem jako podmiotem)
  • Jest powiązany ze zdarzeniem uwierzytelniania użytkownika (może zostać cofnięty, gdy sesja użytkownika się kończy)
  • Nie ujawnia pełnego tokenu użytkownika usługom podrzędnym

Krótkotrwałe, ograniczone tokeny

Przewodnik OWASP GenAI zawiera konkretne zalecenie: wystawiaj tokeny dostępu z czasem życia mierzonym w minutach, a nie godzinach. Dotyczy to zarówno tokenów, które serwer MCP akceptuje od klientów, jak i tokenów, które uzyskuje dla dostępu do usług podrzędnych.

Dlaczego krótki czas życia ma znaczenie

Skradziony token dostępu jest ważny przez cały czas życia, niezależnie od tego, czy uprawniony użytkownik się wylogował, zmienił hasło czy cofnął swoją sesję. Token 24-godzinny skradziony na początku sesji daje atakującemu 24 godziny trwałego dostępu. Token 5-minutowy skradziony w połowie sesji daje maksymalnie 5 minut.

Krótkotrwałe tokeny wymuszają również regularne zdarzenia ponownego uwierzytelniania, które zapewniają możliwości do:

  • Ponownego sprawdzenia, czy konto użytkownika zostało zawieszone lub jego uprawnienia zostały zmienione
  • Wykrycia anomalnych wzorców uwierzytelniania (nietypowe czasy, lokalizacje lub częstotliwość)
  • Zastosowania uwierzytelniania wzmocnionego dla wrażliwych operacji

Minimalizacja zakresu tokenu

Każdy token powinien zawierać tylko zakresy potrzebne do konkretnej wykonywanej operacji. Nie wystawiaj tokenu z zakresem read:files write:files delete:files, gdy bieżące wywołanie narzędzia potrzebuje tylko read:files. To ogranicza szkody, jeśli token zostanie przechwycony lub model zostanie zmanipulowany do nieoczekiwanych wywołań narzędzi.

def get_tool_token(user_id: str, tool_name: str) -> str:
    # Mapuj narzędzie na minimalne wymagane zakresy
    required_scopes = TOOL_SCOPE_MAP[tool_name]

    return oauth_client.get_token(
        subject=user_id,
        scopes=required_scopes,
        lifetime_seconds=300  # 5-minutowy czas życia
    )

Traktowanie sesji jako stanu, a nie tożsamości

Powszechnym błędem jest używanie identyfikatorów sesji jako pośredników autoryzacji: jeśli żądanie niesie ważny identyfikator sesji, serwer zakłada, że jest autoryzowane. To łączy zarządzanie stanem z weryfikacją tożsamości.

Prawidłowy model: identyfikatory sesji zarządzają stanem konwersacji. Autoryzacja jest weryfikowana niezależnie przy każdym żądaniu przez walidację roszczeń tokenu OAuth. Nawet żądanie niosące ważny identyfikator sesji musi przedstawić ważny, niewygasły, odpowiednio ograniczony token OAuth, zanim jakiekolwiek wywołanie narzędzia zostanie dozwolone.

To ma znaczenie, ponieważ identyfikatory sesji mogą zostać skradzione, odgadnięte lub odtworzone w sposób, w jaki tokeny OAuth — które niosą kryptograficzne gwarancje integralności — nie mogą.

Scentralizowane egzekwowanie zasad

Zamiast implementować kontrole autoryzacji rozproszone w poszczególnych procedurach obsługi narzędzi, przewodnik OWASP GenAI zaleca scentralizowaną bramę zasad, która:

  • Przechwytuje wszystkie żądania wywołania narzędzi, zanim dotrą do kodu specyficznego dla narzędzia
  • Waliduje uwierzytelnianie (podpis tokenu, wystawca, odbiorcy, wygaśnięcie)
  • Egzekwuje autoryzację (wymagany zakres dla tego konkretnego narzędzia)
  • Stosuje weryfikację zgody (czy użytkownik jawnie autoryzował ten typ działania?)
  • Implementuje filtrowanie narzędzi (czy to narzędzie jest dozwolone w tym kontekście wdrożenia?)
  • Rejestruje wszystkie decyzje z pełnym kontekstem dla audytu

Centralizacja zapewnia, że zasady są konsekwentnie stosowane we wszystkich narzędziach i agentach. Kontrola autoryzacji specyficzna dla narzędzia może zostać zapomniana lub ominięta podczas rozwoju; kontrola bramy nie może.

Podsumowanie: lista kontrolna uwierzytelniania

Dla zdalnych serwerów MCP minimalny poziom bezpieczeństwa uwierzytelniania to:

  • OAuth 2.1 / OIDC wymuszony dla wszystkich połączeń
  • Podpis tokenu, wystawca, odbiorcy i wygaśnięcie walidowane przy każdym wywołaniu narzędzia
  • Brak przekazywania tokenów do podrzędnych API — użyj tokenów OBO lub wystawionych przez serwer
  • Tokeny dostępu ograniczone do minimalnych wymaganych uprawnień na narzędzie
  • Czasy życia tokenów mierzone w minutach z obowiązkowym odświeżaniem
  • Identyfikatory sesji nie używane jako pośrednicy autoryzacji
  • Scentralizowana brama egzekwowania zasad na miejscu
  • Wszystkie zdarzenia uwierzytelniania i decyzje autoryzacji rejestrowane niezmiennie

Powiązane zasoby

Najczęściej zadawane pytania

Dlaczego MCP wymaga OAuth 2.1 zamiast prostszych metod uwierzytelniania?

OAuth 2.1 jest wymagany dla zdalnych serwerów MCP, ponieważ zapewnia delegowaną autoryzację z jawną kontrolą zakresu, krótkotrwałe tokeny, weryfikację kryptograficzną i standaryzowane asercje tożsamości (poprzez OIDC). Prostsze metody, takie jak klucze API lub ciasteczka sesji, nie posiadają szczegółowości zakresu potrzebnej do wdrożenia dostępu z najmniejszymi uprawnieniami, nie zapewniają kryptograficznych gwarancji tożsamości i są trudne do szczegółowego cofnięcia, gdy sesja się kończy.

Czym jest problem pomylonego zastępcy w MCP?

Pomylony zastępca to atak eskalacji uprawnień, w którym serwer MCP jest nakłaniany do użycia własnych (wyższych) uprawnień do wykonywania działań, do których użytkownik żądający nie jest autoryzowany. Występuje, gdy używane jest przekazywanie tokenów — serwer przekazuje token użytkownika do podrzędnych API, które mogą przyznać użytkownikowi dostęp, którego nie powinien mieć na podstawie zaufanego statusu serwera. Rozwiązaniem jest użycie przepływów tokenów On-Behalf-Of, gdzie tokeny są jawnie wystawiane dla określonego zakresu dostępu serwera MCP.

Czym jest przekazywanie tokenów i dlaczego jest niebezpieczne w MCP?

Przekazywanie tokenów oznacza, że serwer MCP przekazuje token uwierzytelniania klienta bezpośrednio do podrzędnych API, zamiast używać własnych poświadczeń wystawionych dla serwera. Jest to niebezpieczne, ponieważ: (1) przerywa ścieżki audytu — systemy podrzędne widzą token użytkownika, a nie serwer MCP, co uniemożliwia przypisanie działań do serwera; (2) omija własne zasady dostępu serwera MCP; (3) tworzy podatność pomylonego zastępcy, jeśli podrzędne API ufa tożsamości serwera MCP bardziej niż użytkownika; oraz (4) jeśli serwer MCP zostanie skompromitowany, atakujący uzyskuje dostęp do przekazywanych tokenów użytkowników dla wszystkich połączonych usług podrzędnych.

Jak krótkie powinny być tokeny dostępu MCP?

Przewodnik OWASP GenAI zaleca tokeny z czasem życia mierzonym w minutach, a nie godzinach czy dniach. Krótsze czasy życia tokenów ograniczają okno eksploatacji, jeśli token zostanie skradziony lub sesja zostanie przejęta. Każde wywołanie narzędzia powinno ponownie walidować podpis tokenu, odbiorców i wygaśnięcie — nie polegać na buforowanej walidacji od początku sesji.

Arshia jest Inżynierką Przepływów Pracy AI w FlowHunt. Z wykształceniem informatycznym i pasją do sztucznej inteligencji, specjalizuje się w tworzeniu wydajnych przepływów pracy, które integrują narzędzia AI z codziennymi zadaniami, zwiększając produktywność i kreatywność.

Arshia Kahani
Arshia Kahani
Inżynierka Przepływów Pracy AI

Czy Twoja architektura uwierzytelniania MCP jest bezpieczna?

Nasz zespół bezpieczeństwa ocenia konfiguracje uwierzytelniania MCP, obsługę tokenów i przepływy autoryzacji zgodnie ze standardami OWASP GenAI. Zidentyfikuj luki zanim zrobią to atakujący.

Dowiedz się więcej

Attestowalny Serwer MCP
Attestowalny Serwer MCP

Attestowalny Serwer MCP

Attestowalny Serwer MCP wprowadza zdalną atestację i przetwarzanie poufne do przepływów pracy FlowHunt, umożliwiając agentom AI i klientom weryfikację integraln...

4 min czytania
Security AI Infrastructure +4