GHSA-gw2x-q739-qhcr
RustFS gRPC GetMetrics deserialization panic enables remote DoS
EPSS Exploitation Probability
EPSS (Exploit Prediction Scoring System) is a daily probability model maintained by FIRST.org. It estimates the likelihood a CVE will be exploited in production environments within the next 30 days, derived from real-world threat intelligence signals.
Blast Radius
rustfsReal-time download stats are indexed for npm and PyPI packages. This vulnerability affects crates.io packages — download data is not available via public APIs for these ecosystems.
Description
Summary
A malformed gRPC GetMetrics request causes get_metrics to unwrap() failed deserialization of metric_type/opts, panicking the handler thread and enabling remote denial of service of the metrics endpoint.
Details
- Vulnerable code:
rustfs/src/storage/tonic_service.rs:1775-1782:MetricTypeandCollectMetricsOptsare deserialized withDeserialize::deserialize(...).unwrap()from client-supplied bytes.- Malformed
metric_type/opts(e.g., empty or truncated rmp-serde payloads) triggerInvalidMarkerReadand panic.
- Reachability: same TCP listener as S3 (default
:9000); only a static interceptor tokenauthorization: rustfs rpcis checked inserver/http.rs:677. - Impact scope: panic terminates the worker handling the request, causing metrics service interruption and potential process instability.
PoC
rustfs-grpc-metrics-invalid-metric-type-panic-poc.tar.gz
- Start RustFS (example local dev):
mkdir -p /tmp/rustfs-data1 /tmp/rustfs-data2
RUSTFS_ACCESS_KEY=devadmin RUSTFS_SECRET_KEY=devadmin \
cargo run --bin rustfs -- --address 0.0.0.0:9000 \
/tmp/rustfs-data1 /tmp/rustfs-data2
- From
rustfs-grpc-metrics-invalid-metric-type-panic-poc/, run:
ENDPOINT=127.0.0.1:9000 make run
# or: grpcurl -plaintext \
# -H 'authorization: rustfs rpc' \
# -import-path ../crates/protos/src -proto node.proto \
# -d '{"metric_type":"","opts":""}' \
# 127.0.0.1:9000 node_service.NodeService/GetMetrics
- Observe panic in server logs at
tonic_service.rs:get_metricswithInvalidMarkerReadand worker crash; client output saved topoc-response.txt/poc-grpcurl.log.
Impact
- Vulnerability type: remote unauthenticated (static token) denial of service via panic in gRPC handler.
- Who is impacted: any deployment exposing the gRPC endpoint where an attacker can reach port 9000 and supply the known
authorization: rustfs rpcheader; metrics service is disrupted and may affect overall stability depending on runtime crash handling.
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 🦀crates.io | rustfs | ≥ 1.0.0-alpha.13&&< 1.0.0-alpha.78 | 1.0.0-alpha.78 |
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for rustfs. O3's reachability analysis confirms whether the vulnerable code path is actually invoked in your application, so you act on real exposure instead of every transitive match.
Fix
Update rustfs to 1.0.0-alpha.78 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms GHSA-gw2x-q739-qhcr is resolved across your whole dependency graph.
Workarounds
If you can't upgrade right away: gate or disable the affected feature, validate untrusted input at the boundary, and avoid passing attacker-controlled data into the vulnerable path. O3's runtime protection blocks exploitation in production as an interim safeguard until the upgrade lands.
How O3 protects you
O3 pinpoints whether GHSA-gw2x-q739-qhcr is reachable in your code and exactly where to fix it, then blocks exploitation in production at runtime until the patched version is deployed.
Tailored to GHSA-gw2x-q739-qhcr. Runtime protection reduces exposure until a permanent patch is applied and verified — it complements patching, it doesn't replace it.
Frequently Asked Questions
Is GHSA-gw2x-q739-qhcr in your dependencies?
O3 detects GHSA-gw2x-q739-qhcr across crates.io dependencies and uses function-level reachability to confirm whether the vulnerable code path is actually reachable — not just present. No false positives.