curl 8.23.0 closed one of the most severe vulnerabilities in recent years, rated HIGH and assigned CVE-2026-92392 (HTTP/2 upload Use-After-Free). The flaw allows a malicious server to trigger remote code execution under specific conditions during data uploads over HTTP/2.
Use-after-free is a classic memory-safety issue in languages without guarantees such as C. A pointer remains valid after the referenced memory has been freed, and an attacker who can control the contents of that memory region can alter program behavior.
HTTP/2 multiplexing requires libcurl to manage multiple concurrent transfers over a single connection. Each transfer uses an easy handle created by the application; a multi handle coordinates any number of easy handles.
To trigger the bug, the client must upload data to an HTTPS server that supports HTTP/2. The server pauses the upload by zeroing the flow-control window, sends a partial response, then resets the stream. libcurl correctly finishes the transfer but leaves a dangling pointer to the easy handle. When the application later frees the handle and closes the multi handle, libcurl reuses the stale pointer while processing incoming data.
The library allocates a receive buffer, reads attacker-controlled data into the former location of the easy handle, and eventually calls a function pointer that has been overwritten by the downloaded payload, resulting in arbitrary code execution. The attack also leaks internal client details that help bypass ASLR.
Successful exploitation demands many conditions: the victim must upload roughly 135 KB, the attacker must know the target architecture and memory layout, and specific allocation patterns involving nghttp2 and OpenSSL TLS 1.3 must align. The payload area is limited to about 23 bytes, making a crash far more likely than code execution.
The vulnerability was reported by Luna Tong of Anthropic via their OSS Scanner. The curl security team confirmed it within hours on 15 September and shortened the release cycle from eight to six weeks to ship the fix promptly.
Developers are reducing the number of internal pointers to handles, replacing them with transfer identifiers that are looked up on demand. Additional tests and static analyzers are being introduced to catch similar errors earlier.


