Vulnerabilidad en el SDK oficial de Python de MCP permitía el robo de credenciales OAuth

Los mantenedores del SDK oficial de Python para MCP han emitido un aviso de seguridad en el que advierten que un servidor MCP malicioso podría engañar a una aplicación construida con este SDK para que entregue las credenciales OAuth que utiliza para iniciar sesión en un servicio legítimo.

Las versiones afectadas enviaban el secreto de cliente, el código de autorización y la clave de prueba PKCE a un endpoint de token controlado por el atacante. La corrección está disponible en las versiones 1.30.0 y 2.2.0.

El Model Context Protocol (MCP) es un estándar abierto para conectar aplicaciones de IA con herramientas y datos externos, y este paquete es su SDK oficial de Python para construir servidores y clientes MCP.

Con las credenciales robadas, el atacante puede solicitar un token de acceso válido al servicio de inicio de sesión real. Cycode, la firma de seguridad que reportó el fallo, demostró el intercambio completo en una prueba y afirma que el token resultante porta los permisos que se hayan concedido a la aplicación. El secreto de cliente es de larga duración, por lo que sigue funcionando hasta que se cambie.

La falla tiene una calificación alta (7.5) para los dos proveedores que funcionan sin intervención humana. Para el proveedor interactivo, donde alguien debe iniciar el proceso de inicio de sesión, la puntuación es 6.5. Hasta el 29 de septiembre no se había asignado ningún CVE.

Cómo un servidor roba las credenciales

Cuando un cliente MCP necesita iniciar sesión, pregunta al servidor al que se conecta dónde se encuentra su servicio de inicio de sesión, llamado servidor de autorización. En las versiones afectadas, el SDK no siempre verificaba esa respuesta. Un servidor malicioso podía apuntar a un servicio de inicio de sesión elegido por el atacante, ya sea nombrando su propio servidor o sirviendo detalles de inicio de sesión que nombran el servicio real del usuario mientras envían las credenciales a otro lugar.

Luego, el cliente envía su secreto, su código de autorización y su clave de prueba PKCE al atacante en lugar del servicio real. La clave de prueba es un valor de un solo uso diseñado para evitar que un código de autorización robado se reutilice, por lo que entregarla también anula esa protección.

Con el proveedor interactivo, la persona todavía tiene que aprobar un inicio de sesión. Cycode dice que la página que aprueban es la página de inicio de sesión genuina, por lo que nada parece incorrecto. Los dos proveedores de máquina a máquina no necesitan inicio de sesión ni persona alguna.

Quién está afectado

Una aplicación se ve afectada si utiliza el SDK como cliente MCP sobre HTTP con uno de los proveedores OAuth OAuthClientProvider, ClientCredentialsOAuthProvider, PrivateKeyJWTOAuthProvider, o el obsoleto RFC7523OAuthClientProvider de la versión 1.x, y puede conectarse a un servidor que no controla por completo mientras posee credenciales para un servicio de inicio de sesión real. Los servidores MCP construidos con el SDK, los clientes locales (stdio) y los clientes que adjuntan sus propios tokens no se ven afectados.

Qué hacer

Actualice a 1.30.0 en la línea 1.x o a 2.2.0 en la línea 2.x. En las versiones corregidas, el cliente determina qué servicio de inicio de sesión espera antes de obtener cualquier detalle y rechaza cualquiera que nombre uno diferente.

La actualización no es la solución completa para dos de los proveedores. Si utiliza ClientCredentialsOAuthProvider o PrivateKeyJWTOAuthProvider, el aviso indica que "actualizar no cambia nada hasta que también se pase issuer=" para nombrar el servicio de inicio de sesión al que pertenecen esas credenciales. Sin eso, siguen al servidor que el servidor MCP les indique.

En 1.30.0, la advertencia sobre esto es una advertencia de obsolescencia estándar, que Python oculta por defecto, por lo que es fácil pasarla por alto. El obsoleto RFC7523OAuthClientProvider no tiene ninguna opción issuer=, por lo que hay que pasar a uno de los otros dos proveedores.

Después de actualizar, borre una vez cualquier registro de cliente OAuth almacenado, porque los antiguos no están vinculados a un servicio de inicio de sesión y permanecen así. Si un cliente puede haberse conectado ya a un servidor no confiable, rote su secreto de cliente y revoque sus tokens en el servicio de inicio de sesión. En versiones anteriores, no hay otra solución que conectarse únicamente a servidores MCP de confianza.

Divulgación

Las comprobaciones de emisor se incluyeron en las notas de la versión 1.30.0 y 2.2.0 el 7 de septiembre, listadas bajo cambios de comportamiento en lugar de como una corrección de seguridad. El aviso se publicó el 28 de septiembre, el mismo día en que Cycode publicó su informe. El aviso acredita a ocho reporteros, incluido el investigador de Cycode.

Ni el aviso ni Cycode informan de ningún ataque que utilice la falla, y no se ha reportado ninguno en otro lugar.

Cybersecurity
Cybersecurity
Cybersecurity
Cybersecurity

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *