Poprawka, którą trzeba włączyć
Oficjalne SDK MCP dla Pythona naprawiło trzy błędy w jednym wydaniu. Dwa znikają po aktualizacji. Trzeci, ten, który decyduje, czy Twój serwer przyjmie cudzy token, przychodzi wyłączony, a każdy skaner zależności i tak pokaże, że jesteś załatany.
Oficjalne SDK Model Context Protocol dla Pythona opublikowało jednego dnia trzy advisory, po jednym wydaniu z poprawkami na każdej z dwóch gałęzi i zdanie, które powinno zmienić sposób czytania każdego changelogu: sama aktualizacja niczego nie zmienia. Stoi ono pod tym z trzech błędów, który pilnuje drzwi wejściowych serwera MCP.
Trzy decyzje, których nikt nie podjął
Gdy położy się te trzy advisory obok siebie, same błędy nie są najciekawsze. Najciekawsze jest to, kto o czym decydował. Klient, sprawdzając wyniki narzędzi, poprosił bibliotekę JSON Schema o rozwiązanie odwołań, a jej domyślną odpowiedzią było otwarcie dowolnego adresu wskazanego przez serwer, łącznie z lokalnymi plikami. Transporty HTTP dla wygody włączyły podążanie za przekierowaniami, więc nagłówek z danymi dostępowymi szedł tam, gdzie wskazało przekierowanie. Sprawdzanie tokenu po stronie serwera oddano temu, kto napisał weryfikator, i nic nie zmuszało go do sprawdzenia, czy token w ogóle był przeznaczony dla tego serwera.
Nie ma w tym nic egzotycznego. Tak to wygląda, gdy decyzje bezpieczeństwa protokołu zapadają wewnątrz SDK, jedno ustawienie domyślne po drugim. Na MCP można budować, nigdy nie zaglądając do specyfikacji. Czyta się quickstart, a ustawienia domyślne SDK stają się protokołem, który faktycznie działa.
Metadane serwera to dane wejściowe
Błąd ze schematem zasługuje na osobny akapit, bo odwraca typowy obraz. Opis i schemat narzędzia traktujemy zwykle jak konfigurację, do której klient tylko zagląda. Tutaj klient potraktował go jak polecenie do wykonania: idź i pobierz to. Złośliwy serwer nie potrzebował prompt injection ani zdezorientowanego modelu. Wystarczyło, że zadeklarował narzędzie. Wszystko, co wysyła serwer, to dane wejściowe, także to, co wygląda jak dokumentacja.
Numer wersji to nie stan bezpieczeństwa
Dwie poprawki zaczynają działać, gdy pakiet się zmieni. Poprawka audience nie, i to z uzasadnionego powodu: jej włączenie psuje każdy weryfikator, który nie zwraca audience tokenu, więc opiekunowie zrobili ją opcjonalną, a zmianę ustawienia domyślnego odłożyli do następnego wydania głównego. Oto co dostaje serwer, który się zaktualizował i niczego nie zmienił, zamiast samej kontroli:
`AuthSettings.validate_token_resource` is not set, so bearer tokens are not checked against `resource_server_url`; it will default to True in 3.0 when `resource_server_url` is set.
To uczciwe ostrzeżenie, tyle że napisane dla programisty patrzącego w konsolę. Skaner zależności czyta numery wersji. Oznaczy pakiet jako naprawiony, zgłoszenie zostanie zamknięte, a serwer, który przyjmuje tokeny wydane dla innych Twoich usług, będzie je przyjmował dalej. Nie dlatego, że ktoś pominął poprawkę, tylko dlatego, że poprawka jest ustawieniem, a ustawienie nie ma właściciela.
Zaufanie to powierzchnia ataku
SDK wygląda jak instalacja wodna, a instalację dziedziczy się bez obaw. Jest odwrotnie: to tam, po cichu i przez ustawienia domyślne, zapadają decyzje o zaufaniu w protokole. W tym tygodniu trzy z nich okazały się błędne. Dwie poprawiono za Ciebie. Jedną poprawiono i zostawiono Tobie do włączenia.
Co konkretnie zrobić
- Zaktualizuj pakiet mcp na każdym kliencie i serwerze. To zamyka błędy przekierowań i schematów bez zmian w kodzie.
- Potem przejrzyj każde miejsce, w którym tworzysz AuthSettings. Albo włącz validate_token_resource i niech weryfikator zwraca audience, albo upewnij się, że weryfikator już odrzuca token, którego aud nie wskazuje Twojego serwera. Bez jednego z tych kroków błąd zostaje otwarty także w nowej wersji.
- Traktuj DeprecationWarning z biblioteki uwierzytelniania jak znalezisko. Pokazuj ostrzeżenia w CI i przerywaj build na tych, które dotyczą ustawień bezpieczeństwa.
- Przestań podążać za przekierowaniami, których nie planowałeś. Jeśli klient łączył się z serwerem przez przekierowanie na inny host, wskaż mu właściwy adres i wymień dane dostępowe, które przy tym przenosił.
- Czytaj schematy narzędzi jak niezaufane dane. Każdy kod, który rozwiązuje, wyświetla lub wykonuje to, co serwer MCP deklaruje o sobie, powinien zakładać, że serwer jest wrogi, bo czasem jest.
- Trzy rekordy CVE nadane przez GitHub i opublikowane 27 października 2026 dla oficjalnego SDK MCP dla Pythona, pakiet PyPI mcp: CVE-2026-116684 (GHSA-w4fh-qvv9-3v23), CVE-2026-116685 (GHSA-5h93-6whr-6q8j) i CVE-2026-116686 (GHSA-rwrf-2pqf-9j8j). Wszystkie trzy naprawiono w mcp 1.30.0 i 2.2.0.
- Zakresy wersji według advisory: mcp od 1.10.0 do 1.29.1 oraz od 2.0.0 do 2.1.1 dla CVE-2026-116684 i CVE-2026-116686; mcp od 1.8.0 do 1.29.1 oraz od 2.0.0 do 2.1.1 dla CVE-2026-116685.
- CVE-2026-116684, strona serwera: uwierzytelnianie tokenem bearer skonfigurowane przez AuthSettings z token_verifier przyjmuje ważny token wydany dla innej usługi, jeśli serwer autoryzacji obsługuje kilka zasobów, a TokenVerifier sam nie sprawdza pola aud.
- CVE-2026-116685, strona klienta: transporty klienckie Streamable HTTP i SSE, ClientSessionGroup oraz klienci OAuth podążali za przekierowaniami do dowolnego originu, przekazując własne nagłówki z danymi uwierzytelniającymi, a przy 307 lub 308 także treść żądania. Advisory podaje, że sam nagłówek Authorization z tokenem bearer nie wyciekał, bo biblioteka HTTP usuwa go przy przekierowaniu do innego originu, oraz że serwer, który sam jest złośliwy, nic w ten sposób nie zyskuje.
- CVE-2026-116686, strona klienta: wyniki narzędzi były walidowane względem zadeklarowanego przez serwer outputSchema domyślnym resolverem biblioteki jsonschema, więc nierozwiązane $ref zmuszało klienta do pobrania adresu http, https lub file. Pobranie odbywało się synchronicznie w pętli zdarzeń, bez limitu czasu, co mogło zablokować wszystkie sesje w procesie. Advisory podaje, że nie było ustawienia, które wyłączałoby tę walidację.
- Słabość: CWE-863, nieprawidłowa autoryzacja, dla CVE-2026-116684. CWE-200, ujawnienie wrażliwych informacji, dla CVE-2026-116685. CWE-918, fałszowanie żądań po stronie serwera, dla CVE-2026-116686.
- Ocena GitHub dla CVE-2026-116684: CVSS 3.1 podstawa 6.8, wysoka złożoność ataku, wymagane niskie uprawnienia, wysoki wpływ na poufność i integralność.
- Ocena GitHub dla CVE-2026-116685: CVSS 3.1 podstawa 5.9, wysoka złożoność ataku, wpływ wyłącznie na poufność.
- Ocena GitHub dla CVE-2026-116686: CVSS 3.1 podstawa 6.5, wymagana interakcja użytkownika, wpływ wyłącznie na dostępność.
- Według advisory poprawki CVE-2026-116685 i CVE-2026-116686 nie wymagają zmian w kodzie. Poprawka CVE-2026-116684 wymaga: advisory stwierdza, że sama aktualizacja niczego nie zmienia, że nowe ustawienie validate_token_resource jest wyłączone, dopóki się go nie ustawi, i że weryfikator musi dodatkowo zwracać audience tokenu jako AccessToken.resource.
- W AuthSettings w tagach v1.30.0 i v2.2.0 validate_token_resource ma domyślnie wartość None. Gdy resource_server_url jest ustawione, a to pole nie, SDK zgłasza DeprecationWarning i zachowuje się jak przy False. Kod podaje, że w wersji 3.0 domyślną wartością będzie True.
- Status w NVD na 28 października 2026 dla wszystkich trzech: Received, bez własnej oceny NVD. Rekordy CVE nie mają wpisu ADP agencji CISA.
- Czy którykolwiek z trzech błędów był wykorzystany. Advisory nic o tym nie mówią, a my nie mamy żadnej telemetrii: nasz publiczny sensor jest wyłączony.
- Ile serwerów MCP stoi za serwerem autoryzacji, który wydaje tokeny także dla innych usług, czyli w warunkach CVE-2026-116684. Nikt nie opublikował liczby wdrożeń.
- Ile własnych implementacji TokenVerifier już sprawdza audience. Te wdrożenia nigdy nie były narażone, a nic publicznego nie pozwala odróżnić ich od tych, które były.
- Czy pozostałe oficjalne SDK MCP mają któreś z tych ustawień domyślnych. Sprawdziliśmy tylko SDK dla Pythona.
- Nie odtworzyliśmy żadnego z trzech błędów. Wszystko tutaj opiera się na rekordach, advisory i kodzie AuthSettings.
- NVD jeszcze nie przeanalizowało rekordów, więc każda ocena tutaj pochodzi wyłącznie od GitHub.
- 01GHSA-w4fh-qvv9-3v23: server bearer-token authentication accepts tokens issued for a different resource server ↗
- 02GHSA-5h93-6whr-6q8j: HTTP client transports followed cross-origin redirects carrying custom headers and bodies ↗
- 03GHSA-rwrf-2pqf-9j8j: client fetched server-chosen $ref URLs while validating tool results ↗
- 04CVE-2026-116684 ↗
- 05CVE-2026-116685 ↗
- 06CVE-2026-116686 ↗
- 07Rekord CVE-2026-116684 ↗
- 08AuthSettings w wersji v1.30.0 ↗
- 09GHSA-w4fh-qvv9-3v23, kopia w OSV ↗
