Вредоносный сервер MCP мог обманом заставить приложение, созданное на основе официального MCP Python SDK, передать учетные данные OAuth, которые оно использует для входа в реальный сервис, говорится в уведомлении о безопасности от сопровождающих SDK.
Затронутые версии отправляли секрет клиента, код авторизации и ключ подтверждения PKCE в конечную точку токена, контролируемую злоумышленником. Исправление доступно в версиях 1.30.0 и 2.2.0.
Model Context Protocol (MCP) — это открытый стандарт для подключения приложений ИИ к внешним инструментам и данным, а данный пакет является официальным Python SDK для создания серверов и клиентов MCP.
С помощью украденных учетных данных злоумышленник может запросить действительный токен доступа у реального сервиса входа. Cycode, фирма по безопасности, сообщившая об уязвимости, продемонстрировала полный процесс в тесте и утверждает, что полученный токен обладает всеми разрешениями, предоставленными приложению. Секрет клиента имеет длительный срок действия, поэтому он продолжает работать до тех пор, пока не будет изменен.
Уязвимость оценивается как высокая (7,5) для двух провайдеров, работающих без участия человека. Для интерактивного провайдера, где кто-то должен инициировать вход, оценка составляет 6,5. По состоянию на 29 сентября CVE не был назначен.
Когда клиенту MCP необходимо войти в систему, он запрашивает у сервера, к которому подключается, информацию о своем сервисе входа, называемом сервером авторизации. В затронутых версиях SDK не всегда проверял этот ответ. Вредоносный сервер мог направить его на сервис входа по выбору злоумышленника, либо назвав собственный сервер злоумышленника, либо предоставив данные для входа, указывающие на реальный сервис пользователя, но отправляя учетные данные в другое место.
Затем клиент отправляет свой секрет, код авторизации и ключ подтверждения PKCE злоумышленнику вместо реального сервиса. Ключ подтверждения — это одноразовое значение, предназначенное для предотвращения повторного использования украденного кода авторизации, поэтому его передача также сводит на нет эту защиту.
При использовании интерактивного провайдера пользователь по-прежнему должен одобрить вход. Cycode утверждает, что страница, которую они одобряют, является подлинной страницей входа, поэтому ничего не выглядит подозрительно. Два провайдера типа «машина-машина» не требуют входа и участия человека.
Приложение затронуто, если оно использует SDK в качестве клиента MCP через HTTP с одним из провайдеров OAuth: OAuthClientProvider, ClientCredentialsOAuthProvider, PrivateKeyJWTOAuthProvider или устаревшим 1.x RFC7523OAuthClientProvider, и оно может подключаться к серверу, который оно не полностью контролирует, имея учетные данные для реального сервиса входа. Серверы MCP, созданные с помощью SDK, локальные клиенты (stdio) и клиенты, которые прикрепляют собственные токены, не затронуты.
Обновитесь до 1.30.0 в линейке 1.x или до 2.2.0 в линейке 2.x. В исправленных версиях клиент определяет, какой сервис входа он ожидает, прежде чем получать какие-либо детали, и отклоняет любые, которые указывают на другой сервис.
Обновление не является полным решением для двух провайдеров. Если вы используете ClientCredentialsOAuthProvider или PrivateKeyJWTOAuthProvider, в уведомлении говорится, что «обновление ничего не меняет, пока вы также не передадите issuer=», чтобы указать сервис входа, к которому принадлежат эти учетные данные. Без этого они по-прежнему будут следовать указаниям любого сервера, на который их направит сервер MCP.
В версии 1.30.0 предупреждение об этом является стандартным предупреждением об устаревании, которое Python скрывает по умолчанию, поэтому его легко пропустить. Устаревший RFC7523OAuthClientProvider вообще не имеет параметра issuer=, поэтому перейдите на один из двух других провайдеров.
После обновления очистите все сохраненные регистрации клиентов OAuth один раз, поскольку старые не привязаны к сервису входа и остаются таковыми. Если клиент мог уже подключаться к недоверенному серверу, смените его секрет клиента и отозовите его токены в сервисе входа. В старых версиях нет обходного пути, кроме как подключаться только к доверенным серверам MCP.
Проверки issuer были включены в примечания к выпуску 1.30.0 и 2.2.0 7 сентября, указанные в разделе изменений поведения, а не как исправление безопасности. Уведомление последовало 28 сентября, в тот же день, когда Cycode опубликовала свой отчет. В уведомлении отмечены восемь докладчиков, включая исследователя Cycode.
Ни в уведомлении, ни в отчетах Cycode нет информации об атаках с использованием этой уязвимости, и нигде больше о них не сообщалось.
Всегда имейте в виду, что редакции могут придерживаться предвзятых взглядов в освещении новостей.
Автор – Swati Khandelwal




