RustFS versions prior to 1.0.0-alpha.77 contain a hardcoded gRPC authentication token ('rustfs rpc'). Attackers can use this token to bypass all authentication checks, allowing them to delete buckets, modify policies, and seize control of the storage cluster via standard gRPC tools.
A critical authentication bypass in the RustFS distributed object storage system allows unauthenticated attackers to gain full administrative control by sending a specific hardcoded string in the gRPC authorization header.
RustFS bills itself as a high-performance distributed object storage system. It leverages the speed and memory safety of Rust to handle massive amounts of data. But as is often the case in the world of bleeding-edge infrastructure software, developers sometimes prioritize 'making it work' over 'locking it down'.
Imagine building a bank vault with three-foot thick steel walls, biometric scanners, and time locks. Then, because the construction crew got tired of swiping their badges every five minutes, they programmed the door to open if someone simply whispers 'open sesame'.
That is exactly what happened here. CVE-2025-68926 isn't a complex buffer overflow or a subtle race condition in the borrowing checker. It is a hardcoded magic string that turns any anonymous request into a super-admin command. It represents the classic tension between developer convenience and production security, resolved in the worst possible way.
The vulnerability resides in the gRPC interceptor logic of RustFS. For those unfamiliar with gRPC (and the tonic crate in Rust), interceptors are essentially middleware. They sit between the network socket and your application logic, allowing you to perform checks—like authentication—before any real work gets done.
The developers implemented a function intended to validate incoming requests. Ideally, this would check a JWT signature, verify an mTLS certificate, or look up a session token in a database. Instead, the logic was breathtakingly simple: it checked if the authorization header matched a static string.
And what was this secret, high-entropy cryptographic token? Was it a UUID? A SHA-256 hash? No. The token was "rustfs rpc". That's it. Two words, one space. If your request header said authorization: rustfs rpc, the server rolled out the red carpet. This suggests the code was likely a placeholder or a debug convenience that survived into production releases—a 'temporary' fix that became a permanent vulnerability.
Let's look at the offending code snippet found in the shared protocol definitions (likely crates/protos/src/lib.rs). This function is wired up as an interceptor for the gRPC service definition.
// The Vulnerable Logic
fn check_auth(req: Request<()>) -> std::result::Result<(), Status> {
// ⚠️ CRITICAL: Hardcoded static token defined right here
let token: MetadataValue<_> = "rustfs rpc".parse().unwrap();
// Check if the incoming request has the magic header
match req.metadata().get("authorization") {
// If it matches, you are authenticated. No questions asked.
Some(t) if t == token => Ok(()),
// Otherwise, reject.
_ => Err(Status::unauthenticated("Invalid token")),
}
}In the patched version (1.0.0-alpha.77), this logic is entirely removed or replaced with a dynamic configuration lookup. The fix wasn't about changing the string to something harder to guess; it was about removing the hardcoded backdoor entirely and enforcing proper identity management. Hardcoded credentials are an architectural sin that cannot be 'fixed' by just making the password longer—they must be excised.
Exploiting this requires zero coding skills. You don't need to craft shellcode or spray the heap. You just need a gRPC client like grpcurl and network visibility to port 9000 (the default RustFS port).
Here is how an attacker dumps the server configuration, essentially confirming they own the node:
# Target IP: 192.168.1.100
# Port: 9000
grpcurl -plaintext \
-H 'authorization: rustfs rpc' \
192.168.1.100:9000 \
node.NodeService/GetServerInfoThe node.proto definition in RustFS exposes over 50 methods. Once this check passes, you have access to all of them. You want to delete a bucket? There's a method for that. You want to change the IAM policy? Easy. You want to shut down the node? Done.
This is a 'Class Break' vulnerability. Once the magic string is known (and it is now public knowledge), every single unpatched RustFS instance on the internet is vulnerable to the exact same payload. There is no per-installation secret to brute force.
Because RustFS is a storage system, the impact here is two-fold: Data Integrity and Data Confidentiality.
1. Ransomware and Destruction: An attacker can enumerate all buckets and simply issue delete commands. In a ransomware scenario, they could download the data, delete the originals, and demand payment. Since they have administrative rights, they could also potentially lock out legitimate administrators by modifying access policies first.
2. Lateral Movement: Infrastructure tools often store sensitive data—backups, configuration files, and secrets for other services. Gaining read access to a distributed object store is often a stepping stone to compromising the entire cloud environment. If your Terraform state file or database backups are in a RustFS bucket, the attacker now owns your entire infrastructure stack.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
RustFS RustFS | < 1.0.0-alpha.77 | 1.0.0-alpha.77 |
| Attribute | Detail |
|---|---|
| CWE | CWE-798 (Use of Hard-coded Credentials) |
| CVSS v3.1 | 9.8 (Critical) |
| Attack Vector | Network (gRPC) |
| Privileges Required | None |
| Port | 9000/TCP |
| Token Value | "rustfs rpc" |
The software contains hard-coded credentials, such as a password or cryptographic key, which it uses for its own inbound authentication, outbound communication to external components, or encryption of internal data.
Get the latest CVE analysis reports delivered to your inbox.