CVE-2026-55200: Verified Repro With Script Download
CVE-2026-55200: libssh2 via curl: malformed SSH packet length crashes SFTP client
CVE-2026-55200 is verified against libssh2 · c. Affected versions: through 1.11.1. Fixed in 97acf3dfda80c91c3a8c9f2372546301d4a1a7a8. This critical reproduction includes runnable sandbox proof, artifacts, and a plain-text agent view under REPRO-2026-00186.
What Is CVE-2026-55200?
CVE-2026-55200 (GHSA-R8MH-X5QV-7GG2) is a critical SSH transport packet-length validation flaw (CWE-680) in libssh2 through 1.11.1 that crashes clients such as curl's SFTP-over-SSH path when a malicious SSH server sends a malformed packet length. Pruva reproduced it (reproduction REPRO-2026-00186).
CVE-2026-55200 Severity & CVSS Score
CVE-2026-55200 is rated critical severity, with a CVSS base score of 9.2 out of 10.
Critical — the most severe class — typically remotely exploitable with severe impact. Treat as an emergency.
Affected libssh2 Versions
libssh2 · c versions through 1.11.1 are affected.
How to Reproduce CVE-2026-55200
pruva-verify REPRO-2026-00186 curl -O https://pruva.dev/api/v1/reproductions/REPRO-2026-00186/artifacts/bundle/repro/reproduction_steps.sh && chmod +x reproduction_steps.sh && ./reproduction_steps.sh Proof of Reproduction for CVE-2026-55200
- reached the target end-to-end
- crash observed
- on the real production code path
- high confidence
- the upstream fix blocks the same trigger
malicious SSH peer bytes over localhost TCP
- curl SFTP-over-SSH session to malicious peer; malformed encrypted packet_length=0xfffffff0 after authentication and SFTP subsystem setup
How the agent worked
Root Cause and Exploit Chain for CVE-2026-55200
- Affected versions: vulnerable libssh2 commit
39cd3a82c7e07a08c1e218b91e69fd92d4f35ca3and earlier; fixed at commit97acf3dfda80c91c3a8c9f2372546301d4a1a7a8 - Risk level: high, because attacker-controlled SSH peer bytes can trigger a process-level crash in a widely used CLI client path
- Consequence: denial of service of the curl process; in a broader deployment context, this could terminate automation jobs, batch transfers, or other client-side workflows that rely on curl + libssh2
Root Cause
The vulnerable path processes attacker-controlled SSH packet data after a real SSH handshake and channel/subsystem negotiation. In the reproduced scenario, the peer sends a malformed encrypted packet whose clear packet length is 0xfffffff0. The vulnerable build accepts the packet boundary conditions far enough into the libssh2 transport parser that the curl process hits a native segmentation fault.
The fixed commit 97acf3dfda80c91c3a8c9f2372546301d4a1a7a8 rejects or fails closed on the same traffic shape, so the product exits cleanly instead of crashing.
Reproduction Steps
- Run
bundle/repro/reproduction_steps.sh. - The script reuses the prepared project cache, identifies the real curl product binaries, verifies dynamic linkage to the vulnerable and fixed libssh2 prefixes, starts a localhost malicious SSH peer, and drives curl through its normal SFTP-over-SSH path.
- The vulnerable curl binary is executed twice and crashes with
SIGSEGVeach time. The fixed curl binary is executed twice and exits cleanly without the crash. - Expected evidence includes the SSH server logs showing TCP connection, authentication, SFTP subsystem negotiation, injection of the malformed encrypted packet, and curl loader/product logs showing the linked libssh2 path.
Evidence
Primary evidence is stored under bundle/logs/ and bundle/repro/:
bundle/logs/reproduction_steps.logbundle/logs/curl-vulnerable-run1.server.logbundle/logs/curl-vulnerable-run1.loader.logbundle/logs/curl-vulnerable-run2.server.logbundle/logs/curl-vulnerable-run2.loader.logbundle/logs/curl-fixed-run1.server.logbundle/logs/curl-fixed-run1.loader.logbundle/logs/curl-fixed-run2.server.logbundle/logs/curl-fixed-run2.loader.logbundle/logs/curl-vulnerable-ldd.logbundle/logs/curl-fixed-ldd.logbundle/logs/curl-vulnerable-readelf.logbundle/logs/curl-fixed-readelf.logbundle/logs/curl-vulnerable-version.logbundle/logs/curl-fixed-version.logbundle/repro/runtime_manifest.json
Key excerpts observed during execution:
- curl binary loaded vulnerable libssh2 from
.../libssh2-vuln-prefix/lib/libssh2.so.1 - curl binary loaded fixed libssh2 from
.../libssh2-fixed-prefix/lib/libssh2.so.1 - malicious peer log:
sent encrypted malformed packet seq=11 clear_packet_length=0xfffffff0 body_len=32 wire_len=52 - vulnerable runs:
Segmentation fault (core dumped)with return code139 - fixed runs: return code
2without the native crash
Environment details captured:
- product binary: 32-bit i386 curl
8.21.0-DEV - runtime stack:
curl,libssh2,asyncssh - entrypoint kind:
tcp_peer
Recommendations / Next Steps
- Apply the upstream fix at
97acf3dfda80c91c3a8c9f2372546301d4a1a7a8or upgrade to a release that includes it. - Rebuild curl and any other libssh2 consumers against the patched library.
- Add regression coverage for malformed encrypted SSH packets, especially around packet-length validation after authentication and subsystem negotiation.
- Keep a negative-control test that verifies the fixed build fails closed on the same packet shape without a native crash.
Additional Notes
- The reproduction script is idempotent enough for repeated execution; it was run twice consecutively and produced the same result.
- This proof is product-mode and non-sanitized; sanitizer output was not used as the primary success oracle.
- The exploit path is limited to a localhost SSH peer in this environment, but it exercises the real curl/libssh2 boundary and the real parser path.
CVE-2026-55200 Reproduction Transcript
The agent's step-by-step process — every tool call, every handoff, the moment the exploit fired.
Full session Replay every step — scrub the timeline or play it back.
bash /bundle/repro/reproduction_steps.sh{"cwd":"/bundle","duration_ms":5044,"exit_code":0,"stderr":"","stdout":"/data/pruva/project-cache/74f8a750-7647-4916-b031-ad3c29d96638/product-release-m32-v2/curl-vuln/src/curl: ELF 32-bit LSB pie executable, Intel i386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, BuildID[sha1]=f8a0a85a999bc3713d56cc5cee0d3328b56a1b0d, for GNU/Linux 3.2.0, not stripped\n/data/pruva/project-cache/74f8a750-7647-4916-b031-ad3c29d96638/product-release-m32-v2/curl-fixed/src/curl: ELF 32-bit LSB pie executable, Intel i386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, BuildID[sha1]=4f47f90ddc3359b9031594909ac55a772409273e, for GNU/Linux 3.2.0, not stripped\n\tlinux-gate.so.1 (0xf7f7d000)\n\tlibssl.so.3 => /usr/lib/i386-linux-gnu/libssl.so.3 (0xf7cee000)\n\tlibcrypto.so.3 => /usr/lib/i386-linux-gnu/libcrypto.so.3 (0xf77cc000)\n\tlibz.so.1 => /usr/lib/i386-linux-gnu/libz.so.1 (0xf77b0000)\n\tlibssh2.so.1 => /data/pruva/project-cache/74f8a750-7647-4916-b031-ad3c29d96638/product-release-m32-v2/libssh2-vuln-prefix/lib/libssh2.so.1 (0xf7757000)\n\tlibc.so.6 => /usr/lib/i386-linux-gnu/libc.so.6 (0xf750f000)\n\tlibzstd.so.1 => /usr/lib/i386-linux-gnu/libzstd.so.… [truncated]bash /bundle/repro/reproduction_steps.sh{"cwd":"/bundle","duration_ms":4929,"exit_code":0,"stderr":"","stdout":"/data/pruva/project-cache/74f8a750-7647-4916-b031-ad3c29d96638/product-release-m32-v2/curl-vuln/src/curl: ELF 32-bit LSB pie executable, Intel i386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, BuildID[sha1]=f8a0a85a999bc3713d56cc5cee0d3328b56a1b0d, for GNU/Linux 3.2.0, not stripped\n/data/pruva/project-cache/74f8a750-7647-4916-b031-ad3c29d96638/product-release-m32-v2/curl-fixed/src/curl: ELF 32-bit LSB pie executable, Intel i386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, BuildID[sha1]=4f47f90ddc3359b9031594909ac55a772409273e, for GNU/Linux 3.2.0, not stripped\n\tlinux-gate.so.1 (0xf7f15000)\n\tlibssl.so.3 => /usr/lib/i386-linux-gnu/libssl.so.3 (0xf7c86000)\n\tlibcrypto.so.3 => /usr/lib/i386-linux-gnu/libcrypto.so.3 (0xf7764000)\n\tlibz.so.1 => /usr/lib/i386-linux-gnu/libz.so.1 (0xf7748000)\n\tlibssh2.so.1 => /data/pruva/project-cache/74f8a750-7647-4916-b031-ad3c29d96638/product-release-m32-v2/libssh2-vuln-prefix/lib/libssh2.so.1 (0xf76ef000)\n\tlibc.so.6 => /usr/lib/i386-linux-gnu/libc.so.6 (0xf74a7000)\n\tlibzstd.so.1 => /usr/lib/i386-linux-gnu/libzstd.so.… [truncated]Artifacts and Evidence for CVE-2026-55200
Scripts, logs, diffs, and output captured during the reproduction.
How to Fix CVE-2026-55200
Upgrade libssh2 · c to 97acf3dfda80c91c3a8c9f2372546301d4a1a7a8 or later.
FAQ: CVE-2026-55200
How does the CVE-2026-55200 crash reproduction work?
packet_length=0xfffffff0; the vulnerable, non-sanitized curl/libssh2 build crashes with SIGSEGV (signal-derived exit code 139) on this input.Which libssh2 versions are affected by CVE-2026-55200, and where is it fixed?
97acf3dfda80c91c3a8c9f2372546301d4a1a7a8, which rejects the same malformed packet.How severe is CVE-2026-55200?
How can I reproduce CVE-2026-55200?
packet_length=0xfffffff0 packet, showing the vulnerable libssh2 build crash with SIGSEGV twice, while the build linked against the fixed commit exits cleanly with code 2 both times.References for CVE-2026-55200
Authoritative sources for CVE-2026-55200 — official vulnerability databases and the upstream advisory. Pruva's reproduction verifies the issue firsthand; these are the primary records to corroborate it.