Une faille dans le SDK Python MCP permet à des serveurs malveillants de voler des identifiants OAuth
Un défaut critique dans le SDK Python officiel du protocole MCP (Model Context Protocol) permet à un serveur malveillant d’obtenir les identifiants OAuth d’une application, y compris son secret client, son code d’autorisation et sa clé PKCE. Ce défaut peut être exploité pour obtenir un token d’accès valide, avec les permissions initiales de l’application, sans intervention humaine.
Comment la faille fonctionne
Lorsqu’un client MCP doit s’authentifier, il consulte le serveur qu’il connecte pour obtenir l’URL de son fournisseur d’authentification (l’autorisation serveur). Sur les versions affectées, le SDK ne vérifie pas toujours cette information. Un serveur malveillant peut donc rediriger le client vers un fournisseur d’authentification contrôlé par l’attaquant. Le client envoie alors ses secrets d’authentification — y compris la clé PKCE — vers cette adresse, au lieu de la vraie autorisation serveur. Cette action compromet directement la sécurité de l’authentification OAuth, car la clé PKCE est conçue pour empêcher l’utilisation répétée d’un code d’autorisation.
Quels systèmes sont concernés ?
Les applications sont exposées si elles utilisent le SDK comme client MCP sur HTTP, avec l’un des fournisseurs OAuth suivants : OAuthClientProvider, ClientCredentialsOAuthProvider, PrivateKeyJWTOAuthProvider, ou le déprécié RFC7523OAuthClientProvider. L’impact est particulier pour les fournisseurs machine-to-machine (sans interaction humaine), qui ne nécessitent pas de validation utilisateur. L’application est affectée tant qu’elle peut se connecter à un serveur qu’elle ne contrôle pas, tout en gardant des identifiants d’authentification pour un service réel.
Qu’est-ce qu’il faut faire ?
Il est essentiel de mettre à jour le SDK vers 1.30.0 (ligne 1.x) ou 2.2.0 (ligne 2.x). Cependant, pour les fournisseurs ClientCredentialsOAuthProvider ou PrivateKeyJWTOAuthProvider, une configuration supplémentaire est requise : le paramètre issuer= doit être spécifié pour indiquer clairement le fournisseur d’authentification cible. Sans ce paramètre, les identifiants restent vulnérables. Sur la version 1.30.0, ce message de précaution est un avertissement déprécié, souvent ignoré par défaut dans Python. Le fournisseur déprécié RFC7523OAuthClientProvider n’offre pas de issuer=, il faut donc le remplacer. Après mise à jour, il est recommandé de supprimer les enregistrements OAuth stockés, et de révoquer les tokens si une connexion à un serveur non fiable a déjà eu lieu.
Ce qu'il faut retenir
- Mettre à jour le SDK à la version 1.30.0 (1.x) ou 2.2.0 (2.x).
- Pour certains fournisseurs, ajouter explicitement le paramètre
issuer=dans la configuration. - Supprimer les enregistrements OAuth anciens et révoquer les tokens s’il y a eu une connexion à un serveur non fiable.
Source : feeds.feedburner.com