LOWCVSS v3.1 3.7Vulnerability

CVE-2026-128087

### Summary A malicious SSH server whose host key is rejected can still cause russh's `client::Handler::kex_done()` callback to execute with the raw key-exchange shared secret. Applications using the callback for its documented protocol-bridging purpose may derive keys, initialize a secondary data channel, or perform another externally visible action before russh calls `check_server_key()` and rejects the server. ### Details During the initial key exchange, russh calls `kex_done()` immediately after the server proves possession of the presented host key, but before the application decides whether that key belongs to the intended server: ```rust let shared_secret = newkeys.kex.shared_secret_bytes(); handler .kex_done(shared_secret, &newkeys.names, session) .await?; // Initial KEX only checks trust afterwards. if let Some(certificate) = server_host_certificate { if !handler.check_server_key(&certificate.into()).await? { return Err(crate::Error::UnknownKey.into()); } } else if let Some(server_host_key) = server_host_key { let check = handler.check_server_key(&server_host_key.into()).await?; if !check { return Err(crate::Error::UnknownKey.into()); } } ``` This is in `russh/src/client/mod.rs` at lines 2036-2078 of commit `183a22e8f8f490fa09b6eb7bd044ef99d8c4414f`. The API documentation describes `check_server_key()` as the important trust decision that prevents man-in-the-middle attacks. It describes `kex_done()` as the callback for deriving keys for secondary encrypted channels. The feature request that introduced the callback specifically lists VPN-over-SSH, UDP data planes, file transfer, and custom enterprise transports as intended uses. Cryptographic verification of the KEX signature does not establish peer identity: an attacker operating its own SSH server can always produce a valid signature with its own host key. Identity is established only when `check_server_key()` accepts that key or certificate. ### Expecte

Properties

Summary
russh kex_done: Shared-secret callback runs before server host-key verification
Severity
low
Nvd fetched at
2026-11-14T00:40:25.638091+00:00
Cvss score
3.7
Cvss severity
LOW
Retrieved at
2026-11-14T00:50:08+00:00
Ghsa published
2026-11-13T19:20:16Z
Source url
https://github.com/advisories/GHSA-9264-jvgf-6w2f
Ghsa updated
2026-11-13T19:20:17Z
Ghsa id
GHSA-9264-jvgf-6w2f
Last source
GitHub Advisory Database
Score
3.7
Cvss version
3.1
Cve id
CVE-2026-128087
Cvss vector
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N
First seen by Signal
2026-11-13T20:38:23+00:00
Is ghsa only
false
Vector
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N
Published at
2026-11-13T19:19:31.477
Last modified
2026-11-13T22:17:22.950

Related Entities (4)

HAS_WEAKNESS (2)

AFFECTS (1)

→[Software]rust/russh

VULNERABLE_TO (1)

←[Software]rust/russh

Related research

Explore deeper with Ninja Signal's threat intelligence graph

CVE-2026-128087 (CVSS v3.1 3.7) — Ninja Signal Threat Intelligence | Ninja Signal