В официальном Python-клиенте SAP для сервисов SAP Business Technology Platform (BTP) обнаружили критическую уязвимость. Ошибка в Cloud SDK for Python могла привести к тому, что приложение отправляло на сервер злоумышленника свои учётные данные OAuth2: client ID и client secret. SAP присвоила уязвимости CVE-2026-89111 и максимальную оценку CVSS — 10,0 из 10. Компания классифицировала её как SSRF: уязвимость, из-за которой сервер обращается не к тому адресу, который должен был использовать.

Риск возникал, когда приложение передавало SDK поддомен арендатора — tenant subdomain, по которому определяется клиент для запроса. SDK формировал адрес для получения токена, подставляя переданное значение в URL из конфигурации приложения. В версиях без проверки поддомен использовался как есть. Если им управлял атакующий, он мог направить запрос на собственный сервер и получить client ID и client secret приложения. Что именно можно сделать с этими данными, зависит от разрешений клиента; в бюллетене SAP возможные действия злоумышленника не перечислены.
Добавленная проверка разрешает только одно имя длиной не более 63 символов, составленное из букв, цифр и дефисов. Значение с другими символами отклоняется, запрос останавливается с ошибкой. Исправление вошло в версию 0.45.2, выпущенную 21 августа. По данным SAP, эта проверка относится к модулям Agent Gateway, Destination и Document Management Service.
История версий, однако, оказалась сложнее одной исправленной сборки. В версиях ниже 0.45.2 проверки не было: это подтверждает бюллетень SAP, а тестирование The Hacker News охватило, среди прочих, версии 0.36.0, 0.36.1, 0.36.2 и 0.45.1. В версиях с 0.45.2 по 0.52.2 проверка присутствовала: издание проверило все 18 выпусков этого диапазона.
Новая проблема появилась в версии 0.53.0, когда модуль Destination перевели на общий код для получения токенов. В этом коде проверки не оказалось. В версиях с 0.53.0 по 0.55.0, опубликованных с 10 по 18 сентября, она отсутствовала как минимум в некоторых запросах через Destination. В версии 0.55.0 проверка также отсутствовала для вызовов Document Management Service. Выпуск 0.55.1 от 18 сентября вернул её в общий код. В примечаниях к релизу сказано: «Теперь передача поддомена арендатора с разделителями URL немедленно вызывает ValueError вместо того, чтобы незаметно направлять учётные данные на конечную точку, контролируемую злоумышленником».
13 октября The Hacker News проверила исходный код всех выпусков с 0.45.1 по 0.58.4, а также трёх версий ветки 0.36, используя тесты, добавленные SAP в версии 0.55.1. Шесть выпусков с 0.53.0 по 0.55.0 провалили девять из 11 тестов. Версия 0.55.1 и следующие за ней 11 выпусков прошли все проверки. Версии 0.36.1 и 0.36.2, вышедшие 4 и 10 сентября, тоже не содержали проверки, хотя исправление 0.45.2 было опубликовано ещё 21 августа. Все три выпуска ветки 0.36 оказались без неё.
На 13 октября бюллетень SAP называл уязвимыми версии ниже 0.45.2 и не отмечал как затронутые выпуски выше этого порога. При этом ни бюллетень, ни примечания к релизам не уточняют, относятся ли шесть версий с отсутствующей проверкой из диапазона 0.53.0–0.55.0 к CVE-2026-89111. Результаты тестирования показывают, что защита в них пропущена, но официального решения SAP об их статусе по CVE в опубликованных материалах нет.
Пользователям подходят версии 0.45.2–0.52.2 или 0.55.1–0.58.4. На 13 октября самой новой версией на PyPI была 0.58.4. Обновление внутри ветки 0.36 проблему не исправляет. Если обновить приложение пока нельзя, SAP советует до передачи значения в SDK сверять каждый tenant subdomain со списком зарегистрированных арендаторов приложения. Компания не сообщает, нужно ли менять client ID и client secret, если приложение работало на версии без проверки.
Непроверенный код присутствовал в SDK с первого выпуска пакета на PyPI, опубликованного 16 марта. Исправление появилось в версии 0.45.2 от 21 августа, но в примечаниях его поместили в раздел «Исправления ошибок», а не обозначили как устранение уязвимости. Там говорилось: «Ранее недопустимые значения без предупреждения использовались для формирования некорректного URL». В качестве сообщившего об ошибке указан пользователь GitHub SunandM. Примечания не содержат сведений об атаках; бюллетень безопасности SAP вышел 13 октября.

