CVE-2026-73489
Rust vulnerability analysis and mitigation

Overview

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).

Technical details

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).

Impact

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).

Exploitability

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).

Exploitation steps

  1. Authenticate to the target: Obtain valid credentials (any authentication method accepted by the server) and establish an SSH session to a russh-based server running version ≤ 0.62.3.
  2. Open a session channel: After authentication, open a standard SSH session channel using the SSH protocol (SSH_MSG_CHANNEL_OPEN with channel type session).
  3. Craft a malicious pty-req packet: Construct an 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.
  4. Send the packet: Transmit the crafted 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].
  5. Server panics: The Rust runtime raises a bounds-check panic (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).

Indicators of compromise

  • Logs: Rust panic messages in server logs containing 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.
  • Process: Abrupt termination of the russh server session task (tokio worker thread panic) without a clean SSH disconnect; repeated session crashes correlated with connections from the same client IP.
  • Network: SSH connections that authenticate and open a session channel but send a 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).

Mitigation and workarounds

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.

Community reactions

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.

Additional resources


SourceThis report was generated using AI

Related Rust vulnerabilities:

CVE ID

Severity

Score

Technologies

Component name

CISA KEV exploit

Has fix

Published date

CVE-2026-46369HIGH7.5
  • Rust logoRust
  • nimiq-blockchain
NoYesAug 12, 2026
CVE-2026-73430MEDIUM5.3
  • Rust logoRust
  • russh
NoYesAug 12, 2026
CVE-2026-73429MEDIUM5.3
  • Rust logoRust
  • yazi
NoYesAug 12, 2026
CVE-2026-73489MEDIUM4.3
  • Rust logoRust
  • russh
NoYesAug 13, 2026
RUSTSEC-2026-0256NONEN/A
  • Rust logoRust
  • circular-buffer
NoYesAug 11, 2026

Free Vulnerability Assessment

Benchmark your Cloud Security Posture

Evaluate your cloud security practices across 9 security domains to benchmark your risk level and identify gaps in your defenses.

Request assessment

Get a personalized demo

Ready to see Wiz in action?

"Best User Experience I have ever seen, provides full visibility to cloud workloads."
David EstlickCISO
"Wiz provides a single pane of glass to see what is going on in our cloud environments."
Adam FletcherChief Security Officer
"We know that if Wiz identifies something as critical, it actually is."
Greg PoniatowskiHead of Threat and Vulnerability Management