A vulnerability in SAP's Cloud SDK for Python could transmit an application's OAuth2 client credentials to a server controlled by attackers, SAP disclosed in a security advisory published October 13. The flaw, designated CVE-2026-89111, earned SAP's maximum severity rating of 10.0 out of 10 on the CVSS scale. It affects applications built for multiple tenants on SAP Business Technology Platform that rely on the SDK, which serves as SAP's official Python client for BTP services. An attacker must gain control over the tenant subdomain—the identifier an application provides to the SDK to specify which tenant a request targets.

The advisory identifies version 0.45.2, published August 21, as the patch that introduced a validation check to block malicious tenant subdomains. However, The Hacker News discovered that six subsequent releases failed to apply this protection uniformly. Versions 0.53.0 through 0.55.0, released between September 10 and September 18, omitted the check when applications invoked the SDK's Destination service module. Version 0.53.0 migrated that module to new shared token-request code that lacked the validation. Version 0.55.1, released September 18, restored the check and now "raises ValueError immediately instead of silently routing credentials to an attacker-controlled endpoint," according to the release notes. The Hacker News tested SAP's own validation suite on October 13 against every release from 0.45.1 through 0.58.4 and the three 0.36 releases. The six problematic versions failed 9 of the 11 tests SAP added with version 0.55.1, while that version and the 11 releases following it passed all 11. Two older releases, 0.36.1 and 0.36.2, published September 4 and September 10 after the August fix, also lack the check and failed the tests.

The SDK's authentication mechanism for BTP services uses the application's client credentials—a client ID and client secret. When an application supplies a tenant subdomain, the SDK constructs a token request by taking the token URL from the application's configuration and substituting part of it with the tenant subdomain. Releases lacking validation used whatever value they received, then transmitted the application's client ID and secret to the resulting URL. An attacker controlling the tenant subdomain can redirect that request to their own server, according to SAP. The validation check permits only a single name composed of letters, digits, and hyphens, limited to 63 characters; any other input halts the request with an error. SAP classifies the weakness as server-side request forgery, where a server can be manipulated into sending a request to an unintended destination. The advisory notes that what an attacker could accomplish with stolen credentials depends on the permissions granted to the application's client.

Versions 0.45.2 through 0.52.2 and 0.55.1 through 0.58.4 include the protection; version 0.58.4 was the latest release on PyPI, Python's package index, as of October 13. Applications unable to upgrade immediately can manually validate each tenant subdomain against a list of registered tenants before handing it to the SDK, SAP recommends in the advisory. The vulnerable code existed in the SDK from its first PyPI release on March 16. The August release notes categorized the fix under "Bug Fixes" without mentioning security, stating that "previously, invalid values were silently used to construct a malformed URL." The advisory arrived 53 days later, crediting GitHub user SunandM with reporting the flaw and noting no known attacks. The disclosure doesn't specify whether applications that ran vulnerable releases should rotate their client credentials. For organizations running multi-tenant architectures on cloud platforms, the gap between fixing code and disclosing exposure highlights the difficulty of maintaining security boundaries when authentication flows cross tenant borders. Trust in subdomain strings as simple identifiers can mask their power to reshape entire request paths when validation steps disappear during refactoring.