CVE-2026-89111SAP Cloud SDK for Python sends OAuth2 client secrets to an attacker-chosen host
What broke
CVE-2026-89111 (CVSS 10.0, CWE-918) sits in how the SAP Cloud SDK for Python builds OAuth2 token URLs for multi-tenant applications on SAP Business Technology Platform. The SDK takes the token endpoint from configuration and substitutes the tenant subdomain into it. Before version 0.45.2 it used whatever value it was given, so an attacker who controls tenant_subdomain could point the token request at their own server. The SDK then sent the application's client credentials, its client ID and client secret, to that host.
The fix in 0.45.2 rejects any subdomain that is not a valid RFC 1123 DNS label. SAP published the advisory (GHSA-4mv3-jxxm-9cx2) on October 13, 2026, 53 days after the fix shipped as an unlabelled bug fix on August 21. No exploitation is reported.
Testing by The Hacker News found the check missing again in releases 0.53.0 through 0.55.0 and in the whole 0.36 line, which SAP's advisory does not list. Releases 0.45.2 to 0.52.2 and 0.55.1 or later contain it.
Why it matters
In the client credentials grant the secret is the application's identity. Whoever holds it can request tokens as the app, with every scope the app was granted, from anywhere, and no user or MFA prompt is involved. The bug is a confused-deputy: the SDK authenticated faithfully, just to the wrong authorization server, because it trusted a tenant-supplied value to build the address of a trusted endpoint.
What to do
- Upgrade
sap-cloud-sdkto 0.55.1 or later. Do not stop at 0.53.0 to 0.55.0 or stay on any 0.36 release. - Where you cannot upgrade yet, compare each tenant subdomain against your list of registered tenants before passing it to the SDK.
- Never build token endpoint URLs from request data. Pin the authorization server per tenant in configuration.
After you patch
- Rotate the client secrets of any application that ran an unchecked release with attacker-reachable tenant input. SAP's advisory does not say this, but a secret sent to an unknown host should be treated as disclosed.
- Review token issuance logs on your BTP authorization service for client credential grants from unfamiliar addresses.
Sources
Related on Start with Identity
- BlogSAP Cloud SDK for Python flaw sends OAuth client secrets to attackers
CVE-2026-89111, rated CVSS 10.0, lets whoever controls the tenant subdomain in a multi-tenant SAP BTP app redirect its OAuth2 token request and capture the clie
- GlossaryAccess Token
A short-lived credential a client presents to a resource server to access protected data. Access tokens are typically opaque or JWT-formatted, with lifetimes me
- GlossaryAgentic Identity
Identity for autonomous AI agents that act on a user's behalf, call APIs, and chain tools. Requires scoped, delegated, auditable, and revocable credentials rath
- PodcastAuth0
The late Vittorio Bertocci's interviews with the authors of OAuth, OpenID Connect, FIDO, and SAML. Ended in 2022, and still the best audio archive on identity s
- GlossaryAuthorization Code Flow
The recommended OAuth 2.0 flow for apps with a user: the app receives a short-lived code, then exchanges it for tokens from a back channel. Combined with PKCE f
- CVEDrupal Simple OAuth/OIDC auth bypass via an alternate path
Drupal Simple OAuth / OIDC 6.0.0 through 6.0.6 allowed authentication to be skipped on an alternate path. Patched in 6.0.7.