Officiële MCP Python SDK-fout kan ervoor zorgen dat kwaadwillende servers OAuth-referenties stelen

Een kwaadwillende MCP-server zou een applicatie die is gebouwd op de officiële MCP Python SDK kunnen misleiden om de OAuth-referenties over te dragen die worden gebruikt om in te loggen bij een echte service, zeiden de beheerders van de SDK in een beveiligingsadvies.

Getroffen versies stuurden het clientgeheim, de autorisatiecode en de PKCE-proof-sleutel naar een token-eindpunt dat door de aanvaller werd beheerd. De oplossing bevindt zich in versies 1.30.0 en 2.2.0.

Het Model Context Protocol (MCP) is een open standaard voor het verbinden van AI-applicaties met externe tools en gegevens, en dit pakket is de officiële Python SDK voor het bouwen van MCP-servers en -clients.

Met de gestolen inloggegevens kan de aanvaller een geldig toegangstoken aanvragen bij de echte inlogservice. Cycode, het beveiligingsbedrijf dat de fout rapporteerde, demonstreerde die volledige uitwisseling in een test en zegt dat het resulterende token alle rechten bevat die aan de app zijn verleend. Het clientgeheim heeft een lange levensduur en blijft dus werken totdat het wordt gewijzigd.

Het minpunt wordt hoog gewaardeerd (7,5) voor de twee providers die draaien zonder dat er iemand aanwezig is. Gescoord voor de interactieve provider, waarbij iemand de login moet starten, is deze een 6,5. Op 29 september was er geen CVE toegewezen.

Hoe een server de inloggegevens steelt

Wanneer een MCP-client moet inloggen, vraagt ​​deze aan de server waarmee hij verbinding maakt, waar zijn inlogservice, de autorisatieserver genaamd, kan worden gevonden. Op de getroffen versies controleerde de SDK dat antwoord niet altijd. Een kwaadwillende server kan deze verwijzen naar een inlogservice naar keuze van de aanvaller, door de naam van de eigen server van de aanvaller te noemen of door inloggegevens te verstrekken die de echte service van de gebruiker benoemen, terwijl de inloggegevens naar elders worden verzonden.

De client stuurt vervolgens zijn geheim, zijn autorisatiecode en zijn PKCE-proof sleutel naar de aanvaller in plaats van naar de echte dienst. De proefsleutel is een eenmalige waarde die is ontworpen om te voorkomen dat een gestolen autorisatiecode opnieuw wordt gebruikt, dus als u deze overhandigt, wordt die bescherming ook teniet gedaan.

Bij de interactieve provider moet de persoon nog steeds een aanmelding goedkeuren. Cycode zegt dat de pagina die ze goedkeuren de echte inlogpagina is, dus er lijkt niets mis te zijn. De twee machine-to-machine-providers hebben geen aanmelding en helemaal geen persoon nodig.

Wie wordt getroffen

Een applicatie wordt getroffen als deze de SDK als MCP-client via HTTP gebruikt met een van de OAuth-providers OAuthClientProvider, ClientCredentialsOAuthProvider, PrivateKeyJWTOAuthProvider of de verouderde 1.x RFC7523OAuthClientProvider, en verbinding kan maken met een server die deze niet volledig beheert, terwijl de inloggegevens voor een echte inlogservice bewaard blijven. MCP-servers die zijn gebouwd met de SDK, lokale (stdio)-clients en clients die hun eigen tokens koppelen, worden niet beïnvloed.

Lijn

Aangetast

Vast in

1.x

1.9.1 tot en met 1.29.1

1.30.0

2.x

2.0.0 tot en met 2.1.1

2.2.0

Wat te doen

Upgrade naar 1.30.0 op de 1.x-lijn of 2.2.0 op de 2.x-lijn. In de vaste versies zoekt de klant uit welke inlogservice hij verwacht voordat hij gegevens ophaalt en weigert hij elke login met een andere naam.

Upgraden is niet de hele oplossing voor twee van de providers. Als u ClientCredentialsOAuthProvider of PrivateKeyJWTOAuthProvider gebruikt, zegt het advies: “Het upgraden verandert niets totdat u ook issuer=” doorgeeft om de inlogservice te noemen waartoe deze inloggegevens behoren. Zonder dit volgen ze nog steeds de server waarnaar de MCP-server hen verwijst.

Op 1.30.0 is de waarschuwing hierover een standaard beëindigingswaarschuwing, die Python standaard verbergt, zodat deze gemakkelijk te missen is. De verouderde RFC7523OAuthClientProvider heeft helemaal geen issuer= optie, dus stap over op een van de andere twee providers.

Wis na het upgraden alle opgeslagen OAuth-clientregistraties één keer, omdat oudere niet gebonden zijn aan een inlogservice en dat ook zo blijven. Als een client mogelijk al verbinding heeft gemaakt met een niet-vertrouwde server, roteer dan het clientgeheim en trek de tokens in bij de inlogservice. Bij oudere versies is er geen andere oplossing dan alleen verbinding maken met MCP-servers die u vertrouwt.

Openbaring

De cheques van de uitgever zijn op 7 september opgenomen in de release-opmerkingen van 1.30.0 en 2.2.0 en worden vermeld onder gedragswijzigingen in plaats van als een beveiligingsoplossing. Het advies volgde op 28 september, dezelfde dag dat Cycode zijn artikel publiceerde. Het advies vermeldt acht verslaggevers, waaronder de onderzoeker van Cycode.

Noch het adviesbureau, noch Cycode rapporteert enige aanval waarbij gebruik wordt gemaakt van de fout, en er is nergens anders melding gemaakt.

Thijs Van der Does