Skip to main content

Russh CVE-2026-102825

| EUVDEUVD-2026-89365 LOW
Improper Restriction of Excessive Authentication Attempts (CWE-307)
2026-09-29 security-advisories@github.com GHSA-g6xm-f9xp-qq35
3.7
CVSS 3.1 · Vendor: github
View

Attack ChainAIDerived

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

  1. Access
    Open SSH connection to russh server
  2. Delivery
    Send repeated USERAUTH_REQUEST password attempts
  3. Exploit
    Cap never enforced, connection stays open
  4. Execution
    Continue online credential guessing past limit
  5. Impact
    Compromise weak account / add auth load

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V6 - Authentication Brute-force prevention, rate limiting
Exploitation Conditions

Exploitable only when the deployment sets server::Config.max_auth_attempts to a nonzero cap and relies on it to throttle guessing; the bug is that russh <0.62.6 increments auth_attempts on the USERAUTH_REQUEST path in russh/src/server/encrypted.rs but never compares it to that cap, so the limit is silently unenforced. No authentication or user interaction is required (PR:N/UI:N) and it works against network-reachable russh servers, but practical impact is LIMITED because the attacker still must guess valid credentials - the vulnerability only removes the lockout/disconnect that would otherwise cut off guessing, and it has no effect if operators use external throttling (e.g. fail2ban, firewall rate limits) or leave max_auth_attempts at 0.

Impact

All signals point to a genuine but low-priority issue. The vendor CVSS of 3.7 (CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N) is internally consistent with the described flaw: network-reachable and unauthenticated (AV:N/PR:N), but high complexity (AC:H) because the bug only removes a throttle - it does not itself grant access, so real-world impact still depends on the attacker eventually guessing valid credentials. Impact is correctly scoped to C:L with no integrity or availability effect. There is no EPSS score, no CISA KEV listing, and no public exploit in the provided data, so this is 'no public exploit identified at time of analysis.' The GitHub commit and regression tests confirm the root cause and fix, so the technical claim is solid, but this is squarely a low-real-risk hardening issue rather than a critical priority - it weakens a defense-in-depth control (attempt capping) rather than creating a direct compromise. No conflicting signals were found; the main caveat is that exploitability is entirely gated on the presence of guessable credentials and a configured max_auth_attempts policy that operators actually rely on.

Exploit ScenarioDerived

An unauthenticated remote attacker opens a single SSH connection to a service built on russh <0.62.6 and repeatedly submits USERAUTH_REQUEST password attempts. Because auth_attempts is incremented but never compared to Config.max_auth_attempts, the server keeps answering with USERAUTH_FAILURE instead of disconnecting, letting the attacker run an uninterrupted online password-guessing campaign on one connection and generating extra backend authentication load. No public PoC exists, though the fix commit ships a regression test that demonstrates the pre-fix behavior.

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 SSH servers running versions prior to 0.62.6 that set server::Config.max_auth_attempts to a nonzero value silently fail to enforce that limit, letting an unauthenticated remote client keep sending USERAUTH_REQUEST messages on a single connection past the configured cap. The auth_attempts counter is incremented on the server::run_stream path in russh/src/server/encrypted.rs but is never compared against the configured maximum, so the intended 'too many authentication attempts' disconnect never fires, preserving unlimited online password guessing and adding backend authentication load. Practical impact is limited: the attacker must still guess valid credentials, the bug has no effect when max_auth_attempts is 0 or when external throttling (fail2ban, firewall rate limits) is used, and no public exploit code has been identified at time of analysis.

RemediationAI

Upgrade russh to 0.62.6 or later, which contains the upstream fix: the vendor advisory GHSA-g6xm-f9xp-qq35 and the patch commit f8fd0b11a393364dc7f01a182482d86adafdd653 add a check that disconnects with NoMoreAuthMethodsAvailable when rejection_count reaches server::Config.max_auth_attempts, so after upgrading operators must set max_auth_attempts to a nonzero value for the limit to be enforced. Vendor-released patch: 0.62.6. If the dependency cannot be bumped immediately, compensating controls are effective here because the defect only removes russh's own throttle: place external attempt limiting in front of the SSH listener (fail2ban or an equivalent log-driven blocker on USERAUTH_FAILURE patterns, or firewall/connection rate limiting such as nftables or iptables hashlimit), since the bug does not interfere with those mechanisms at all. A trade-off of log-driven blocking is a small delay between the offending attempt and the ban, and it requires the daemon to emit authentication failure logging; connection-level rate limiting is immediate but can throttle legitimate reconnecting clients and offers coarser granularity. Running the server behind a bastion or VPN that restricts who can reach port 22 is a further option at the cost of broader access changes. None of these workarounds repairs the underlying counter logic, so upgrade remains the primary fix.

Affected VersionsENISA

russh < 0.62.6

Affected Packages

