{"id":"CVE-2026-116774","kind":"vulnerability","aliases":["CVE-2026-116774"],"related":[],"title":"russh: zero maximum packet size strands SSH channel writes forever","description":"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.","summary":"russh, a Rust SSH client and server library, accepts a zero maximum_packet_size when a channel opens, from version 0.60.0 through 0.65.0. Channel writes then wait forever, so an authenticated peer or a malicious server can pile up stuck tasks and connections without any error.","severity":"medium","cvss":4.3,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["package","russh","rust","self-hosted","ssh"],"not_affected_if":["russh-0.65.0-or-later","russh-below-0.60.0"],"how_to_check":"- Run `cargo tree -i russh` in the project to find the russh version in use\n- Check Cargo.lock for a `russh` entry between `0.60.0` and `0.64.x`","fix":"- Upgrade the russh crate to `0.65.0` or later with `cargo update -p russh`","status":"open","published_at":"2026-10-27T21:18:05+00:00","first_seen_at":"2026-10-27T21:29:21+00:00","triaged_at":"2026-10-27T21:30:22+00:00","updated_at":"2026-10-27T21:30:22+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-10-27T21:30:22Z","model":"claude-haiku-5-5","output":{"fix":"- Upgrade the russh crate to `0.65.0` or later with `cargo update -p russh`","reach":"network","title":"russh: zero maximum packet size strands SSH channel writes forever","impact":"low","summary":"russh, a Rust SSH client and server library, accepts a zero maximum_packet_size when a channel opens, from version 0.60.0 through 0.65.0. Channel writes then wait forever, so an authenticated peer or a malicious server can pile up stuck tasks and connections without any error.","category":"package","nicknames":[],"who_cares":["rust","ssh","russh","self-hosted"],"confidence":0.8,"needs_auth":"yes","worst_case":"Stuck tasks and connections pile up until the service stops responding","analyst_note":"","how_to_check":"- Run `cargo tree -i russh` in the project to find the russh version in use\n- Check Cargo.lock for a `russh` entry between `0.60.0` and `0.64.x`","needs_analyst":false,"not_affected_if":["russh-below-0.60.0","russh-0.65.0-or-later"],"who_is_affected":"Applications that embed russh 0.60.0 through 0.64.x as an SSH client or server and write data over channels are exposed. A server that accepts SSH connections from authenticated users is the most likely place for a client to trigger the stall, and a client talking to an untrusted server can be stalled by that server. Teams that do not use russh, or run a patched 0.65.0 or later build, can skip it.","user_interaction":"no","needs_special_setup":"no","severity_if_unknown":"medium"},"cost_usd":0.000622,"input_tokens":3460,"output_tokens":552,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-116774':13A,16A '-2026':12A,15A '0.60.0':44B,87C '0.65.0':46B,89C,180C 'accept':32B,94C 'accumul':169C 'adjust':139C 'affect':163C 'agent':83C 'allow':162C 'asynchron':123C 'authent':54B,148C 'calcul':127C 'cannot':140C 'channel':8A,40B,47B,91C,114C,116C,120C,165C 'channel-open':90C 'channeltx':108C 'client':28B,75C,149C,160C 'connect':66B,167C 'cve':11A,14A 'data':115C 'declar':98C 'error':69B,173C 'fix':177C 'forev':10A,51B,136C 'host':22B 'implement':85C 'includ':80C 'issu':175C 'librari':31B,78C 'make':117C 'malici':58B,156C 'maximum':3A,35B,99C,146C 'open':41B,92C 'packag':17B 'packet':4A,36B,100C,145C 'pars':93C 'pass':105C 'path':125C 'peer':55B,97C 'peer-declar':96C 'pend':135C 'pile':61B 'poll':109C 'protocol':84C 'remain':134C 'russh':1A,18B,24B,70C 'russh/src/channels/io/tx.rs':112C 'rust':19B,26B,73C 'satisfi':141C 'self':21B 'self-host':20B 'server':30B,59B,77C,152C,157C 'size':5A,37B,101C,130C 'ssh':7A,23B,27B,74C,82C 'static':143C 'strand':6A,151C,159C 'stream':122C 'stuck':63B 'surfac':171C 'task':64B,164C 'version':43B,179C 'wait':50B 'window':138C 'without':67B,170C 'writabl':110C,129C 'write':9A,48B,124C,153C,161C 'writer':118C 'zero':2A,34B,103C,132C,144C","nicknames":[],"mitigations":[],"who_affected":"Applications that embed russh 0.60.0 through 0.64.x as an SSH client or server and write data over channels are exposed. A server that accepts SSH connections from authenticated users is the most likely place for a client to trigger the stall, and a client talking to an untrusted server can be stalled by that server. Teams that do not use russh, or run a patched 0.65.0 or later build, can skip it.","tier":"C","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-27T21:18:05+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:L","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-116774","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-116774","severity":null,"published_at":"2026-10-27T21:18:05+00:00","modified_at":"2026-10-27T21:18:06+00:00","first_seen_at":"2026-10-27T21:29:21+00:00","fetched_at":"2026-10-27T21:29:21+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}