{"id":3517,"date":"2026-10-13T22:48:09","date_gmt":"2026-10-13T22:48:09","guid":{"rendered":"https:\/\/thedigitalfortress.us\/?p=3517"},"modified":"2026-10-13T22:48:09","modified_gmt":"2026-10-13T22:48:09","slug":"sap-discloses-critical-cvss-10-flaw-in-cloud-sdk-for-python-allowing-oauth2-credential-theft","status":"publish","type":"post","link":"https:\/\/thedigitalfortress.us\/?p=3517","title":{"rendered":"SAP Discloses Critical CVSS 10 Flaw in Cloud SDK for Python Allowing OAuth2 Credential Theft"},"content":{"rendered":"<div>\n<p><span class=\"p-author\"><i class=\"icon-font icon-user\">\ue804<\/i><span class=\"author\">Swati Khandelwal<\/span><i class=\"icon-font icon-calendar\">\ue802<\/i><span class=\"author\">Oct 13, 2026<\/span><\/span><span class=\"p-tags\">Vulnerability \/ Cloud Security<\/span><\/p>\n<\/div>\n<div id=\"articlebody\">\n<div class=\"separator\" style=\"clear: both;\"><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgKBZR5elkBVKRcFO6lyde7XYDVO73IBxDvnx9-UkLst3GhVFuK8Yz3QBVIIEJABDjZuJMn8tyf7RLLPIRV8J8qe-OUULjnQRaQNyWricSsOjlKJoyYu8WOvs5PxBWQpzuiq8hlDlOY7zY-qIYDgQ6NFuifS5GbHbnLBET0OTfmsMC8797Mo5un9_ECyg8\/s1700-nu-rw-lo-l85-e365\/sap-hacker.jpg\" style=\"clear: left; display: block; float: left;  text-align: center;\"><\/a><\/div>\n<p>A flaw in SAP&#8217;s <a href=\"https:\/\/github.com\/SAP\/cloud-sdk-python\" target=\"_blank\">Cloud SDK for Python<\/a> can send an application&#8217;s OAuth2 client credentials to a server an attacker controls, SAP said in a <a href=\"https:\/\/github.com\/SAP\/cloud-sdk-python\/security\/advisories\/GHSA-4mv3-jxxm-9cx2\" target=\"_blank\">security advisory<\/a> on October 13. The flaw affects multi-tenant applications on SAP Business Technology Platform (BTP) that use the SDK, SAP&#8217;s official Python client for BTP services. An attacker must be able to control the tenant subdomain, the name such an application passes to the SDK to say which tenant a request is for.<\/p>\n<p>The flaw is tracked as CVE-2026-89111 and carries SAP&#8217;s CVSS score of 10.0 out of 10. The advisory names <a href=\"https:\/\/github.com\/SAP\/cloud-sdk-python\/releases\/tag\/v0.45.2\" target=\"_blank\">version 0.45.2<\/a>, released on August 21, as the fix.<\/p>\n<p>The SDK handles authentication for those services with the application&#8217;s client credentials, a client ID and a client secret. Version 0.45.2 added a check that rejects any tenant subdomain that is not a simple name.<\/p>\n<p>Six later releases do not apply that check in every case, The Hacker News found. Versions 0.53.0 through 0.55.0, published between September 10 and September 18, skip it when an application calls the SDK&#8217;s Destination service module.<\/p>\n<p>Version 0.53.0 moved that module onto new shared code for requesting tokens, and that code did not include the check. Version 0.55.1 added it there on September 18.<\/p>\n<div class=\"dog_two clear\">\n<div class=\"cf\"><a href=\"https:\/\/thehackernews.uk\/growth-ai-control-d\" rel=\"nofollow noopener sponsored\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"lazyload\" alt=\"Cybersecurity\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjVYuoalvwUlwvLZFDideJ8jW4rz-IodX0Lwi7uyP7Ab0wiDeu_BqVhPDdejQQ65MC3p9Xc4MApnHz56NJ5SDc1HMg0DvozkkGYv9TGtDLCh26v1yD5-GyzQxnA5-6A6B4beW96H_6FyrByq22cvU5JDF-i8e5GIfV4wg1SpCvjwAJt74FaqkAb2gzqE7ll\/s728-nu-rw-lo-l85-e365\/core-d.png\" width=\"729\" height=\"91\"\/><\/a><\/div>\n<\/div>\n<p>Passing a tenant subdomain that contains URL delimiters \u00abnow raises ValueError immediately instead of silently routing credentials to an attacker-controlled endpoint,\u00bb the 0.55.1 <a href=\"https:\/\/github.com\/SAP\/cloud-sdk-python\/releases\/tag\/v0.55.1\" target=\"_blank\">release notes<\/a> say.<\/p>\n<p><a name=\"more\"\/><\/p>\n<p>The Hacker News ran SAP&#8217;s own tests for the check on October 13, against the source code of every release from 0.45.1 to 0.58.4 and of the three 0.36 releases. The six releases failed 9 of the 11 tests SAP added with version 0.55.1. That version and the 11 releases after it passed all 11.<\/p>\n<p>As of October 13, the advisory lists no version above 0.45.2 as affected. Neither it nor the release notes say whether the six releases fall under CVE-2026-89111.<\/p>\n<p>Two releases on the older 0.36 line also lack the check. Versions 0.36.1 and <a href=\"https:\/\/github.com\/SAP\/cloud-sdk-python\/releases\/tag\/v0.36.2\" target=\"_blank\">0.36.2<\/a> were published on September 4 and September 10, after the August fix, and failed the tests SAP wrote for it. Both fall inside the advisory&#8217;s range of versions below 0.45.2.<\/p>\n<table style=\"border-collapse: collapse; width: 100%;\">\n<tbody>\n<tr>\n<th scope=\"col\" style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        Releases\n      <\/th>\n<th scope=\"col\" style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        Tenant subdomain check\n      <\/th>\n<th scope=\"col\" style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        Basis\n      <\/th>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        Below 0.45.2, including 0.36.1 and 0.36.2\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        Missing\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        SAP advisory. The Hacker News test of 0.36.0, 0.36.1, 0.36.2 and 0.45.1.\n      <\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        0.45.2 to 0.52.2\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        Present\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        The Hacker News test of all 18 releases.\n      <\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        0.53.0 to 0.55.0\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        Missing for Destination calls. Also missing for Document Management Service calls in 0.55.0.\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        SAP&#8217;s 0.55.1 release notes. The Hacker News test of all 6 releases.\n      <\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        0.55.1 to 0.58.4\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        Present\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        The Hacker News test of all 12 releases.\n      <\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>What to Do<\/h3>\n<p>Versions 0.45.2 through 0.52.2 and 0.55.1 through 0.58.4 contain the check. Version 0.58.4 was the <a href=\"https:\/\/pypi.org\/project\/sap-cloud-sdk\/0.58.4\/\">newest release<\/a> on PyPI, the Python package index, on October 13.<\/p>\n<p>Upgrading within the 0.36 line does not add the check. None of its three releases contains it.<\/p>\n<p>Applications that cannot upgrade yet can compare each tenant subdomain with a list of their registered tenants before passing it to the SDK, SAP says in the advisory.<\/p>\n<p>The flaw matters only where an application passes a tenant subdomain to the SDK. The August fix covered three modules: Agent Gateway, Destination and Document Management Service.<\/p>\n<p>The advisory does not say whether applications that ran a release without the check should replace their client credentials.<\/p>\n<h3>How the Flaw Works<\/h3>\n<p>When an application passes a tenant subdomain, the SDK requests an access token for that tenant. To do that, it takes the token URL from the application&#8217;s configuration and replaces part of it with the tenant subdomain.<\/p>\n<p>Releases without the check used whatever value they were given. The SDK then sent the application&#8217;s client ID and client secret to the resulting URL to request the token.<\/p>\n<p>An attacker who controls the tenant subdomain can point that request at their own server, according to SAP.<\/p>\n<div class=\"dog_two clear\">\n<div class=\"cf\"><a href=\"https:\/\/thehackernews.uk\/network-defense-d\" rel=\"nofollow noopener sponsored\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"lazyload\" alt=\"Cybersecurity\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjVV2rRkX8tRMF6gCzemvQNpwFwGxRWxY1cJEYfoLLSj1EZYJOlj5WTR77t0i6kELXujYcaHTpRDqTjCbVHH5Pnh7wzxUiKP5j4dsDkWIMlp2bmpZsL0jeAsA_19pHH5UPtyBvNkZdyGEULOAsXPcraMP5CYjQRFefhXRSdEjYkrdcpUnc4ILcvcdEfAauE\/s728-nu-rw-lo-l85-e365\/tl-d.jpg\" width=\"729\" height=\"91\"\/><\/a><\/div>\n<\/div>\n<p>The check accepts only a single name made of letters, digits and hyphens, up to 63 characters long. Any other value stops the request with an error.<\/p>\n<p>SAP labels the flaw server-side request forgery (SSRF), a weakness in which a server can be made to send a request to a destination it did not intend.<\/p>\n<p>What an attacker could do with the credentials depends on what the application&#8217;s client is allowed to do. The advisory does not say.<\/p>\n<h3>Fixed in August, Disclosed in October<\/h3>\n<p>The unchecked code was in the SDK from its first release on PyPI, on March 16.<\/p>\n<p>The August release notes list the fix under \u00abBug Fixes\u00bb and do not mention security. \u00abPreviously, invalid values were silently used to construct a malformed URL,\u00bb the notes say.<\/p>\n<p>The advisory followed 53 days later. It credits a GitHub user named <a href=\"https:\/\/github.com\/SunandM\">SunandM<\/a> with reporting the flaw and does not report any attacks.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\ue804Swati Khandelwal\ue802Oct 13, 2026Vulnerability \/ Cloud Security A flaw in SAP&#8217;s Cloud SDK for Python can send an application&#8217;s OAuth2 client credentials to a server an attacker controls, SAP said&hellip;<\/p>\n","protected":false},"author":1,"featured_media":3518,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[60,329,459,58,497,1859,70,3766,701,1231,355,526],"class_list":["post-3517","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-allowing","tag-cloud","tag-credential","tag-critical","tag-cvss","tag-discloses","tag-flaw","tag-oauth2","tag-python","tag-sap","tag-sdk","tag-theft"],"_links":{"self":[{"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/posts\/3517","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3517"}],"version-history":[{"count":0,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/posts\/3517\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/media\/3518"}],"wp:attachment":[{"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3517"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3517"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3517"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}