Skip to main content

Russh CVE-2026-102822

| EUVDEUVD-2026-89205 LOW
Improper Validation of Array Index (CWE-129)
2026-09-29 GitHub_M GHSA-p8qx-h547-fjw9
3.7
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Reach russh endpoint permitting mac=none
  2. Delivery
    Negotiate CTR/CBC cipher with mac=none
  3. Exploit
    Send packet with zero decrypted length
  4. Execution
    Trigger out-of-range buffer slice
  5. Impact
    Panic terminates connection task

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V2 - Validation and Business Logic Array index validation
Exploitation Conditions

Requires the russh deployment (<0.63.1) to be explicitly configured to permit mac=none in its algorithm preferences - a non-default hardening/weakening choice. When that is set, a remote peer can negotiate a MAC-requiring CTR or CBC block cipher (e.g. aes256-ctr, aes*-cbc, 3des, whose tag_len() is 0 with mac=none) because the selection logic only validated needs_mac() on the MAC-selection-failure branch. The attacker then sends a packet with a decrypted length of zero to trigger the panic. Limiting factors: the mac=none configuration is not default, exploitation is high-complexity, and the impact is confined to crashing the connection task (availability only) with no code execution or data exposure.

Impact

This is a genuinely low-severity, availability-only issue whose signals are internally consistent. The vendor CVSS 3.1 vector (AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L, score 3.7) correctly reflects a remote, unauthenticated but high-complexity denial-of-service with no confidentiality or integrity impact - the panic terminates only the affected connection task, not necessarily the whole process. AC:H is warranted because exploitation depends on a non-default configuration (the operator must permit mac=none) that then gets paired with a MAC-requiring CTR/CBC cipher. No EPSS score, KEV listing, or public exploit was provided, so this is 'no public exploit identified at time of analysis.' The 'Information Disclosure' tag conflicts with the actual impact (C:N; the effect is a panic/crash, A:L) and should be treated as mislabeled. Bottom line: low real-world priority - a config-gated, low-impact crash rather than a widespread or weaponizable flaw. CWE-129 (improper array-index validation) matches the root cause: the code indexes buffer.buffer[16..] after the probe block is shrunk below the expected length.

Exploit ScenarioDerived

An operator deploys a russh-based SSH server/client (<0.63.1) whose preferences permit mac=none. A remote peer negotiates a MAC-requiring CTR or CBC cipher together with mac=none (allowed because the code only enforces needs_mac() on the MAC-selection-failure path), then sends a packet whose decrypted length is zero. The read path in cipher/mod.rs shrinks the already-read block and panics on the buffer[16..] slice, terminating the connection task. No public PoC is referenced, though the fix commit ships a regression test that constructs the triggering KEXINIT.

Monitor Track and reassess. Why: LOW severity (CVSS 0.1-3.9).
Patch available 0.3% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Sep 29, 2026

Russh, the Rust SSH client and server library, can be driven into a panic-driven connection teardown by a remote peer whenever a deployment explicitly permits mac=none in its algorithm preferences. All releases prior to 0.63.1 are affected, because negotiation validated the cipher's needs_mac() requirement only on the MAC-selection-failure branch, allowing a MAC-requiring CTR or CBC cipher such as aes256-ctr to be paired with a zero-length MAC; the attacker then sends a packet with a decrypted length of zero, shrinking the buffer read in russh/src/cipher/mod.rs and panicking the indexing at buffer.buffer[16..]. The resulting impact is availability-only (the connection task terminates) with no code execution or data exposure, requires the non-default mac=none configuration and is rated high-complexity per the assessed AV:N/AC:H/PR:N/UI:N vector (unauthenticated remote attackers per the CVSS vector), and no public exploit code has been identified at time of analysis.

RemediationAI