cargo russh fix: 0.62.6

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 is a Rust implementation of the SSH client and server protocol. During the SSH user authentication phase, the server reads USERAUTH_REQUEST (and USERAUTH_INFO_RESPONSE for multi-factor exchanges) packets and, on failure, replies with USERAUTH_FAILURE while tracking state in EncryptedState::WaitingAuthRequest, which carries a rejection_count. The library exposes server::Config.max_auth_attempts so operators can bound failed authentication attempts per connection. In versions before 0.62.6 the code path reached from server::run_stream in russh/src/server/encrypted.rs incremented self.common.auth_attempts but never compared it with max_auth_attempts, so the rejection counter was effectively advisory and the connection was never torn down - a CWE-307 (Improper Restriction of Excessive Authentication Attempts) weakness. The fix in commit f8fd0b11a393364dc7f01a182482d86adafdd653 checks the first byte of the incoming packet against USERAUTH_REQUEST or USERAUTH_INFO_RESPONSE and, when rejection_count is greater than or equal to max_auth_attempts, disconnects with Disconnect::NoMoreAuthMethodsAvailable and the reason 'Too many authentication attempts'. The same commit adds regression tests confirming that authentication attempts are capped at the configured maximum and that publickey probes (which are answered with PK_OK rather than USERAUTH_FAILURE) do not consume the attempt budget. Under the assessed vector CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N the issue is network-reachable without authentication or user interaction, but its confidentiality-only, low-severity impact reflects that it merely removes a defensive throttle rather than granting access directly.

Know when Rust 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) PRIMARY 3.7 LOW
AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N
vuln.today AI 3.7 LOW

Network-reachable and unauthenticated (AV:N/PR:N), but AC:H and only C:L because bypassing the attempt cap merely raises guessing odds rather than directly granting access.

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

Primary rating from Vendor (github).

CVSS VectorVendor: github

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

Lifecycle Timeline

1
Patch available
Sep 29, 2026 - 20:04 EUVD

DescriptionCVE.org

Russh is a Rust SSH client and server library. Prior to 0.62.6, the USERAUTH_REQUEST path reached from server::run_stream in russh/src/server/encrypted.rs increments self.common.auth_attempts but never compares it with server::Config.max_auth_attempts. An unauthenticated remote client can continue submitting authentication requests on one connection beyond the configured cap, bypassing the deployment's attempt-limiting policy and increasing online guessing opportunity and backend authentication workload. This issue is fixed in version 0.62.6.

Threat Intelligence Overview

EPSS Score
0.3%
Top 81% exploitable
Prevalence
Medium
popular Rust SSH library, embedded in various server/client tools
Threat Intel
1
1 sources
Data Quality
5 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

Attack Technique

Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.

More in Rust

View all
CVE-2024-3566 CRITICAL POC
9.8 Apr 10

Command injection via Windows CreateProcess argument parsing affects multiple language runtimes and tooling (Node.js, PH

CVE-2021-31162 CRITICAL POC
9.8 Apr 14

In the standard library in Rust before 1.52.0, a double free can occur in the Vec::from_iter function if freeing the ele

CVE-2021-28879 CRITICAL POC
9.8 Apr 11

In the standard library in Rust before 1.52.0, the Zip implementation can report an incorrect size due to an integer ove

CVE-2026-58491 CRITICAL POC
9.3 Sep 21

Stored cross-site scripting and open redirect in Warpgate's SSO endpoints (versions prior to 0.25.5) allow an unauthenti

CVE-2021-29922 CRITICAL POC
9.1 Aug 07

library/std/src/net/parser.rs in Rust before 1.53.0 does not properly consider extraneous zero characters at the beginni

CVE-2026-77620 HIGH POC
8.7 Sep 22

Denial of service in the Vector observability pipeline's `logstash` source (versions 0.15.0 through 0.56.x) allows a rem

CVE-2019-12083 HIGH POC
8.1 May 13

The Rust Programming Language Standard Library 1.34.x before 1.34.2 contains a stabilized method which, if overridden, c

CVE-2021-28878 HIGH POC
7.5 Apr 11

In the standard library in Rust before 1.52.0, the Zip implementation calls __iterator_get_unchecked() more than once fo

CVE-2021-28875 HIGH POC
7.5 Apr 11

In the standard library in Rust before 1.50.0, read_to_end() does not validate the return value from Read in an unsafe c

CVE-2019-16760 HIGH POC
7.5 Sep 30

Cargo prior to Rust 1.26.0 may download the wrong dependency if your package.toml file uses the `package` configuration

CVE-2024-24576 CRITICAL POC
10.0 Apr 09

Rust is a programming language. Rated critical severity (CVSS 10.0), this vulnerability is remotely exploitable, no auth

CVE-2018-1000810 CRITICAL
9.8 Oct 08

The Rust Programming Language Standard Library version 1.29.0, 1.28.0, 1.27.2, 1.27.1, 127.0, 126.2, 126.1, 126.0 contai

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