CVE-2026-48110
Russh: SSH message fields were decoded through allocation-first parsers before field-specific bounds
Russh is a Rust SSH client & server library. From version 0.34.0 to before version 0.61.0, several russh client and server message handlers decoded attacker-controlled SSH strings, name-lists, and byte fields into owned allocations before applying field-specific bounds. A remote SSH peer could send oversized, high-fanout, or malformed length-prefixed fields and make the library allocate, attempt to allocate, or split data before rejecting input that should have been rejected earlier. This issue has been patched in version 0.61.0.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- None
- Integrity
- None
- Availability
- High
Exploit likelihood
What each source reports
CVE List Score used
7.5
Russh: SSH message fields were decoded through allocation-first parsers before field-specific bounds
Russh is a Rust SSH client & server library. From version 0.34.0 to before version 0.61.0, several russh client and server message handlers decoded attacker-controlled SSH strings, name-lists, and byte fields into owned allocations before applying field-specific bounds. A remote SSH peer could send oversized, high-fanout, or malformed length-prefixed fields and make the library allocate, attempt to allocate, or split data before rejecting input that should have been rejected earlier. This issue has been patched in version 0.61.0.
- Record
CVE-2026-48110- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Weakness
- CWE-20
- Updated
- 2026-11-02
EUVDEUVD-2026-36131
7.5
Russh is a Rust SSH client & server library. From version 0.34.0 to before version 0.61.0, several russh client and server message handlers decoded attacker-controlled SSH strings, name-lists, and byte fields into owned allocations before applying field-specific bounds. A remote SSH peer could send oversized, high-fanout, or malformed length-prefixed fields and make the library allocate, attempt to allocate, or split data before rejecting input that should have been rejected earlier. This issue has been patched in version 0.61.0.
- Record
EUVD-2026-36131- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-4r3c-5hpg-58qr
7.5
Russh SSH message fields were decoded through allocation-first parsers before field-specific bounds
SSH message fields were decoded through allocation-first parsers before field-specific bounds
Summary
Several russh client and server message handlers decoded attacker-controlled SSH strings, name-lists, and byte fields into owned allocations before applying field-specific bounds. A remote SSH peer could send oversized, high-fanout, or malformed length-prefixed fields and make the library allocate, attempt to allocate, or split data before rejecting input that should have been rejected earlier.
Affected Versions
Oldest verified exploitable stable release: russh 0.34.0.
- Historical stronger case:
russh >= 0.34.0, < 0.58.0. These releases have the allocation-first KEXINIT field parsing issue and still useCryptoVecfor inbound packet/decompression buffers. A peer can combine negotiated RFCzlib, rekey, compressed KEXINIT expansion, historicalCryptoVecdecompression growth, and KEXINIT name-list fanout. - Current maintained-line case:
russh >= 0.58.0, including0.60.2. These releases moved non-secret packet/decompression buffers offCryptoVec, but the allocation-first SSH field parser issue remains reachable as aVec/String/name-list resource exhaustion issue.
Prerelease coverage was not claimed for the zlib/CryptoVec/KEXINIT combo because the combined historical exploit shape was verified against stable v0.34.0-era code and reproduced the stress behavior on v0.57.1.
Details
The affected parser pattern appeared across the SSH transport and encrypted-message parser code:
- KEX negotiation parsing
- client encrypted-message parsing
- server encrypted-message parsing
- shared SSH parsing helpers
Examples of allocation-first field parsing covered by the fix include:
- KEXINIT name-lists
- client
USERAUTH_FAILUREmethod lists - client
USERAUTH_BANNERtext fields - client
USERAUTH_PK_OKfields - client
EXT_INFOextension fields - server
SERVICE_REQUESTnames - server
USERAUTH_REQUESTheader fields - server password/publickey/keyboard-interactive auth fields, excluding the already-submitted prompt-count issue
- server and client channel/global request names
- server pty, x11, env, exec, subsystem, signal, and forwarding request fields
- channel-open-failure description and language fields
Before the fix, these handlers generally used ssh_encoding::Decode into String, Bytes, Vec, or NameList first, then validated semantics later. For length-prefixed SSH fields, that means the owned decoder can accept an attacker-controlled length prefix and allocate or attempt allocation before discovering that the packet is truncated or above a local field bound. The fix introduces borrowed bounded parsing helpers such as take_str, take_bytes, and take_name_list.
RFC / OpenSSH Comparison
RFC 4251 section 5 defines SSH string and name-list encodings. RFC 4253 and RFC 4254 then use those encodings throughout KEX, auth, channel, and forwarding messages. The RFC encoding permits large length prefixes, so implementations need local bounds appropriate to their packet and parser model.
RFC 4251 also says each name inside a name-list is non-empty, cannot contain a comma, and is made of US-ASCII names. RFC 4253 section 7.1 requires the algorithm name-lists in SSH_MSG_KEXINIT to contain at least one algorithm name, while language name-lists may be empty.
OpenSSH portable commonly parses SSH fields with packet-buffer helpers and then immediately checks message completion:
openssh-portable:kex.c:kex_input_kexinit()/kex_buf2prop()openssh-portable:auth2.c:USERAUTH_REQUESTheader parsingopenssh-portable:sshconnect2.c: client auth reply parsingopenssh-portable:serverloop.c: global and channel-open parsingopenssh-portable:session.c: channel request parsingopenssh-portable:packet.c:sshpkt_get_cstring(),sshpkt_get_string(),sshpkt_get_end()
openssh-portable was checked at 45b30e0a5. OpenSSH generally…
- Record
GHSA-4r3c-5hpg-58qr- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Weakness
- CWE-20
- Updated
- 2026-11-02
NVD
7.5
Russh is a Rust SSH client & server library. From version 0.34.0 to before version 0.61.0, several russh client and server message handlers decoded attacker-controlled SSH strings, name-lists, and byte fields into owned allocations before applying field-specific bounds. A remote SSH peer could send oversized, high-fanout, or malformed length-prefixed fields and make the library allocate, attempt to allocate, or split data before rejecting input that should have been rejected earlier. This issue has been patched in version 0.61.0.
- Record
CVE-2026-48110- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Weakness
- CWE-20
- Updated
- 2026-11-02
OSV
7.5
Russh: SSH message fields were decoded through allocation-first parsers before field-specific bounds
Russh is a Rust SSH client & server library. From version 0.34.0 to before version 0.61.0, several russh client and server message handlers decoded attacker-controlled SSH strings, name-lists, and byte fields into owned allocations before applying field-specific bounds. A remote SSH peer could send oversized, high-fanout, or malformed length-prefixed fields and make the library allocate, attempt to allocate, or split data before rejecting input that should have been rejected earlier. This issue has been patched in version 0.61.0.
- Record
CVE-2026-48110- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Weakness
- CWE-20
- Updated
- 2026-11-02
OSVDEBIAN-CVE-2026-48110
7.5
Russh is a Rust SSH client & server library. From version 0.34.0 to before version 0.61.0, several russh client and server message handlers decoded attacker-controlled SSH strings, name-lists, and byte fields into owned allocations before applying field-specific bounds. A remote SSH peer could send oversized, high-fanout, or malformed length-prefixed fields and make the library allocate, attempt to allocate, or split data before rejecting input that should have been rejected earlier. This issue has been patched in version 0.61.0.
- Record
DEBIAN-CVE-2026-48110- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Updated
- 2026-11-02
OSVGHSA-4r3c-5hpg-58qr
7.5
Russh SSH message fields were decoded through allocation-first parsers before field-specific bounds
SSH message fields were decoded through allocation-first parsers before field-specific bounds
Summary
Several russh client and server message handlers decoded attacker-controlled SSH strings, name-lists, and byte fields into owned allocations before applying field-specific bounds. A remote SSH peer could send oversized, high-fanout, or malformed length-prefixed fields and make the library allocate, attempt to allocate, or split data before rejecting input that should have been rejected earlier.
Affected Versions
Oldest verified exploitable stable release: russh 0.34.0.
- Historical stronger case:
russh >= 0.34.0, < 0.58.0. These releases have the allocation-first KEXINIT field parsing issue and still useCryptoVecfor inbound packet/decompression buffers. A peer can combine negotiated RFCzlib, rekey, compressed KEXINIT expansion, historicalCryptoVecdecompression growth, and KEXINIT name-list fanout. - Current maintained-line case:
russh >= 0.58.0, including0.60.2. These releases moved non-secret packet/decompression buffers offCryptoVec, but the allocation-first SSH field parser issue remains reachable as aVec/String/name-list resource exhaustion issue.
Prerelease coverage was not claimed for the zlib/CryptoVec/KEXINIT combo because the combined historical exploit shape was verified against stable v0.34.0-era code and reproduced the stress behavior on v0.57.1.
Details
The affected parser pattern appeared across the SSH transport and encrypted-message parser code:
- KEX negotiation parsing
- client encrypted-message parsing
- server encrypted-message parsing
- shared SSH parsing helpers
Examples of allocation-first field parsing covered by the fix include:
- KEXINIT name-lists
- client
USERAUTH_FAILUREmethod lists - client
USERAUTH_BANNERtext fields - client
USERAUTH_PK_OKfields - client
EXT_INFOextension fields - server
SERVICE_REQUESTnames - server
USERAUTH_REQUESTheader fields - server password/publickey/keyboard-interactive auth fields, excluding the already-submitted prompt-count issue
- server and client channel/global request names
- server pty, x11, env, exec, subsystem, signal, and forwarding request fields
- channel-open-failure description and language fields
Before the fix, these handlers generally used ssh_encoding::Decode into String, Bytes, Vec, or NameList first, then validated semantics later. For length-prefixed SSH fields, that means the owned decoder can accept an attacker-controlled length prefix and allocate or attempt allocation before discovering that the packet is truncated or above a local field bound. The fix introduces borrowed bounded parsing helpers such as take_str, take_bytes, and take_name_list.
RFC / OpenSSH Comparison
RFC 4251 section 5 defines SSH string and name-list encodings. RFC 4253 and RFC 4254 then use those encodings throughout KEX, auth, channel, and forwarding messages. The RFC encoding permits large length prefixes, so implementations need local bounds appropriate to their packet and parser model.
RFC 4251 also says each name inside a name-list is non-empty, cannot contain a comma, and is made of US-ASCII names. RFC 4253 section 7.1 requires the algorithm name-lists in SSH_MSG_KEXINIT to contain at least one algorithm name, while language name-lists may be empty.
OpenSSH portable commonly parses SSH fields with packet-buffer helpers and then immediately checks message completion:
openssh-portable:kex.c:kex_input_kexinit()/kex_buf2prop()openssh-portable:auth2.c:USERAUTH_REQUESTheader parsingopenssh-portable:sshconnect2.c: client auth reply parsingopenssh-portable:serverloop.c: global and channel-open parsingopenssh-portable:session.c: channel request parsingopenssh-portable:packet.c:sshpkt_get_cstring(),sshpkt_get_string(),sshpkt_get_end()
openssh-portable was checked at 45b30e0a5. OpenSSH generally…
- Record
GHSA-4r3c-5hpg-58qr- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Weakness
- CWE-20
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
russhcrates.io |
0.34.0 up to 0.61.0 | 0.61.0 |
rust-russhDebian:14 |
before 0.64.1-1, plus listed versions 0.57.1-10.57.1-2 |
0.64.1-1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-48110 is a high vulnerability (CVSS 7.5) in Eugeny Russh, published June 10, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.37%, the 30th percentile. Fixed in russh 0.61.0.
References
github.com/Eugeny/russh/security/advisories/GHSA-4r3c-5hpg-58qr
nvd.nist.gov/vuln/detail/CVE-2026-48110
github.com/Eugeny/russh/releases/tag/v0.61.0
github.com/advisories/GHSA-4r3c-5hpg-58qr
github.com/CVEProject/cvelistV5/tree/main/cves/2026/48xxx/CVE-2026-48110.json
security-tracker.debian.org/tracker/CVE-2026-48110
github.com/Eugeny/russh
Left out here: the rest of 2 source descriptions. The JSON record has them.