
Cloud Vulnerability DB
A community-led vulnerabilities database
CVE-2026-73489 is a post-authentication denial-of-service vulnerability in russh, a Rust SSH client and server library. An authenticated SSH client can crash the server session task by sending a pty-req channel request containing more than 130 terminal-mode records, triggering an out-of-bounds slice panic in the parser. All versions up to and including 0.62.3 are affected; the issue is fixed in version 0.62.4, released on July 22, 2026. It carries a CVSS v3.1 base score of 4.3 (Medium) (GitHub Advisory).
The root cause is improper validation of an array index (CWE-129) in russh/src/server/encrypted.rs. The pty-req parser allocates a fixed 130-entry array [(Pty::TTY_OP_END, 0); 130] and uses a counter i that increments for every valid terminal-mode record. When i reaches 130, the code logs a warning but does not return or reject the request — it continues incrementing i. After the loop, the slice &modes[0..i] is constructed with an out-of-bounds end index (e.g., 131), causing a Rust bounds-check panic (range end index 131 out of range for slice of length 130) before the application's pty_request handler is ever invoked. Because SSH packet-size limits do not cap the number of mode records to 130, a single well-formed pty-req packet carrying 131 five-byte records (opcode + 4-byte value each) is sufficient to trigger the panic. A working end-to-end proof-of-concept using the real russh 0.62.2 crate over TCP with default crypto configuration was included in the advisory (GitHub Advisory, Fix Commit).
Successful exploitation causes the russh server session task to panic and terminate, resulting in a remote denial of service for any authenticated SSH session. Because Rust's bounds-checked panics abort only the affected task without memory corruption, there is no risk of remote code execution, data exfiltration, or integrity compromise. The impact is limited to availability — any authenticated user (including legitimately credentialed users or compromised accounts) can crash their own server session with a single packet, potentially disrupting SSH-dependent services built on the russh library (GitHub Advisory).
A functional proof-of-concept was published alongside the advisory, demonstrating end-to-end exploitation against an unmodified russh 0.62.2 server using the default crypto configuration (curve25519-sha256 + chacha20-poly1305). Exploitation requires only a valid authenticated session channel — no special privileges or user interaction beyond authentication. The EPSS score is 0.0, indicating low current probability of widespread exploitation, and the vulnerability is not listed in the CISA Known Exploited Vulnerabilities catalog. No threat actor attribution or in-the-wild exploitation has been reported (GitHub Advisory).
SSH_MSG_CHANNEL_OPEN with channel type session).SSH_MSG_CHANNEL_REQUEST of type pty-req containing more than 130 terminal-mode records. Each record is 5 bytes (1-byte opcode + 4-byte big-endian value); 131 records of (VINTR, 42) are sufficient. The russh client API Channel::request_pty(...) can be used directly with a 131-element modes vector, as it applies no count cap during serialization.pty-req to the server. The server's parser increments its counter past 130 without rejecting the request, then attempts to construct the out-of-bounds slice &modes[0..131].range end index 131 out of range for slice of length 130) in russh/src/server/encrypted.rs:1201, terminating the server session task before the application handler runs and achieving denial of service (GitHub Advisory).panicked at russh/src/server/encrypted.rs:1201 with the text range end index 131 out of range for slice of length 130; log entries with pty-req: too many pty codes (error-level) immediately preceding a session task termination.pty-req request and then immediately disconnect or receive no response; unusually large pty-req packets (≥655 bytes of mode data, i.e., 131+ five-byte records) (GitHub Advisory).Upgrade russh to version 0.62.4 or later, which fixes the vulnerability by adding a bounds check before the slice construction: if i >= modes.len(), the parser now returns an Error::Inconsistent and rejects the request rather than logging and continuing (Fix Commit, Release v0.62.4). No configuration-based workaround is available, as the vulnerability is reachable with the default server and crypto configuration. Applications embedding russh should update their Cargo.toml dependency to russh = "0.62.4" and rebuild.
The vulnerability was reported by the afldl security research effort (diff/ambidiff) and disclosed via GitHub Security Advisories on July 22, 2026. The advisory includes a detailed end-to-end PoC and was patched the same day as part of a release that also addressed two other panic-inducing bugs (GHSA-g9hv-x236-4qp3 and GHSA-5xvq-cp9x-6p6r) related to malformed Curve25519 KEX packets (GitHub Advisory, Release v0.62.4). No significant broader media coverage or social media discussion has been identified.
Source: This report was generated using AI
Free Vulnerability Assessment
Evaluate your cloud security practices across 9 security domains to benchmark your risk level and identify gaps in your defenses.
Get a personalized demo
"Best User Experience I have ever seen, provides full visibility to cloud workloads."
"Wiz provides a single pane of glass to see what is going on in our cloud environments."
"We know that if Wiz identifies something as critical, it actually is."