A missing authorization vulnerability exists in the russh Rust SSH client and server library versions prior to 0.65.0. The agent server incorrectly returns a hard-coded success for SSH_AGENT_CONSTRAIN_CONFIRM requests instead of performing the expected user approval or policy check. This allows processes with access to the agent socket, including remote forwarded agents, to use keys added with confirmation without actual user approval, potentially enabling unauthorized signing or authentication. The issue is fixed in version 0.65.0.
CVE-2026-116775 is a low-severity vulnerability in the Eugeny russh library affecting versions from 0.2.0 up to but not including 0.2.5. The issue arises from the PageantStream type trusting a peer-controlled length prefix without enforcing the fixed transport capacity limit, which can lead to excessive memory allocation or retention of partial frames. This can cause client memory exhaustion when bridging an SSH forwarded-agent channel to the raw stream. The vulnerability is fixed in version 0.2.5.
russh is a Rust SSH client and server library that includes an SSH agent protocol implementation. From 0.60.0 until 0.65.0, channel-open parsing accepts a peer-declared maximum_packet_size of zero and passes it into ChannelTx::poll_writable in russh/src/channels/io/tx.rs. The Channel::data, Channel::make_writer, and Channel::into_stream asynchronous write paths then calculate a writable size of zero and remain pending forever because window adjustments cannot satisfy a static zero packet maximum. An authenticated client can strand server writes, and a malicious server can strand client writes, allowing affected tasks, channels, and connections to accumulate without surfacing an error. This issue is fixed in version 0.65.0.
CVE-2026-116773 is a resource exhaustion vulnerability in the russh Rust SSH client and server library prior to version 0.65.0. The client improperly handles repeated private EXT_INFO messages (msg::EXT_INFO = 7) sent before authentication, appending extension names to a vector without limits or deduplication. This can lead to progressive memory exhaustion on the client side. The issue is fixed in russh version 0.65.0.
CVE-2026-116696 is a resource allocation vulnerability in the russh Rust SSH client and server library prior to version 0.65.0. The issue occurs in the SSH agent protocol implementation where repeated SSH_AGENT_CONSTRAIN_CONFIRM records can be added without limits, causing unbounded memory growth. This memory growth persists for the lifetime of the process because keys without lifetime constraints do not expire. The vulnerability is fixed in russh version 0.65.0.
CVE-2026-111061 is a resource exhaustion vulnerability in the Eugeny russh Rust SSH client and server library. Versions prior to 0.64.1 improperly handle SSH_AGENT_CONSTRAIN_LIFETIME records by spawning a separate long-lived task for each record without limits or rollback on parsing failures. This can lead to memory and task exhaustion, causing denial of SSH agent service. The issue is fixed in version 0.64.1.
CVE-2026-102825 is a vulnerability in the Eugeny russh Rust SSH client and server library where authentication attempt limits are not properly enforced prior to version 0.62.6. This allows an unauthenticated remote client to bypass the configured maximum authentication attempts on a single connection, potentially increasing the risk of online guessing attacks and additional backend workload. The issue is fixed in version 0.62.6.
CVE-2026-102824 affects the Eugeny russh Rust SSH client and server library prior to version 0.63.0. The vulnerability arises from the hybrid ML-KEM 768 and X25519 key exchange implementation accepting an all-zero 32-byte peer X25519 public key. This causes the X25519 contribution to the combined shared secret to be zero, allowing a malicious peer to force the shared secret to depend solely on ML-KEM. This defeats the intended fallback protection of the hybrid exchange. The issue is fixed in russh version 0.63.0.
CVE-2026-102823 is an improper input validation vulnerability in the Eugeny russh Rust SSH client and server library. Versions prior to 0.63.1 do not verify that channel lifecycle events received from an SSH server correspond to channels the client actually opened and established. This allows a malicious SSH server to send events for predicted or invalid channel identifiers, potentially causing application panics or corrupting command completion and exit-code tracking. The issue is fixed in version 0.63.1.
CVE-2026-102822 is a low-severity vulnerability in the Russh Rust SSH client and server library prior to version 0.63.1. It involves improper validation of array indices when a connection is configured to permit mac=none but negotiates a MAC-requiring cipher. This can cause a panic and termination of the connection task due to an out-of-bounds slice operation. The issue is fixed in version 0.63.1.
CVE-2026-102821 is an uncontrolled resource consumption vulnerability in the Eugeny russh Rust SSH client and server library. Versions prior to 0.63.2 allow an authenticated remote peer to flood SSH_MSG_CHANNEL_OPEN messages without sending the required SSH_MSG_KEX_ECDH_INIT, causing the server to enqueue replies on an unbounded channel. This leads to memory growth until the process is terminated. The issue is fixed in version 0.63.2.
CVE-2026-102820 is an out-of-bounds read vulnerability in the Windows pageant crate used by Eugeny's russh library. The flaw exists in the MemoryMap::read function prior to pageant version 0.2.3, where a peer-controlled 32-bit response length is trusted, allowing a local process impersonating the Pageant window to cause a large memory allocation and read beyond the mapped memory. This can crash the russh client and potentially expose adjacent committed memory. The issue is fixed in pageant 0.2.3.
Russh is a Rust SSH client & server library. Prior to 0.62.4, an authenticated SSH client can cause a denial of service by sending a pty-req channel request with more than 130 terminal-mode records. The parser in russh/src/server/encrypted.rs stores terminal modes in a fixed 130-entry [(Pty::TTY_OP_END, 0); 130] array but continues increasing the mode count, then constructs an out-of-bounds slice and panics before the application pty_request handler runs. The panic terminates the server session task without causing memory corruption. This issue is fixed in version 0.62.4.
Russh is a Rust SSH client & server library. Prior to 0.62.4, an unauthenticated SSH client can cause a denial of service by sending SSH_MSG_KEX_ECDH_INIT with a 32-byte all-zero Q_C value. Curve25519Kex::server_dh in russh/src/kex/curve25519.rs accepts the all-zero peer public value and computes an all-zero shared secret, after which compute_exchange_hash calls encode_mpint in russh/src/kex/mod.rs and indexes beyond the end of the input while skipping leading zero bytes. The resulting panic occurs before authentication and terminates the server key-exchange task. This issue is fixed in version 0.62.4.
Russh is a Rust SSH client & server library. Prior to 0.62.4, a malicious SSH server can crash a russh client session with a malformed KEX_ECDH_REPLY containing a server ephemeral value that is not 32 bytes long. The client-side Curve25519Kex::compute_shared_secret function in russh/src/kex/curve25519.rs passes the decoded exchange.server_ephemeral value to clone_from_slice without validating its length, causing a deterministic panic before the server host key is verified. The panic terminates the spawned client session task and surfaces as a JoinError, while the embedding process normally remains running. This issue is fixed in version 0.62.4.
Russh is a Rust SSH client & server library. Prior to 0.62.5, russh dispatches channel-scoped Handler callbacks for recipient channel IDs that were never opened or confirmed in russh/src/server/encrypted.rs, server_read_authenticated, and the exec_request callback. Version 0.62.5 fixes the issue.
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.
Russh is a Rust SSH client & server library. From version 0.34.0-beta.1 to before version 0.61.0, russh did not enforce the SSH identification-string rules as deliberately as OpenSSH. In particular, the server-side identification reader used the same permissive path as the client, allowing pre-banner lines from clients, and the reader did not enforce a bounded number of pre-banner lines. For a library server built on russh, this could allow a remote peer to hold connection setup resources in the cleartext pre-authentication phase with malformed identification input that should have been rejected early. This issue has been patched in version 0.61.0.
Russh is a Rust SSH client & server library. From version 0.37.0 to before version 0.61.0, in the russh client keyboard-interactive authentication path, a malicious SSH server could send a USERAUTH_INFO_REQUEST with an attacker-controlled prompt count, and the client would use that raw count directly in Vec::with_capacity(...) before validating that enough prompt data was actually present in the packet. This issue has been patched in version 0.61.0.
Russh is a Rust SSH client & server library. From version 0.34.0-beta.1 to before version 0.61.0, the russh server authentication path keeps internal userauth state across SSH_MSG_USERAUTH_REQUEST messages without separating that state when the request principal changes. RFC 4252 allows the user name and service name fields to change between authentication requests. The issue is not that such changes are invalid. The issue is that russh-owned authentication state, such as remaining methods, partial-success state, and in-progress method state, can remain associated with the connection and then influence a later request for a different (user, service). This is an internal library state mismatch. This issue has been patched in version 0.61.0.