CVE-2026-10655: Zephyr SNTP Race Condition DoS Vulnerability
A race condition in Zephyr's SNTP (Simple Network Time Protocol) client can cause a networking thread crash when the asynchronous socket close operation runs on a different thread than the socket service's polling thread. An attacker on the network or positioned to intercept traffic can trigger this condition repeatedly by dropping or delaying SNTP responses, causing the system to repeatedly attempt reconnection and hitting the race window. While memory corruption is theoretically possible, denial of service via crash is the primary risk.
Source data · NVD / CISA · public domain
- CVSS
- 3.1 · 6.5 MEDIUM · CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:H
- Weaknesses (CWE)
- CWE-416
- Affected products
- 1 configuration(s)
- Published / Modified
- 2026-06-30 / 2026-07-14
NVD description (verbatim)
The asynchronous SNTP client in Zephyr (subsys/net/lib/sntp/sntp.c, sntp_close_async) closed the UDP socket file descriptor directly from the calling thread immediately after detaching it from the network socket service, without synchronizing with the socket-service poll thread. The socket service thread polls each socket via zvfs_poll, which (in zsock_poll_prepare_ctx) registers a k_poll_event pointing into the socket's net_context (&ctx->recv_q) and then blocks in k_poll without holding a reference or lock. net_context objects are allocated from a fixed pool (contexts[CONFIG_NET_MAX_CONTEXTS]) and reused after close. When sntp_close_async is invoked from a different thread than the poll thread (in the in-tree consumer subsys/net/lib/config/init_clock_sntp.c, the SNTP timeout handler runs on the system workqueue while the socket service thread is blocked in poll on the same fd), the close frees and may reuse the net_context while the poll thread still has a poller node linked into the freed object, resulting in a use-after-free / object confusion of kernel poll structures. The SNTP timeout path is the normal no-response failure mode, so a network peer or off-path attacker who drops or delays the SNTP/NTP response can drive the racing close repeatedly (and periodically with NET_CONFIG_SNTP_INIT_RESYNC). The most likely consequence is a crash of the networking thread (denial of service), with potential memory corruption when the freed context slot is reallocated. The fix defers the close to the socket service thread itself via net_socket_service_close (NET_SOCKET_SERVICE_CLOSE_SOCKETS), so the same thread that polls performs the close, eliminating the race. Affected releases: v4.2.0 through v4.4.0.
2 reference(s) · View on NVD →
SEC.co analysis · AI-assisted, reviewed against source
Technical summary
CVE-2026-10655 is a use-after-free vulnerability in Zephyr's asynchronous SNTP client (sntp_close_async in subsys/net/lib/sntp/sntp.c). The vulnerability arises from unsynchronized socket closure across thread boundaries. The socket service thread maintains an active k_poll_event on a net_context's recv_q while blocked in k_poll. When sntp_close_async is invoked from a different thread (typically the system workqueue handling SNTP timeout), it immediately closes and detaches the UDP socket descriptor and returns the net_context to the pool. Because net_context objects are reused from a fixed pool (CONFIG_NET_MAX_CONTEXTS), the freed context may be reallocated before the poll thread wakes and unlinks its poller node, leaving a dangling reference. This creates a use-after-free condition on kernel poll structures. The normal SNTP timeout path—triggered when no response arrives—makes this race easy for a remote attacker to exploit by dropping SNTP packets. The fix moves socket closure to the socket service thread via net_socket_service_close, ensuring the polling and closing operations happen synchronously on the same thread.
Business impact
Devices running affected Zephyr versions with SNTP time synchronization enabled face vulnerability to remote denial of service attacks. An attacker with network visibility (on-path or positioned to intercept SNTP traffic) can repeatedly crash the networking subsystem by blocking or dropping time-sync responses. For IoT and embedded systems relying on Zephyr, this impacts availability and may require manual intervention to restore service. Memory corruption remains a secondary risk if the freed context slot is reallocated during the vulnerable window, potentially enabling further exploitation—though the primary manifestation is denial of service.
Affected systems
Zephyr versions 4.2.0 through 4.4.0 are affected. Systems must be using the asynchronous SNTP client with network socket services enabled and relying on SNTP for time initialization or periodic resynchronization (NET_CONFIG_SNTP_INIT_RESYNC). Embedded and IoT deployments using these Zephyr versions for networked time-keeping are at risk. Verify your Zephyr version and SNTP configuration in prj.conf or your build configuration.
Exploitability
Exploitability requires network access to the target device (remote attackers can do this on shared networks or from the internet if SNTP is exposed) and the ability to drop or delay SNTP responses. This can be achieved via passive packet dropping, active man-in-the-middle positioning, or by hosting a malicious or unresponsive SNTP server if the device connects to attacker-controlled infrastructure. No user interaction or special privileges are required. The normal timeout behavior makes the race window repeatable and relatively easy to hit, though precise timing and threading behavior may vary by deployment. The CVSS score of 6.5 reflects the remote, network-accessible attack vector and high availability impact, tempered by the luck-based (AC:H) nature of hitting the race condition.
Remediation
Upgrade to Zephyr version 4.5.0 or later, where the fix has been integrated. The patch changes sntp_close_async to defer socket closure to the socket service thread via net_socket_service_close, eliminating the cross-thread race. If immediate upgrade is not feasible, disable SNTP auto-initialization or periodic resynchronization in your build (unset NET_CONFIG_SNTP_INIT_RESYNC and related SNTP flags), or run SNTP operations on the same thread as the socket service to avoid the trigger condition—though these are workarounds rather than proper fixes.
Patch guidance
Zephyr users should update to version 4.5.0 or later. The fix is backported to the stable branches for v4.2.x, v4.3.x, and v4.4.x as security patches. Check the Zephyr release notes and security advisories at zephyrproject.org for the specific patch version corresponding to your branch. Apply the patch using your standard dependency management (west update or direct source rebuild). Test SNTP functionality in your application after patching to ensure time synchronization operates normally.
Detection guidance
Monitor for repeated networking thread crashes or restarts correlated with SNTP timeout messages in system logs. Kernel oops or panic logs mentioning poll structures, net_context, or use-after-free patterns are indicators. If possible, capture network traffic to identify if SNTP responses are being dropped or delayed to the device. Enable kernel debug logging for net_socket_service and SNTP subsystems (CONFIG_LOG_* for these modules) to observe socket lifecycle events and detect anomalous close/reallocation patterns. In production, watchdog resets or unexpected network subsystem restarts during time-sync initialization may signal active exploitation.
Why prioritize this
While the CVSS score is 6.5 (medium), this vulnerability warrants prompt attention because (1) it targets availability of networked devices in a fundamental way—the networking stack itself—(2) the attack surface is broad (any on-path or network-visible attacker can drop SNTP packets), (3) the normal failure mode (timeout) makes the race condition repeatable without exotic conditions, and (4) Zephyr's use in IoT and embedded systems means affected deployments often lack rapid patching cycles. Organizations running Zephyr 4.2–4.4 with SNTP enabled should treat this as a near-term upgrade priority.
Risk score, explained
CVSS 6.5 reflects a remote, unauthenticated network attack (AV:N, PR:N, UI:N) with no integrity risk (C:N, I:L) but high availability impact (A:H). The AC:H rating acknowledges that the race condition, while repeatable via SNTP timeout, depends on thread scheduling and timing specifics. The impact is scoped to the device itself (S:U). The score balances the real but somewhat ephemeral nature of the race condition against the high-impact consequence (DoS of networking). An attacker must sustain packet dropping to repeatedly trigger the condition, adding friction compared to simple remote code execution.
Frequently asked questions
Does this vulnerability require the device to connect to a specific malicious SNTP server?
No. The attacker only needs to block or delay SNTP responses—either passively (if on the network path), by spoofing a non-responsive server, or by hosting a slow/unresponsive time server if the device is configured to contact it. The normal SNTP timeout triggers the race, so even a network-wide outage or unreliable link could cause repeated crashes.
Can this vulnerability leak sensitive data or enable remote code execution?
The primary risk is denial of service (DoS) via crash. Memory corruption is theoretically possible if a freed net_context is reallocated during the vulnerable window, which could lead to further exploitation, but the documented impact is a crash of the networking thread. There is no direct information disclosure path.
If I disable SNTP, am I safe?
Yes. Disabling SNTP initialization and periodic resynchronization (unsetting NET_CONFIG_SNTP_INIT_RESYNC and related flags) eliminates the attack trigger. However, this is a workaround; upgrading to Zephyr 4.5.0+ is the proper fix.
Does this affect Zephyr versions before 4.2.0 or after 4.4.0?
The vulnerability affects versions 4.2.0 through 4.4.0 specifically. Versions 4.5.0 and later include the fix. Earlier versions (pre-4.2.0) may not have the asynchronous SNTP client in the same form and require separate assessment.
This analysis is provided for informational purposes by SEC.co and does not constitute legal advice or a guarantee of security. CVSS and vulnerability classifications are based on the CVE record as published. Patch availability and version numbers should be verified against official Zephyr project releases and security advisories at zephyrproject.org before implementation. Organizations should conduct their own risk assessment based on their specific Zephyr deployment, configuration, and network environment. SEC.co makes no warranty regarding the completeness or accuracy of this analysis and recommends consultation with Zephyr maintainers or experienced embedded security specialists for deployment-specific guidance. Source: NVD (public-domain), retrieved 2026-08-09. Analysis generated by SEC.co (claude-haiku-4-5).
Related vulnerabilities
- CVE-2026-10634MEDIUMZephyr TCP Stack Use-After-Free Race Condition
- CVE-2026-10635MEDIUMXtensa Memory Domain Use-After-Free in Zephyr RTOS
- CVE-2026-10637MEDIUMZephyr IPv6 MLD Use-After-Free Denial of Service
- CVE-2026-10638MEDIUMZephyr ICMPv6 Use-After-Free Denial of Service
- CVE-2026-10639MEDIUMZephyr IPv4 Use-After-Free in ICMP Echo Reply Statistics
- CVE-2026-10640MEDIUMZephyr IPv6 Neighbor Discovery Use-After-Free Vulnerability
- CVE-2026-10636LOWUse-After-Free in Zephyr IPv4 IGMP Implementation
- CVE-2026-10646HIGHZephyr DNS Use-After-Return Vulnerability in getaddrinfo()