Изображение носит иллюстративный характер
Риск возникал, когда приложение передавало SDK поддомен арендатора — tenant subdomain, по которому определяется клиент для запроса. SDK формировал адрес для получения токена, подставляя переданное значение в URL из конфигурации приложения. В версиях без проверки поддомен использовался как есть. Если им управлял атакующий, он мог направить запрос на собственный сервер и получить client ID и client secret приложения. Что именно можно сделать с этими данными, зависит от разрешений клиента; в бюллетене SAP возможные действия злоумышленника не перечислены.
Добавленная проверка разрешает только одно имя длиной не более 63 символов, составленное из букв, цифр и дефисов. Значение с другими символами отклоняется, запрос останавливается с ошибкой. Исправление вошло в версию 0.45.2, выпущенную 21 августа. По данным SAP, эта проверка относится к модулям Agent Gateway, Destination и Document Management Service.
История версий, однако, оказалась сложнее одной исправленной сборки. В версиях ниже 0.45.2 проверки не было: это подтверждает бюллетень SAP, а тестирование The Hacker News охватило, среди прочих, версии 0.36.0, 0.36.1, 0.36.2 и 0.45.1. В версиях с 0.45.2 по 0.52.2 проверка присутствовала: издание проверило все 18 выпусков этого диапазона.
Новая проблема появилась в версии 0.53.0, когда модуль Destination перевели на общий код для получения токенов. В этом коде проверки не оказалось. В версиях с 0.53.0 по 0.55.0, опубликованных с 10 по 18 сентября, она отсутствовала как минимум в некоторых запросах через Destination. В версии 0.55.0 проверка также отсутствовала для вызовов Document Management Service. Выпуск 0.55.1 от 18 сентября вернул её в общий код. В примечаниях к релизу сказано: «Теперь передача поддомена арендатора с разделителями URL немедленно вызывает ValueError вместо того, чтобы незаметно направлять учётные данные на конечную точку, контролируемую злоумышленником».
13 октября The Hacker News проверила исходный код всех выпусков с 0.45.1 по 0.58.4, а также трёх версий ветки 0.36, используя тесты, добавленные SAP в версии 0.55.1. Шесть выпусков с 0.53.0 по 0.55.0 провалили девять из 11 тестов. Версия 0.55.1 и следующие за ней 11 выпусков прошли все проверки. Версии 0.36.1 и 0.36.2, вышедшие 4 и 10 сентября, тоже не содержали проверки, хотя исправление 0.45.2 было опубликовано ещё 21 августа. Все три выпуска ветки 0.36 оказались без неё.
На 13 октября бюллетень SAP называл уязвимыми версии ниже 0.45.2 и не отмечал как затронутые выпуски выше этого порога. При этом ни бюллетень, ни примечания к релизам не уточняют, относятся ли шесть версий с отсутствующей проверкой из диапазона 0.53.0–0.55.0 к CVE-2026-89111. Результаты тестирования показывают, что защита в них пропущена, но официального решения SAP об их статусе по CVE в опубликованных материалах нет.
Пользователям подходят версии 0.45.2–0.52.2 или 0.55.1–0.58.4. На 13 октября самой новой версией на PyPI была 0.58.4. Обновление внутри ветки 0.36 проблему не исправляет. Если обновить приложение пока нельзя, SAP советует до передачи значения в SDK сверять каждый tenant subdomain со списком зарегистрированных арендаторов приложения. Компания не сообщает, нужно ли менять client ID и client secret, если приложение работало на версии без проверки.
Непроверенный код присутствовал в SDK с первого выпуска пакета на PyPI, опубликованного 16 марта. Исправление появилось в версии 0.45.2 от 21 августа, но в примечаниях его поместили в раздел «Исправления ошибок», а не обозначили как устранение уязвимости. Там говорилось: «Ранее недопустимые значения без предупреждения использовались для формирования некорректного URL». В качестве сообщившего об ошибке указан пользователь GitHub SunandM. Примечания не содержат сведений об атаках; бюллетень безопасности SAP вышел 13 октября.