Sceawere
Vulnerability Detail
CVE-2026-87045UPDATED Verified Sceawere Triage Sources: NVD / CISA KEV
HTTP/2 Server Null Pointer Dereference
Vulnerability Metadata
- Severity
- High
- Score / CVSS
- 7.5
- Creation Date
- 1d ago
- Vendor
- zephyrproject
- Product
- zephyr
- Attack Type
- memory-safety
- Vector String
- CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
- Attack Complexity
- LOW
Narrative and Response
Description
The HTTP/2 server in subsys/net/lib/http/http_server_http2.c clears the connection's stream binding at the start of every frame. handle_http_frame_header() executed client->current_stream = NULL unconditionally, but a CONTINUATION frame does not open a new stream and enter_http_frame_continuation_state() never re-bound one, so the rest of the header block was processed with client->current_stream unset. Two paths then write through the NULL pointer. A request for an unregistered resource, or a method the matched resource does not support, is answered by send_http2_404() or send_http2_405(), and both call send_headers_frame(), which unconditionally sets client->current_stream->headers_sent = true. A POST, PUT or PATCH to a registered dynamic resource reaches handle_http2_dynamic_resource(), which unlike its siblings (handle_http2_static_resource(), dynamic_get_del_opts_req_v2(), dynamic_post_put_req_v2()) had no client->current_stream == NULL guard, and stores through the pointer with client->current_stream->current_detail = dynamic_detail. Any peer that can reach the server can trigger this without authentication or prior state. A single stray CONTINUATION frame with END_HEADERS set, sent right after the client preface and requesting any unregistered path, is enough, because nothing rejected a CONTINUATION that no HEADERS frame had opened. A legitimate split header block (a HEADERS frame with END_HEADERS clear whose payload ends on a header-field boundary, then a CONTINUATION with END_HEADERS set) reaches the same state. The in-tree test test_http2_post_headers_with_continuation() did not catch this because it splits the header block mid field, which takes the handle_incomplete_http_header() shortcut that keeps the stream bound. The result is a write to a fixed low address (a small offset into struct http2_stream_ctx), which faults on mainstream targets (flash/vector-table region on Cortex-M, or a trap under MPU/MMU null-pointer detection), and the default fatal-error handler halts the system. Impact is an unauthenticated, remotely triggerable denial of service against any device running the HTTP/2 server: the 404 path needs no particular resource to be registered, and HTTP/2 is built into CONFIG_HTTP_SERVER with cleartext h2c accepted, so TLS does not prevent it. Neither the target address nor the written value is attacker-controlled, so there is no confidentiality or integrity impact. Applications built without CONFIG_HTTP_SERVER are not affected.
Executive Summary
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Technical Details
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Mitigations
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
References
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Additional Metadata
{
"score": "7.5",
"pubDate": "2026-11-06T15:17:26.850Z",
"pubdate": "2026-11-06T15:17:26.850Z",
"executiveSummary": "A critical null pointer dereference vulnerability exists in the HTTP/2 server implementation within the Zephyr Project network stack. The flaw originates from the improper management of stream bindings during the processing of HTTP/2 CONTINUATION frames.\nAn unauthenticated, remote attacker can trigger this vulnerability by sending a maliciously crafted sequence of HTTP/2 frames, specifically utilizing CONTINUATION frames to circumvent stream state binding.\nSuccessful exploitation results in a forced system halt, leading to a complete Denial of Service (DoS). The vulnerability affects systems configured with the integrated HTTP/2 server (CONFIG_HTTP_SERVER) regardless of TLS enablement.\nThere is no impact on data confidentiality or integrity, as the exploit does not allow for arbitrary code execution or attacker-controlled data injection; it is strictly a crash-inducing vulnerability.\nThe risk is elevated due to the requirement for zero authentication and the ability to trigger the crash from any network peer capable of reaching the HTTP/2 server.",
"technicalDetails": "The root cause is a logic error in subsys/net/lib/http/http_server_http2.c where the HTTP/2 frame handler, handle_http_frame_header(), unconditionally clears the connection's stream binding (client->current_stream = NULL) at the start of every frame.\nThe CONTINUATION frame handler, enter_http_frame_continuation_state(), fails to re-bind the current stream context. Consequently, subsequent processing of the header block occurs with a NULL stream pointer.\nTwo primary execution paths lead to a NULL pointer dereference: 1) Error handling paths (send_http2_404() and send_http2_405()) attempt to access client->current_stream->headers_sent when returning status codes for invalid resources. 2) Valid requests for dynamic resources routed to handle_http2_dynamic_resource() attempt to write to client->current_stream->current_detail without prior validation.\nAn attacker can exploit this by sending a stray CONTINUATION frame with the END_HEADERS flag set immediately following the client preface. Because the server does not enforce that a CONTINUATION frame must follow an active HEADERS frame in the same stream context, the server proceeds to process the frame using an unset stream context.\nAlternatively, a legitimate split header block that satisfies the protocol requirements can still lead to the fault if the state machine transitions into a path that does not properly validate the stream pointer. The existing test case, test_http2_post_headers_with_continuation(), fails to detect this because it splits header fields such that the internal handle_incomplete_http_header() logic is triggered, which inadvertently maintains the correct stream binding.\nThe resulting dereference attempts to write to or read from a small offset into a NULL-based struct http2_stream_ctx. On common embedded architectures such as Cortex-M, this memory region typically corresponds to the vector table or restricted flash, triggering a hard fault. On systems with an MPU or MMU, this results in a memory access violation. The system's default fatal-error handler subsequently halts the system to prevent undefined behavior, effectively creating a Denial of Service."
}