Upgrade russh to 0.63.1 or later; the vendor-released fix is version 0.63.1 (release notes at https://github.com/Eugeny/russh/releases/tag/v0.63.1), with the patch commit at https://github.com/Eugeny/russh/commit/2885385abfee279092a41d80c6cb6ac367353159 and full details in advisory GHSA-p8qx-h547-fjw9 (https://github.com/Eugeny/russh/security/advisories/GHSA-p8qx-h547-fjw9). If an immediate upgrade is not possible, the actionable compensating control is to remove mac::NONE from the Preferred MAC list so that mac=none can never be negotiated; the trade-off is loss of interoperability with peers that offer nothing but a none-MAC, though such a configuration already provides no packet integrity and is generally undesirable, so removing it tightens rather than weakens the deployment. In Rust code this means dropping mac::NONE from Preferred { mac: ... } or overriding downstream defaults, and auditing any configuration that explicitly permits mac=none; additionally, keep CTR/CBC cipher preferences (aes256-ctr, aes*-cbc, 3des) away from any none-MAC pairing so tag_len() is never zero, and prefer AEAD ciphers whose needs_mac() is false. Because the impact is limited to a panic that terminates the connection task, no data-integrity or confidentiality exposure arises for correctly updated or reconfigured instances, but operators should still monitor for repeated connection-task crashes as a possible sign of attempted triggering.

Affected VersionsENISA

russh < 0.63.1

Affected Packages

cargo russh fix: 0.63.1

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in cargo

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

Russh implements the SSH transport layer, where the binary packet protocol pairs a bulk cipher with an integrity algorithm. AEAD-style ciphers carry their own authentication tag (tag_len() nonzero, needs_mac() false), but classic block ciphers such as aes256-ctr, the aes*-cbc family and 3des rely on a separate MAC and therefore report needs_mac() true; when such a cipher is negotiated together with mac=none, tag_len() becomes 0 and the read path loses the integrity framing it assumes. The root cause is CWE-129 (Improper Validation of Array Index) manifesting as insufficient validation of a length field before it is used to slice a buffer: the original code in russh/src/cipher/mod.rs decrypted the packet length and used it to shrink the block it had already read to probe that length, so a decrypted length of zero reduced the buffer below the 16-byte offset later used by buffer.buffer[16..], producing an out-of-bounds index panic rather than a graceful error. The accompanying negotiation logic in russh/src/negotiation.rs added to the problem by checking needs_mac() only inside the error branch of MAC selection, meaning a mac=none value could survive as a legitimate common choice or fallback even when the cipher required a MAC. The fix (commit 2885385abfee279092a41d80c6cb6ac367353159, released in 0.63.1) adds an explicit guard rejecting any packet length that, plus PACKET_LENGTH_LEN, is smaller than the block length the cipher needs to read, returning Error::PacketSize instead of panicking, and refactors MAC negotiation into a select_mac closure that refuses mac::NONE whenever need_mac is true regardless of whether it was a common choice or only the no-common-MAC fallback, with a regression test (needs_mac_cipher_rejects_negotiated_none_mac) covering the aes256-ctr plus none-MAC scenario.

Know when Russh gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (GitHub_M) PRIMARY 3.7 LOW
AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L
vuln.today AI 3.7 LOW

Remote and unauthenticated (AV:N/PR:N) but gated on non-default mac=none config plus a crafted zero-length packet (AC:H); only a connection-task crash, so A:L and no C/I impact.

3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L
4.0 AV:N/AC:H/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
High
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
None
Availability
Low

Lifecycle Timeline

1
Patch available
Sep 29, 2026 - 19:34 EUVD

DescriptionCVE.org

Russh is a Rust SSH client and server library. Prior to 0.63.1, a connection configured to permit mac=none can negotiate it with a MAC-requiring CTR or CBC block cipher because the selection logic validates needs_mac() only when MAC selection fails. A remote peer can then send a packet with a decrypted length of zero, causing russh/src/cipher/mod.rs to shrink the previously read block before indexing buffer.buffer[16..], which panics and terminates the connection task. This issue is fixed in version 0.63.1.

Threat Intelligence Overview

EPSS Score
0.3%
Top 77% exploitable
Prevalence
Medium
popular but niche Rust SSH client/server library, not ubiquitous like OpenSSH
Threat Intel
1
1 source
Data Quality
4 sources
Confidence: Medium
EUVD NVD CVE.org EPSS Vulnrichment GHSA GitHub

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity LOW
CISA KEV No
Public POC No
EPSS 0.3%
Patch available Yes
Active threat No
Deciding rule
LOW severity (CVSS 0.1-3.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Defer
Exploitation
Poc
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Low
Technical Impact
Partial

Priority Score

18
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +18
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

More in Russh

View all
CVE-2023-48795 MEDIUM POC
5.9 Dec 18

The SSH transport protocol with certain OpenSSH extensions, found in OpenSSH before 9.6 and other products, allows remot

CVE-2024-43410 HIGH POC
7.5 Aug 21

Russh is a Rust SSH client & server library. Rated high severity (CVSS 7.5), this vulnerability is remotely exploitable,

CVE-2023-28113 MEDIUM POC
5.9 Mar 16

russh is a Rust SSH client and server library. Rated medium severity (CVSS 5.9), this vulnerability is remotely exploita

CVE-2026-73430 MEDIUM POC
5.3 Aug 12

Unauthenticated remote denial of service in the Russh SSH library (versions ≤ 0.62.3) allows any network attacker to cra

CVE-2026-73429 MEDIUM POC
5.3 Aug 12

Denial-of-service in russh's Curve25519 key exchange client path allows any malicious SSH server to crash a connecting r

CVE-2026-102823 HIGH
7.5 Sep 29

Improper validation in the Russh Rust SSH library (versions prior to 0.63.1) lets a malicious or compromised SSH server

CVE-2026-42189 HIGH
7.5 May 08

Pre-authentication denial-of-service in russh SSH server library allows remote attackers to crash servers implementing k

CVE-2026-48110 HIGH
7.5 Jun 10

Denial of service in Russh (Rust SSH client/server library) versions 0.34.0 through 0.60.x allows remote SSH peers to tr

CVE-2026-48107 MEDIUM
6.5 Jun 10

Denial of service in Russh (versions 0.37.0-0.60.x), a Rust SSH client and server library, allows a malicious SSH server

CVE-2026-102821 MEDIUM POC
6.5 Sep 29

Memory exhaustion in the Russh Rust SSH client/server library prior to 0.63.2 allows an authenticated remote peer to sta

CVE-2026-102820 MEDIUM POC
6.2 Sep 29

The Windows Pageant client inside the pageant Rust crate (pageant/src/wmmessage.rs) trusts a peer-controlled u32 respons

CVE-2026-48108 MEDIUM
5.3 Jun 10

Resource exhaustion in Russh's SSH server identification-string reader allows unauthenticated remote attackers to hold c

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy