Skip to content

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.

REPRO-2026-00186 libssh2 · c Jun 25, 2026 CVE entry ↗ .txt
Severity
CRITICAL
CVSS
9.2
Confidence
HIGH
Reproduced in
11m 23s
Tool calls
115
Spend
$0.30
01 · Overview

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).

02 · Severity & CVSS

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 threat level
9.2 / 10 CVSS base
Weakness CWE-680

Critical — the most severe class — typically remotely exploitable with severe impact. Treat as an emergency.

03 · Affected Versions

Affected libssh2 Versions

libssh2 · c versions through 1.11.1 are affected.

How to Reproduce CVE-2026-55200

$ pruva-verify REPRO-2026-00186
or 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
Run in a VM or disposable container. This exploits a real vulnerability.
06 · Proof of Reproduction

Proof of Reproduction for CVE-2026-55200

Memory corruption — reproduced
  • reached the target end-to-end
  • crash observed
  • on the real production code path
  • high confidence
  • the upstream fix blocks the same trigger
Trigger

malicious SSH peer bytes over localhost TCP

Attack chain
  1. curl SFTP-over-SSH session to malicious peer; malformed encrypted packet_length=0xfffffff0 after authentication and SFTP subsystem setup
How the agent worked 291 events · 115 tool calls · 11 min
11 minDuration
115Tool calls
120Reasoning steps
291Events
3Dead-ends
Agent activity over 11 min
Support
14
Repro
45
Judge
38
Variant
190
0:0011:23

Root Cause and Exploit Chain for CVE-2026-55200

Versions: component: libssh2 SSH transport / packet handling as exercised through curl's SFTP-over-SSH client path
  • Affected versions: vulnerable libssh2 commit 39cd3a82c7e07a08c1e218b91e69fd92d4f35ca3 and earlier; fixed at commit 97acf3dfda80c91c3a8c9f2372546301d4a1a7a8
  • 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

  1. Run bundle/repro/reproduction_steps.sh.
  2. 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.
  3. The vulnerable curl binary is executed twice and crashes with SIGSEGV each time. The fixed curl binary is executed twice and exits cleanly without the crash.
  4. 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.log
  • bundle/logs/curl-vulnerable-run1.server.log
  • bundle/logs/curl-vulnerable-run1.loader.log
  • bundle/logs/curl-vulnerable-run2.server.log
  • bundle/logs/curl-vulnerable-run2.loader.log
  • bundle/logs/curl-fixed-run1.server.log
  • bundle/logs/curl-fixed-run1.loader.log
  • bundle/logs/curl-fixed-run2.server.log
  • bundle/logs/curl-fixed-run2.loader.log
  • bundle/logs/curl-vulnerable-ldd.log
  • bundle/logs/curl-fixed-ldd.log
  • bundle/logs/curl-vulnerable-readelf.log
  • bundle/logs/curl-fixed-readelf.log
  • bundle/logs/curl-vulnerable-version.log
  • bundle/logs/curl-fixed-version.log
  • bundle/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 code 139
  • fixed runs: return code 2 without 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 97acf3dfda80c91c3a8c9f2372546301d4a1a7a8 or 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.

Event 1/40
0:001:48
0:00
session startedgpt-5.4-mini · GHSA-R8MH-X5QV-7GG2 · REPRO-20
0:05
0:06
web search
0:12
0:13
0:14
0:24
0:24
0:24
0:24
extract_facts
no facts extracted
0:25
0:25
supportrepro
0:30
0:30
0:33
0:33
0:39
0:39
0:39
0:46
0:46
0:53
1:01
1:06
$bash /bundle/repro/reproduction_steps.sh
5.1s
{"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]
1:31
1:36
$bash /bundle/repro/reproduction_steps.sh
4.9s
{"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]
1:48
1:48

Artifacts and Evidence for CVE-2026-55200

Scripts, logs, diffs, and output captured during the reproduction.

bundle/repro/curl-vulnerable-run2.reached0.0 KB
bundle/repro/curl-vulnerable-run1.hostpubsha2560.0 KB
bundle/repro/curl-fixed-run2.hostpubsha2560.0 KB
bundle/repro/curl-fixed-run2.crash0.0 KB
bundle/repro/curl-vulnerable-run1.ready0.0 KB
bundle/repro/malicious_asyncssh_peer.py4.0 KB
bundle/repro/runtime_manifest.json1.2 KB
bundle/repro/curl-fixed-run1.exitcode0.0 KB
bundle/repro/curl-vulnerable-run2.exitcode0.0 KB
bundle/repro/curl-fixed-run1.hostpubsha2560.0 KB
bundle/repro/curl-fixed-run2.exitcode0.0 KB
bundle/repro/curl-fixed-run2.ready0.0 KB
bundle/repro/curl-vulnerable-run1.exitcode0.0 KB
bundle/repro/curl-fixed-run1.crash0.0 KB
bundle/repro/curl-fixed-run2.reached0.0 KB
bundle/repro/curl-vulnerable-run2.crash0.0 KB
bundle/repro/curl-vulnerable-run2.hostpubsha2560.0 KB
bundle/repro/curl-fixed-run1.ready0.0 KB
bundle/repro/curl-vulnerable-run2.ready0.0 KB
bundle/repro/curl-vulnerable-run1.reached0.0 KB
bundle/repro/curl-vulnerable-run1.crash0.0 KB
bundle/repro/curl-fixed-run1.reached0.0 KB
bundle/repro/validation_verdict.json0.7 KB
bundle/ticket.json4.2 KB
bundle/project_cache_context.json4.2 KB
bundle/ticket.md3.8 KB
bundle/logs/reference.latest_attempt.proof_carry_manifest.json0.5 KB
bundle/logs/curl-fixed-ldd.log0.5 KB
bundle/logs/reference.latest_confirmed.proof_carry_manifest.json1.9 KB
bundle/logs/curl-vulnerable-run1.summary0.6 KB
bundle/logs/curl-vulnerable-run1.server.log0.8 KB
bundle/logs/product-verdict.log0.2 KB
bundle/logs/curl-vulnerable-run1.client.log0.0 KB
bundle/logs/curl-fixed-readelf.log1.9 KB
bundle/logs/product/vuln_libdir_resolved.txt0.1 KB
bundle/logs/product/fixed_curl_resolved.txt0.1 KB
bundle/logs/product/vuln_curl_resolved.txt0.1 KB
bundle/logs/product/fixed_libdir_resolved.txt0.1 KB
bundle/logs/product-file-identification.log0.6 KB
bundle/logs/curl-fixed-run1.loader.log12.3 KB
bundle/logs/curl-vulnerable-readelf.log1.9 KB
bundle/logs/curl-fixed-run2.client.log0.0 KB
bundle/logs/curl-fixed-run1.client.log0.0 KB
bundle/logs/curl-vulnerable-run2.server.log0.8 KB
bundle/logs/curl-fixed-run2.loader.log12.3 KB
bundle/logs/curl-vulnerable-run2.client.log0.0 KB
bundle/logs/curl-fixed-run1.summary0.6 KB
bundle/logs/curl-fixed-version.log0.3 KB
bundle/logs/curl-fixed-run2.server.log0.7 KB
bundle/logs/curl-vulnerable-ldd.log0.5 KB
bundle/logs/curl-fixed-run1.server.log0.7 KB
bundle/logs/curl-vulnerable-run1.loader.log10.7 KB
bundle/logs/reproduction_steps.log6.3 KB
bundle/logs/curl-fixed-run2.summary0.6 KB
bundle/logs/curl-vulnerable-run2.loader.log10.7 KB
bundle/logs/curl-vulnerable-version.log0.3 KB
bundle/logs/curl-vulnerable-run2.summary0.6 KB
bundle/repro/reproduction_steps.sh16.1 KB
bundle/repro/rca_report.md4.6 KB
08 · How to Fix

How to Fix CVE-2026-55200

Upgrade libssh2 · c to 97acf3dfda80c91c3a8c9f2372546301d4a1a7a8 or later.

Coming soon

Step-by-step mitigation and hardening guidance for CVE-2026-55200 — configuration checks, workarounds where no patch exists, and how to verify you're protected — is on the way.

10 · FAQ

FAQ: CVE-2026-55200

How does the CVE-2026-55200 crash reproduction work?

A malicious localhost SSH peer (an AsyncSSH server) completes authentication and SFTP subsystem setup with a real curl SFTP client, then sends an encrypted packet with 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?

libssh2 through 1.11.1 is affected; fixed in commit 97acf3dfda80c91c3a8c9f2372546301d4a1a7a8, which rejects the same malformed packet.

How severe is CVE-2026-55200?

Critical severity, CVSS 9.2.

How can I reproduce CVE-2026-55200?

Download the verified script and run it in an isolated environment; it drives a real curl SFTP client against a malicious AsyncSSH-based peer that sends the malformed 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.
11 · References

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.