{"id":"CVE-2026-46702","kind":"vulnerability","aliases":["CVE-2026-46702","GHSA-wwx6-x28x-8259"],"related":[],"title":"russh: Post-decompression SSH packet size was not bounded, allowing remote oversized compressed packets","description":"### Summary\n\nWhen SSH compression is enabled, `russh` accepted compressed packets whose on-wire size passed the normal transport packet-length checks but whose decompressed size was much larger. This allowed a remote peer to send oversized post-decompression packets that should have been rejected.\n\nIn current releases, this is a remote denial-of-service / resource-exhaustion issue in the post-decompression receive path.\n\nIn older releases before `0.58.0`, the same remote decompression path used `CryptoVec`, which appears to make the historical impact worse.\n\n### Details\n\nThe normal SSH transport read path enforces a packet-length limit before the packet body is read:\n\n- `russh/src/cipher/mod.rs`\n\nHowever, RFC 4253 compression is applied to the SSH `payload` field only. The `packet_length` field and MAC are computed over the compressed payload, so a packet that is reasonably sized on the wire can still expand to a much larger message body after decompression.\n\nIn `russh`, compressed packet bodies are later decompressed in:\n\n- `russh/src/compression.rs`\n- `russh/src/client/mod.rs`\n- `russh/src/server/session.rs`\n\nBefore the fix, `Decompress::decompress()` grew its output buffer by repeated doubling and did not enforce a separate post-decompression ceiling. That meant a peer could send a small compressed packet that passed the normal on-wire transport length checks and then inflate it into a much larger packet after decompression.\n\nIt was verified that an attacker-crafted compressed payload can stay below the normal `256 KiB` implementation transport packet cap while still inflating above the intended post-decompression bound. In other words, this is not only a \"large on-wire packet\" issue.\n\nVersion detail:\n\n- The underlying post-decompression bounds bug appears to affect `russh` as far back as `0.34.0`.\n- In historical releases `>= 0.34.0, < 0.58.0`, the remote decompression path still used `CryptoVec`. Remote compressed SSH traffic could drive that path, and under constrained memory that historical code path could abort the process.\n- In current-style releases `>= 0.58.0`, non-secret packet/decompression buffers were moved off `CryptoVec` and onto `Vec<u8>`, but the post-decompression size still remained unbounded. So the bug class remained reachable remotely, but the maintained-line impact is a current remote DoS / oversized-packet-acceptance issue rather than the older `CryptoVec`-based abort story.\n- The maintained-line fix was verified against `0.60.2`.\n\nCompression is not selected in a default-vs-default `russh` session because the default preference order puts `none` first. However, the default server configuration still advertises `zlib` and `zlib@openssh.com`, and server-side negotiation follows the client's preference order for common algorithms. A client that prefers compression can therefore negotiate it with a default `russh` server.\n\nOpenSSH portable was checked at `/home/mjc/projects/openssh-portable` commit `45b30e0a5`. OpenSSH enforces a `256 KiB` transport packet cap before decompression, but it does not reuse that cap after decompression. Instead, decompression writes to an `sshbuf`, which is indirectly bounded by OpenSSH's `SSHBUF_SIZE_MAX` hard maximum of `0x8000000` bytes (`128 MiB`).\n\nThe patch direction should follow that model: add an explicit post-decompression ceiling of `128 MiB`, rather than assuming the compressed transport packet cap also bounds decompressed payload size.\n\nRelevant OpenSSH reference points:\n\n- `/home/mjc/projects/openssh-portable/packet.c`: `PACKET_MAX_SIZE (256 * 1024)`\n- `/home/mjc/projects/openssh-portable/packet.c`: `uncompress_buffer()` inflates into `compression_buffer`\n- `/home/mjc/projects/openssh-portable/sshbuf.h`: `SSHBUF_SIZE_MAX 0x8000000`\n\n### RFC / OpenSSH Comparison\n\nRFC 4253 section 6 defines the binary packet format:\n\n- `packet_length`\n- `padding_length`\n- `payload`\n- random padding\n- MAC\n\nRFC 4253 section 6.2 says that, when compression is negotiated, the `payload` field is compressed, and that `packet_length` and MAC are computed from the compressed payload. The RFC also says implementations should check that packet length is reasonable to avoid denial-of-service and buffer-overflow attacks.\n\nThat means the pre-decompression transport packet length check is necessary but not sufficient. A correct implementation still needs a reasonable bound on the decompressed payload that becomes parser input.\n\nOpenSSH provides such a bound indirectly through `sshbuf`'s hard maximum. The `russh` fix should make the corresponding post-decompression bound explicit.\n\n### PoC\n\nThere were two kinds of proof:\n\n- a wire-cap sanity test showing an attacker-crafted best-compressed `DEBUG` payload can stay below the normal SSH transport packet cap while still inflating beyond the intended post-decompression bound\n- direct client and server receive-path tests that exercise the oversized post-decompression behavior itself\n\nThe current in-tree regression tests are:\n\n- `tests::compress::oversized_debug_payload_can_stay_below_wire_cap`\n- `compression::tests::oversized_decompressed_packet_is_rejected`\n- `client::tests::compressed_debug_is_ignored_after_client_parses_it`\n- `client::tests::oversized_compressed_debug_is_rejected_before_client_ignores_it`\n- `server::session::tests::compressed_debug_is_ignored_after_server_parses_it`\n- `server::session::tests::oversized_compressed_debug_is_rejected_before_server_ignores_it`\n\nThe important behavior is:\n\n1. An attacker-crafted best-compressed `DEBUG` payload can stay below the normal `256 KiB` transport packet cap while still inflating beyond `128 MiB`.\n2. In the direct client and server receive paths, small compressed `DEBUG` packets are still ignored normally after parsing.\n3. In the direct client and server receive paths, oversized compressed `DEBUG` packets are rejected before the implementation reaches the normal \"ignore DEBUG\" behavior.\n\nThe strongest PoC for severity is the unauthenticated server-side case. A malicious client can choose `zlib` in the initial key exchange, because the default server advertises it and server-side negotiation follows the client's preference order for common algorithms. After `NEWKEYS`, but before authentication, the client can send a transport-layer `SSH_MSG_DEBUG` packet whose compressed body is below the transport packet cap but whose decompressed body exceeds the post-decompression cap.\n\nThat demonstrates the `AV:N/AC:L/PR:N/UI:N` case directly: the attacker is a remote SSH client and does not need a successfully authenticated session.\n\n```rust\nfn compressed_debug_payload(payload_len: usize) -> Vec<u8> {\n    let mut payload = vec![b'A'; payload_len];\n    payload[0] = crate::msg::DEBUG;\n\n    let mut encoder =\n        flate2::write::ZlibEncoder::new(Vec::new(), flate2::Compression::best());\n    encoder.write_all(&payload).unwrap();\n    let compressed = encoder.finish().unwrap();\n\n    assert!(\n        compressed.len() < 256 * 1024,\n        \"oversized post-decompression payload still fits under the wire cap\"\n    );\n    compressed\n}\n\nfn incoming_packet(compressed: Vec<u8>) -> SSHBuffer {\n    let mut buffer = SSHBuffer::new();\n    // maybe_decompress() receives the clear SSHBuffer after packet framing,\n    // and decompresses bytes after packet_length + padding_length.\n    buffer.buffer.extend_from_slice(&[0; 5]);\n    buffer.buffer.extend_from_slice(&compressed);\n    buffer\n}\n\n#[test]\nfn unauthenticated_client_zlib_debug_is_rejected_by_server_before_auth() {\n    let mut server = preauth_server_session_after_newkeys_with_zlib_decompressor();\n    let oversized = MAXIMUM_DECOMPRESSED_PACKET_LEN + 1024;\n    let buffer = incoming_packet(compressed_debug_payload(oversized));\n\n    let err = server.maybe_decompress(&buffer).unwrap_err();\n    assert!(\n        matches!(err, crate::Error::PacketSize(len) if len > MAXIMUM_DECOMPRESSED_PACKET_LEN)\n    );\n}\n```\n\nThe equivalent wire-level attack shape is:\n\n```text\n1. Connect to a russh server using the default compression advertisement.\n2. Send SSH_MSG_KEXINIT with compression client-to-server preference:\n   zlib,zlib@openssh.com,none\n3. Complete key exchange and send SSH_MSG_NEWKEYS.\n4. Before any SSH_MSG_USERAUTH_REQUEST, send a compressed SSH_MSG_DEBUG packet:\n   - compressed packet body: < 256 KiB\n   - decompressed packet body: > 128 MiB\n5. Vulnerable behavior: russh accepts and inflates the packet, then reaches the\n   normal DEBUG ignore path.\n6. Fixed behavior: russh rejects during decompression with Error::PacketSize.\n```\n\nThe direct receive-path client/server regression tests are still useful because they isolate the bug precisely. They construct the post-decryption compressed packet body passed to `maybe_decompress()` and prove that the oversized packet is rejected before normal `DEBUG` ignore handling. The server-side pre-auth variant above is the one that justifies the highest CVSS framing for this bug.\n\nThe most important targeted checks are:\n\n```bash\ncargo test -p russh oversized_debug_payload_can_stay_below_wire_cap -- --nocapture\ncargo test -p russh oversized_compressed_debug_is_rejected_before_client_ignores_it -- --nocapture\ncargo test -p russh oversized_compressed_debug_is_rejected_before_server_ignores_it -- --nocapture\n```\n\nBefore the fix, both the direct client and direct server receive-path oversized checks went red because the compressed payload was accepted and decompressed instead of being rejected at the post-decompression boundary. After the fix, they pass.\n\n### Impact\n\nSuggested CVSS v3.1 for current maintained releases:\n\n- `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H`\n- Score: `7.5`\n\nReasoning:\n\n- `AV:N`: reachable by a remote SSH peer\n- `AC:L`: straightforward once compression is enabled\n- `PR:N`, `UI:N`: no prior auth or user interaction required\n- `C:N`, `I:N`: confidentiality or integrity impact was not demonstrated\n- `A:H`: remote peer can cause oversized post-decompression packet processing and disconnect / denial of service\n\nAffected versions:\n\n- historical stronger case: `russh >= 0.34.0, < 0.58.0`\n- current maintained remote DoS case: `russh >= 0.58.0`, including `0.60.3`\n\n### Fix / Patch Direction\n\nAdd an explicit maximum decompressed SSH packet size and enforce it inside `Decompress::decompress()` before returning decompressed bytes to the client or server packet parser.\n\nThe intended ceiling is `128 MiB`, matching OpenSSH portable's effective `sshbuf` hard maximum for post-decompression packet storage. The fix should reject decompression output larger than that bound with a packet-size error before normal message dispatch.\n\nThe fix should preserve normal compressed packet behavior below the cap, including `DEBUG` packets that are decompressed and then ignored through the existing normal path.\n\nPatch branch:\n\n```text\nfix/zlib-decompression-cap\n```","summary":"russh, a Rust SSH library, did not cap the size of SSH packets after zlib decompression, so the limit only applied to the compressed form. A remote peer can send a small compressed packet that inflates far beyond the intended bound, exhausting resources and causing denial of service.","severity":"high","cvss":7.5,"epss":0.00268,"exploited":false,"exploited_at":null,"products":[{"name":"russh","fixed":["0.61.1"],"affected":">= 0.34.0, < 0.61.1","ecosystem":"cargo"}],"ecosystems":["cargo"],"tags":["cwe-770","package","russh","rust","ssh-client","ssh-server"],"not_affected_if":["compression-disabled","not-using-russh"],"how_to_check":"- Find the russh version in the lockfile: `grep -A1 'name = \"russh\"' Cargo.lock`\n- Affected if russh is `>= 0.34.0` and `< 0.61.1`\n- Exposed only if compression is negotiated: the server advertises `zlib` and `zlib@openssh.com` by default, and the client's preference order decides.","fix":"- russh: upgrade to `0.61.1`","status":"open","published_at":"2026-05-29T19:37:14+00:00","first_seen_at":"2026-11-10T19:45:05+00:00","triaged_at":"2026-11-10T20:05:07+00:00","updated_at":"2026-11-10T20:05:07+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-11-10T20:05:07Z","model":"claude-haiku-5-5","output":{"fix":"- russh: upgrade to `0.61.1`","reach":"internet","title":"russh: compressed SSH packets can inflate past size limit, remote DoS","impact":"medium","summary":"russh, a Rust SSH library, did not cap the size of SSH packets after zlib decompression, so the limit only applied to the compressed form. A remote peer can send a small compressed packet that inflates far beyond the intended bound, exhausting resources and causing denial of service.","audience":"developers","category":"package","nicknames":[],"who_cares":["russh","rust","ssh-server","ssh-client"],"confidence":0.8,"fix_status":"available","needs_auth":"no","worst_case":"remote peer exhausts memory and crashes the SSH service","analyst_note":"","how_to_check":"- Find the russh version in the lockfile: `grep -A1 'name = \"russh\"' Cargo.lock`\n- Affected if russh is `>= 0.34.0` and `< 0.61.1`\n- Exposed only if compression is negotiated: the server advertises `zlib` and `zlib@openssh.com` by default, and the client's preference order decides.","plain_action":"","product_name":"","needs_analyst":false,"not_affected_if":["compression-disabled","not-using-russh"],"who_is_affected":"Any application that embeds russh as an SSH server or client is exposed when zlib compression is negotiated. The default russh server advertises zlib, and server-side negotiation follows the client's preference order, so a remote client can choose it. Projects that do not depend on russh, or that never negotiate compression, can skip this.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"no","severity_if_unknown":"high"},"cost_usd":0.00181,"input_tokens":8652,"output_tokens":1889,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-2026':17A,25A '-46702':18A,26A '-770':29B '/home/mjc/projects/openssh-portable':531C '/home/mjc/projects/openssh-portable/packet.c':610C,616C '/home/mjc/projects/openssh-portable/sshbuf.h':623C '0.34.0':368C,372C '0.58.0':160C,373C,406C '0.60.2':467C '0x8000000':572C,627C '1024':615C '128':574C,591C '256':321C,537C,614C '4253':198C,632C,649C '45b30e0a5':533C '6':634C '6.2':651C '8259':23A 'abort':398C,457C 'accept':94C,449C 'add':583C 'advertis':494C 'affect':362C 'algorithm':511C 'allow':11A,118C 'also':601C 'appear':169C,360C 'appli':59B,201C 'assum':595C 'attack':312C 'attacker-craft':311C 'back':366C 'base':456C 'beyond':76B 'binari':637C 'bodi':192C,238C,245C 'bound':10A,79B,336C,358C,562C,602C 'buffer':261C,411C,618C,622C 'bug':359C,430C 'byte':573C 'cap':46B,326C,541C,550C,600C 'caus':83B 'ceil':274C,589C 'check':109C,294C,529C 'class':431C 'client':35B,505C,513C 'code':395C 'commit':532C 'common':510C 'comparison':630C 'compress':14A,62B,71B,90C,95C,199C,218C,243C,283C,314C,382C,468C,516C,597C,621C,655C 'comput':215C 'configur':492C 'constrain':391C 'could':279C,385C,397C 'craft':313C 'cryptovec':167C,380C,415C,455C 'current':135C,403C,443C 'current-styl':402C 'cve':16A,24A 'cwe':28B 'decompress':4A,54B,112C,127C,153C,164C,240C,248C,256C,257C,273C,305C,335C,357C,376C,423C,543C,552C,554C,588C,603C 'default':475C,477C,482C,490C,523C 'default-vs-default':474C 'defin':635C 'denial':84B,142C 'denial-of-servic':141C 'detail':176C,352C 'direct':578C 'dos':445C 'doubl':264C 'drive':386C 'enabl':92C 'enforc':183C,268C,535C 'exhaust':80B,147C 'expand':232C 'explicit':585C 'far':75B,365C 'field':206C,211C 'first':487C 'fix':255C,463C 'follow':503C,580C 'form':63B 'format':639C 'ghsa':20A 'ghsa-wwx6-x28x':19A 'grew':258C 'hard':569C 'histor':173C,370C,394C 'howev':196C,488C 'impact':174C,440C 'implement':323C 'indirect':561C 'inflat':74B,297C,329C,619C 'instead':553C 'intend':78B,332C 'issu':148C,350C,450C 'kib':322C,538C 'larg':345C 'larger':116C,236C,302C 'later':247C 'length':108C,187C,210C,293C,641C,643C 'librari':43B 'limit':57B,188C 'line':439C,462C 'mac':213C,647C 'maintain':438C,461C 'maintained-lin':437C,460C 'make':171C 'max':568C,612C,626C 'maximum':570C 'meant':276C 'memori':392C 'messag':237C 'mib':575C,592C 'model':582C 'move':413C 'much':115C,235C,301C 'negoti':502C,519C,657C 'non':408C 'non-secret':407C 'none':486C 'normal':104C,178C,288C,320C 'older':157C,454C 'on-wir':98C,289C,346C 'onto':417C 'openssh':526C,534C,564C,607C,629C 'order':484C,508C 'output':260C 'overs':13A,124C,447C 'oversized-packet-accept':446C 'packag':30B 'packet':6A,15A,51B,72B,96C,107C,128C,186C,191C,209C,222C,244C,284C,303C,325C,349C,448C,540C,599C,611C,638C,640C 'packet-length':106C,185C 'packet/decompression':410C 'pad':642C,646C 'pass':102C,286C 'patch':577C 'path':155C,165C,182C,377C,388C,396C 'payloa':659C 'payload':205C,219C,315C,604C,644C 'peer':66B,121C,278C 'point':609C 'portabl':527C 'post':3A,126C,152C,272C,334C,356C,422C,587C 'post-decompress':2A,125C,151C,271C,333C,355C,421C,586C 'prefer':483C,507C,515C 'process':400C 'put':485C 'random':645C 'rather':451C,593C 'reachabl':433C 'read':181C,194C 'reason':225C 'receiv':154C 'refer':608C 'reject':133C 'releas':136C,158C,371C,405C 'relev':606C 'remain':426C,432C 'remot':12A,65B,120C,140C,163C,375C,381C,434C,444C 'repeat':263C 'resourc':81B,146C 'resource-exhaust':145C 'reus':548C 'rfc':197C,628C,631C,648C 'russh':1A,27A,31B,39B,93C,242C,363C,478C,524C 'russh/src/cipher/mod.rs':195C 'russh/src/client/mod.rs':251C 'russh/src/compression.rs':250C 'russh/src/server/session.rs':252C 'rust':32B,41B 'say':652C 'secret':409C 'section':633C,650C 'select':471C 'send':68B,123C,280C 'separ':270C 'server':38B,491C,500C,525C 'server-sid':499C 'servic':86B,144C 'session':479C 'side':501C 'size':7A,48B,101C,113C,226C,424C,567C,605C,613C,625C 'small':70B,282C 'ssh':5A,34B,37B,42B,50B,89C,179C,204C,383C 'ssh-client':33B 'ssh-server':36B 'sshbuf':558C,566C,624C 'stay':317C 'still':231C,328C,378C,425C,493C 'stori':458C 'style':404C 'summari':87C 'therefor':518C 'traffic':384C 'transport':105C,180C,292C,324C,539C,598C 'unbound':427C 'uncompress':617C 'under':354C 'use':166C,379C 'vec':418C 'verifi':308C,465C 'version':351C 'vs':476C 'whose':97C,111C 'wire':100C,229C,291C,348C 'word':339C 'wors':175C 'write':555C 'wwx6':21A 'x28x':22A 'zlib':53B,495C 'zlib@openssh.com':497C","nicknames":[],"mitigations":[],"who_affected":"Any application that embeds russh as an SSH server or client is exposed when zlib compression is negotiated. The default russh server advertises zlib, and server-side negotiation follows the client's preference order, so a remote client can choose it. Projects that do not depend on russh, or that never negotiate compression, can skip this.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":["russh"],"ptokens":["russh"],"labels":["cargo","cwe770","high","package","russh","rust","sshclient","sshserver"],"campaign_type":null,"search_a":"'-2026':17A,25A '-46702':18A,26A '8259':23A 'allow':11A 'bound':10A 'compress':14A 'cve':16A,24A 'decompress':4A 'ghsa':20A 'ghsa-wwx6-x28x':19A 'overs':13A 'packet':6A,15A 'post':3A 'post-decompress':2A 'remot':12A 'russh':1A,27A 'size':7A 'ssh':5A 'wwx6':21A 'x28x':22A","search_b":"'-770':29B 'appli':59B 'beyond':76B 'bound':79B 'cap':46B 'caus':83B 'client':35B 'compress':62B,71B 'cwe':28B 'decompress':54B 'denial':84B 'exhaust':80B 'far':75B 'form':63B 'inflat':74B 'intend':78B 'librari':43B 'limit':57B 'packag':30B 'packet':51B,72B 'peer':66B 'remot':65B 'resourc':81B 'russh':31B,39B 'rust':32B,41B 'send':68B 'server':38B 'servic':86B 'size':48B 'small':70B 'ssh':34B,37B,42B,50B 'ssh-client':33B 'ssh-server':36B 'zlib':53B","search_c":"'/home/mjc/projects/openssh-portable':531C '/home/mjc/projects/openssh-portable/packet.c':610C,616C '/home/mjc/projects/openssh-portable/sshbuf.h':623C '0.34.0':368C,372C '0.58.0':160C,373C,406C '0.60.2':467C '0x8000000':572C,627C '1024':615C '128':574C,591C '256':321C,537C,614C '4253':198C,632C,649C '45b30e0a5':533C '6':634C '6.2':651C 'abort':398C,457C 'accept':94C,449C 'add':583C 'advertis':494C 'affect':362C 'algorithm':511C 'allow':118C 'also':601C 'appear':169C,360C 'appli':201C 'assum':595C 'attack':312C 'attacker-craft':311C 'back':366C 'base':456C 'binari':637C 'bodi':192C,238C,245C 'bound':336C,358C,562C,602C 'buffer':261C,411C,618C,622C 'bug':359C,430C 'byte':573C 'cap':326C,541C,550C,600C 'ceil':274C,589C 'check':109C,294C,529C 'class':431C 'client':505C,513C 'code':395C 'commit':532C 'common':510C 'comparison':630C 'compress':90C,95C,199C,218C,243C,283C,314C,382C,468C,516C,597C,621C,655C 'comput':215C 'configur':492C 'constrain':391C 'could':279C,385C,397C 'craft':313C 'cryptovec':167C,380C,415C,455C 'current':135C,403C,443C 'current-styl':402C 'decompress':112C,127C,153C,164C,240C,248C,256C,257C,273C,305C,335C,357C,376C,423C,543C,552C,554C,588C,603C 'default':475C,477C,482C,490C,523C 'default-vs-default':474C 'defin':635C 'denial':142C 'denial-of-servic':141C 'detail':176C,352C 'direct':578C 'dos':445C 'doubl':264C 'drive':386C 'enabl':92C 'enforc':183C,268C,535C 'exhaust':147C 'expand':232C 'explicit':585C 'far':365C 'field':206C,211C 'first':487C 'fix':255C,463C 'follow':503C,580C 'format':639C 'grew':258C 'hard':569C 'histor':173C,370C,394C 'howev':196C,488C 'impact':174C,440C 'implement':323C 'indirect':561C 'inflat':297C,329C,619C 'instead':553C 'intend':332C 'issu':148C,350C,450C 'kib':322C,538C 'larg':345C 'larger':116C,236C,302C 'later':247C 'length':108C,187C,210C,293C,641C,643C 'limit':188C 'line':439C,462C 'mac':213C,647C 'maintain':438C,461C 'maintained-lin':437C,460C 'make':171C 'max':568C,612C,626C 'maximum':570C 'meant':276C 'memori':392C 'messag':237C 'mib':575C,592C 'model':582C 'move':413C 'much':115C,235C,301C 'negoti':502C,519C,657C 'non':408C 'non-secret':407C 'none':486C 'normal':104C,178C,288C,320C 'older':157C,454C 'on-wir':98C,289C,346C 'onto':417C 'openssh':526C,534C,564C,607C,629C 'order':484C,508C 'output':260C 'overs':124C,447C 'oversized-packet-accept':446C 'packet':96C,107C,128C,186C,191C,209C,222C,244C,284C,303C,325C,349C,448C,540C,599C,611C,638C,640C 'packet-length':106C,185C 'packet/decompression':410C 'pad':642C,646C 'pass':102C,286C 'patch':577C 'path':155C,165C,182C,377C,388C,396C 'payloa':659C 'payload':205C,219C,315C,604C,644C 'peer':121C,278C 'point':609C 'portabl':527C 'post':126C,152C,272C,334C,356C,422C,587C 'post-decompress':125C,151C,271C,333C,355C,421C,586C 'prefer':483C,507C,515C 'process':400C 'put':485C 'random':645C 'rather':451C,593C 'reachabl':433C 'read':181C,194C 'reason':225C 'receiv':154C 'refer':608C 'reject':133C 'releas':136C,158C,371C,405C 'relev':606C 'remain':426C,432C 'remot':120C,140C,163C,375C,381C,434C,444C 'repeat':263C 'resourc':146C 'resource-exhaust':145C 'reus':548C 'rfc':197C,628C,631C,648C 'russh':93C,242C,363C,478C,524C 'russh/src/cipher/mod.rs':195C 'russh/src/client/mod.rs':251C 'russh/src/compression.rs':250C 'russh/src/server/session.rs':252C 'say':652C 'secret':409C 'section':633C,650C 'select':471C 'send':123C,280C 'separ':270C 'server':491C,500C,525C 'server-sid':499C 'servic':144C 'session':479C 'side':501C 'size':101C,113C,226C,424C,567C,605C,613C,625C 'small':282C 'ssh':89C,179C,204C,383C 'sshbuf':558C,566C,624C 'stay':317C 'still':231C,328C,378C,425C,493C 'stori':458C 'style':404C 'summari':87C 'therefor':518C 'traffic':384C 'transport':105C,180C,292C,324C,539C,598C 'unbound':427C 'uncompress':617C 'under':354C 'use':166C,379C 'vec':418C 'verifi':308C,465C 'version':351C 'vs':476C 'whose':97C,111C 'wire':100C,229C,291C,348C 'word':339C 'wors':175C 'write':555C 'zlib':495C 'zlib@openssh.com':497C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-05-23T07:53:38+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","cvss_by":"GitHub","poc_count":0,"sources":[{"source":"ghsa","external_id":"GHSA-wwx6-x28x-8259","url":"https://github.com/advisories/GHSA-wwx6-x28x-8259","severity":"high","published_at":"2026-05-29T19:37:14+00:00","modified_at":"2026-11-10T19:45:00+00:00","first_seen_at":"2026-11-10T19:45:05+00:00","fetched_at":"2026-11-10T20:56:29+00:00","note":null},{"source":"nvd","external_id":"CVE-2026-46702","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-46702","severity":null,"published_at":"2026-06-10T22:17:00+00:00","modified_at":"2026-07-23T09:10:00+00:00","first_seen_at":"2026-11-10T20:15:32+00:00","fetched_at":"2026-11-10T20:15:32+00:00","note":null}],"documents":[{"id":117665,"url":"https://api.github.com/repos/Eugeny/russh/security-advisories/GHSA-wwx6-x28x-8259","title":"Maintainer's advisory: api.github.com","kind":"vendor","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"advisory","confidence":null,"note":"Maintainer's advisory: api.github.com"},{"id":117666,"url":"https://github.com/Eugeny/russh/security/advisories/GHSA-wwx6-x28x-8259","title":"Maintainer's advisory: github.com","kind":"vendor","source":"ghsa","publisher":"vendor","text":null,"published_at":"2026-05-23T07:53:38+00:00","relation":"advisory","confidence":null,"note":"Maintainer's advisory: github.com"},{"id":117667,"url":"https://github.com/Eugeny/russh/commit/2692a6f66edafaf63f463c412b45d8490f7ad06e","title":"Patch: github.com","kind":"other","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":117668,"url":"https://github.com/Eugeny/russh/releases/tag/v0.61.1","title":"Release: github.com","kind":"release","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Release: github.com"}],"disclosures":[],"exploit_sources":[{"type":"epss","score":0.00268,"url":"https://api.first.org/data/v1/epss?cve=CVE-2026-46702"}],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}