Lỗ hổng nghiêm trọng trong MCP Python SDK làm lộ thông tin đăng nhập OAuth cho các máy chủ độc hại
Một lỗ hổng trong MCP Python SDK chính thức cho phép các máy chủ độc hại đánh cắp thông tin đăng nhập OAuth, bao gồm client secret và khóa PKCE, từ các client bị ảnh hưởng.
Được dịch tự động từ bản gốc tiếng Anh.
Một lỗ hổng bảo mật nghiêm trọng trong Model Context Protocol (MCP) Python SDK chính thức cho phép các máy chủ MCP độc hại đánh cắp thông tin đăng nhập OAuth từ các client kết nối. Lỗ hổng này, được công bố vào ngày 28 tháng 9 năm 2026, ảnh hưởng đến các phiên bản từ 1.9.1 đến 1.29.1 và từ 2.0.0 đến 2.1.1, tạo điều kiện cho kẻ tấn công chặn bắt client secret, mã ủy quyền (authorization code) và khóa chứng minh PKCE.
Chuyện gì đã xảy ra
Các nhà duy trì MCP Python SDK đã đưa ra một cảnh báo bảo mật sau khi các nhà nghiên cứu tại Cycode chứng minh cách một máy chủ độc hại có thể lừa ứng dụng tiết lộ dữ liệu xác thực nhạy cảm. Khi một client MCP cố gắng đăng nhập, nó sẽ hỏi máy chủ kết nối về vị trí của máy chủ ủy quyền (authorization server). Trong các phiên bản bị ảnh hưởng, SDK không xác thực chặt chẽ phản hồi này.
Một máy chủ độc hại có thể chỉ dẫn client đến một endpoint do kẻ tấn công kiểm soát hoặc cung cấp thông tin đăng nhập trông hợp lệ nhưng lại chuyển hướng thông tin đăng nhập đi nơi khác. Do đó, client sẽ gửi client secret dài hạn, mã ủy quyền dùng một lần và khóa chứng minh PKCE cho kẻ tấn công. Với những thông tin đăng nhập này, kẻ tấn công có thể yêu cầu một access token hợp lệ từ dịch vụ đăng nhập thực tế, qua đó giành được mọi quyền hạn mà ứng dụng gốc sở hữu.
Mức độ nghiêm trọng của lỗ hổng phụ thuộc vào nhà cung cấp OAuth được sử dụng. Đối với các nhà cung cấp machine-to-machine hoạt động không cần sự can thiệp của con người, rủi ro được đánh giá ở mức cao với điểm 7.5. Đối với các nhà cung cấp tương tác yêu cầu người dùng đăng nhập, điểm số là 6.5, mặc dù người dùng vẫn phê duyệt việc đăng nhập trên một trang trông giống thật. Tính đến ngày 29 tháng 9 năm 2026, chưa có CVE nào được gán và chưa có báo cáo về các cuộc khai thác đang diễn ra ngoài thực tế.
Cách thức hoạt động
Vấn đề cốt lõi nằm ở cách SDK xử lý việc khám phá máy chủ ủy quyền. Trong quy trình OAuth, client dựa vào máy chủ MCP để xác định nơi gửi các yêu cầu xác thực. Các phiên bản SDK dễ bị tổn thương đã không xác minh xem máy chủ ủy quyền được chỉ định có khớp với issuer dự kiến hay không trước khi gửi thông tin đăng nhập.
Việc thiếu xác thực này cho phép một máy chủ độc hại chuyển hướng quá trình trao đổi thông tin đăng nhập. Ngay cả khi sử dụng PKCE (Proof Key for Code Exchange), vốn được thiết kế để ngăn chặn việc tái sử dụng mã ủy quyền, lớp bảo vệ này cũng bị vô hiệu hóa vì client tự nguyện giao nộp khóa chứng minh cho kẻ tấn công. Điều này cho phép kẻ tấn công hoàn tất quy trình trao đổi token như thể chúng là client hợp pháp.
Chi tiết quan trọng
- Phiên bản bị ảnh hưởng: MCP Python SDK 1.9.1–1.29.1 và 2.0.0–2.1.1.
- Phiên bản đã sửa lỗi: Nâng cấp lên 1.30.0 cho dòng 1.x hoặc 2.2.0 cho dòng 2.x.
- Nhà cung cấp dễ bị tổn thương: OAuthClientProvider, ClientCredentialsOAuthProvider, PrivateKeyJWTOAuthProvider và RFC7523OAuthClientProvider (đã ngừng hỗ trợ).
- Cấu hình không bị ảnh hưởng: Các máy chủ MCP được xây dựng bằng SDK, client stdio cục bộ và các client tự gắn token riêng không bị tổn thương.
- Yêu cầu cấu hình: Đối với ClientCredentialsOAuthProvider và PrivateKeyJWTOAuthProvider, chỉ nâng cấp là chưa đủ; các nhà phát triển cũng phải truyền tham số
issuer=để ràng buộc client với một dịch vụ đăng nhập cụ thể. - Hành động sau nâng cấp: Xóa các đăng ký client OAuth đã lưu sau khi nâng cấp, vì các đăng ký cũ không bị ràng buộc với một dịch vụ đăng nhập cụ thể.
Tại sao điều này quan trọng
Đối với các kỹ sư xây dựng AI agent hoặc tích hợp các công cụ bên ngoài thông qua MCP, lỗ hổng này đại diện cho một sự thất bại đáng kể trong ranh giới tin cậy. Tiêu chuẩn MCP được thiết kế để kết nối các ứng dụng AI với nhiều nguồn dữ liệu và công cụ đa dạng, thường liên quan đến các máy chủ của bên thứ ba. Nếu ứng dụng của bạn đóng vai trò là client MCP kết nối với các máy chủ không đáng tin cậy hoặc bán tin cậy, nó có nguy cơ tiết lộ các thông tin đăng nhập dài hạn có thể cấp quyền truy cập bền vững vào các dịch vụ của bạn.
Sự tinh tế của bản vá bổ sung thêm phức tạp vận hành. Việc chỉ nâng cấp SDK không bảo mật hoàn toàn các ứng dụng sử dụng một số nhà cung cấp OAuth nhất trừ khi tham số issuer được cấu hình rõ ràng. Vì Python ẩn các cảnh báo ngừng hỗ trợ (deprecation warnings) theo mặc định, nhiều nhà phát triển có thể bỏ sót hướng dẫn quan trọng là thêm tham số này, khiến ứng dụng của họ vẫn dễ bị tổn thương ngay cả sau khi cập nhật. Điều này nhấn mạnh nhu cầu xem xét cẩn thận các cấu hình xác thực khi áp dụng các tiêu chuẩn mới như MCP.
Bạn có thể làm gì
- Ngay lập tức nâng cấp lên MCP Python SDK phiên bản 1.30.0 hoặc 2.2.0.
- Nếu sử dụng ClientCredentialsOAuthProvider hoặc PrivateKeyJWTOAuthProvider, hãy đảm bảo tham số
issuer=được đặt thành dịch vụ đăng nhập dự kiến của bạn. - Di chuyển khỏi RFC7523OAuthClientProvider đã ngừng hỗ trợ, vì nó hoàn toàn thiếu tùy chọn
issuer=. - Xóa tất cả các đăng ký client OAuth đã lưu một lần sau khi nâng cấp để loại bỏ các mục không bị ràng buộc.
- Xoay vòng (rotate) client secret và thu hồi các token hiện có tại dịch vụ đăng nhập của bạn nếu có bất kỳ khả năng nào rằng client của bạn đã kết nối với một máy chủ không đáng tin cậy.
- Bật cảnh báo ngừng hỗ trợ của Python trong môi trường phát triển và staging của bạn để phát hiện sớm các vấn đề cấu hình.



