Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessGain access to OSDP RS-485 bus
-
DeliveryForge reply frame with valid CRC and sequence
-
ExploitSend oversized REPLY_KEYPPAD/REPLY_RAW to CMD_POLL
-
ExecutionOverflow 64-byte event array via memcpy
-
PersistOverwrite return address on receive-thread stack
-
ImpactCrash panel or hijack control flow
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Bounds checking, write limits
MITRE ATT&CK
2 techniques across 2 tactics: Execution, Privilege Escalation The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Requires a build with CONFIG_OSDP enabled in CONFIG_OSDP_MODE_CP (Control Panel) mode with an application event callback registered - the normal CP integration. The attacker must be on the OSDP RS-485 bus (a malicious/compromised card reader or physical access to the wiring) and must send a frame with correct SOM, valid CRC-16, and a matching 2-bit sequence number, all computable or observable from the bus. Limiting factors: exploitation is bus-adjacent only (not remote/network), and requires the OSDP CP subsystem to be compiled in and active. CONFIG_OSDP_SC_ENABLED (secure channel) only mitigates while a secure channel is active, but a single unauthenticated frame carrying a bad MAC triggers sc_deactivate(), after which plaintext replies are again accepted - so secure channel is not a reliable barrier. No reply-ID-to-outstanding-command binding exists, so an oversized reply is accepted as the answer to a routine CMD_POLL. |
| Impact | This is a genuine high-priority defect for the specific population that runs it, though its blast radius is bounded by the attack vector. The CVSS 8.8 vector (CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) is credible and matches the description: exploitation requires presence on the OSDP RS-485 bus (Adjacent, not Network), needs no privileges, and yields full C/I/A impact via a stack overflow that can reach saved registers and the return address (Zephyr ships without stack canaries by default). No EPSS score, KEV listing, or public POC was supplied in the intelligence set - exploitation status is therefore 'no public exploit identified at time of analysis', and risk scoring rests on the vector and the confirmed patch rather than observed exploitation. The one point of friction worth flagging: AC:L is defensible because SOM, CRC-16 and the 2-bit sequence number are all computable or observable by anyone on the wire, and secure channel (CONFIG_OSDP_SC_ENABLED) can be stripped by a single bad-MAC frame that forces sc_deactivate() - but it is NOT remotely reachable, so despite C/I/A all High this is not an internet-facing mass-exploitation candidate. Net: a real, patch-now issue for deployed OSDP control panels, not a high-CVSS-but-low-real-risk artifact, but its reach is gated by physical/bus adjacency. |
| Exploit ScenarioDerived | A malicious or compromised peripheral card reader - or anyone who can tap the RS-485 wiring of an access-control installation - sends a crafted REPLY_KEYPPAD or REPLY_RAW frame with a valid SOM, CRC-16 and matching sequence number as the unsolicited answer to a routine CMD_POLL. The oversized payload overruns the fixed 64-byte (OSDP_EVENT_MAX_DATALEN) stack array in struct osdp_event, writing roughly 180 bytes of attacker-chosen data over saved registers and the return address of the OSDP receive thread. No public exploit code was identified in the provided data; outcomes range from a hard crash of the control panel to potential control-flow hijack. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 19, 2026
A stack-based out-of-bounds write in Zephyr's OSDP Control Panel reply parser (cp_decode_response() in subsys/mgmt/osdp/src/osdp_cp.c) lets an attacker on the RS-485 bus overflow fixed 64-byte payload arrays inside a stack-allocated struct osdp_event by declaring an oversized REPLY_KEYPPAD or REPLY_RAW payload length. Any build with CONFIG_OSDP and CONFIG_OSDP_MODE_CP plus an event callback registered is affected, and because nobody validates the reply ID against an outstanding command, a malicious or compromised card reader can answer a routine CMD_POLL with a weaponized frame carrying a correct SOM, valid CRC-16 and matching sequence number. With the default 256-byte UART buffer roughly 180 attacker-chosen bytes land past the event object, corrupting saved registers and the return address on typical Cortex-M/RISC-V layouts, giving crash-to-potential-control-flow-hijack in the OSDP receive thread; no public exploit code has been identified at time of analysis and the issue is bus-adjacent (AV:A) rather than network-reachable.
RemediationAI
Apply the upstream fix commit f10d55f47c6970e95d3a7c6ba08e6adec3c79acd (or a Zephyr release that contains it, per advisory GHSA-fgg7-h8p9-9q3w), which adds the missing OSDP_EVENT_MAX_DATALEN bound to both the REPLY_KEYPPAD and REPLY_RAW branches of cp_decode_response() and caps each memcpy() at its destination size; patch status is 'Upstream fix available (PR/commit); released patched version not independently confirmed', so verify the commit is present in your pinned tree before relying on a version number. If immediate patching is not possible, reduce exposure in this order: drop CONFIG_OSDP_MODE_CP (or CONFIG_OSDP entirely) on products that do not need to act as a Control Panel - this removes the vulnerable parser outright at the cost of the OSDP feature; lower CONFIG_OSDP_UART_BUFFER_LENGTH from the 256-byte default to shrink the maximum possible overwrite (it cannot eliminate the overflow, and it reduces the largest frame the CP can accept); enable CONFIG_MPU_STACK_GUARD and, where the architecture supports it, stack canaries so an overwrite faults the OSDP receive thread instead of yielding control-flow hijack (costs a small amount of RAM/cycles and converts silent corruption into a reboot); run the OSDP receive thread unprivileged behind the MPU so corrupted execution cannot reach privileged resources. Treat CONFIG_OSDP_SC_ENABLED as a partial mitigation only - a single bad-MAC frame triggers sc_deactivate() and returns the link to plaintext - so pair it with strict physical protection of the RS-485 cabling and reader enrollment, since anyone with bus access can compute the SOM, CRC-16 and sequence number needed to deliver the frame.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
OSDP (Open Supervised Device Protocol) is the RS-485 access-control protocol implemented by Zephyr's subsys/mgmt/osdp subsystem, where a Control Panel (CP) polls Peripheral Devices such as card readers. cp_process_reply() reads bytes off the UART, runs osdp_phy_check_packet() and osdp_phy_decode_packet() for framing/CRC validation, then dispatches on reply ID into cp_decode_response(). For REPLY_KEYPPAD and REPLY_RAW, the handler copies the attacker-controlled payload into struct osdp_event_keypress / struct osdp_event_cardread whose data arrays are sized OSDP_EVENT_MAX_DATALEN (64 bytes); the only guard was that the declared length matched the number of bytes actually present in the frame, which is meaningless when the attacker controls both values. The sibling REPLY_FMT branch already carried the missing '> OSDP_EVENT_MAX_DATALEN' bound, confirming this is an omission rather than a design choice. The root cause is CWE-787 (out-of-bounds write): an unchecked length derived from untrusted wire data is used directly as the memcpy() count into a fixed-size stack destination, and Zephyr does not enable stack canaries by default, so a write of ~180 bytes past the object overwrites saved registers and the return address. Note that CONFIG_OSDP_SC_ENABLED (secure channel) is not a reliable barrier: it only protects while a secure channel is established, and a single unauthenticated frame with a bad MAC calls sc_deactivate(), after which plaintext replies are accepted again.
Know when Zephyr gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
AV:A because exploitation is confined to the RS-485 bus; AC:L and PR:N since SOM/CRC/sequence are observable and secure channel can be stripped by one bad-MAC frame; C/I/A:H from potential control-flow hijack.
Primary rating from Vendor (zephyr).
CVSS VectorVendor: zephyr
DescriptionCVE.org
The OSDP Control Panel reply parser cp_decode_response() in subsys/mgmt/osdp/src/osdp_cp.c decodes replies from a Peripheral Device into a stack-allocated struct osdp_event. For the REPLY_KEYPPAD and REPLY_RAW reply types, the payload length is taken from the received frame and the only validation performed is that the declared length is self-consistent with the number of payload bytes present in the frame. Because the attacker controls both the length field and the frame length, that check imposes no bound, and the subsequent memcpy() writes into the fixed 64-byte data arrays of struct osdp_event_keypress / struct osdp_event_cardread (OSDP_EVENT_MAX_DATALEN). The sibling REPLY_FMT handler in the same switch already carried the missing > OSDP_EVENT_MAX_DATALEN bound.
The defect is reached from cp_process_reply(), which reads bytes from the OSDP RS-485 channel and passes them through osdp_phy_check_packet() and osdp_phy_decode_packet() before dispatching on the reply ID. Triggering it requires CONFIG_OSDP with CONFIG_OSDP_MODE_CP and an application event callback registered (the normal Control Panel integration), plus a frame carrying a correct SOM, a valid CRC-16, and a matching 2-bit sequence number - all of which are computable or observable by anyone on the bus. No check ties the reply ID to the outstanding command, so an oversized REPLY_KEYPPAD or REPLY_RAW is accepted as the answer to a routine CMD_POLL. A malicious or compromised card reader, or anyone with access to the RS-485 wiring, can supply such a frame; CONFIG_OSDP_SC_ENABLED only helps while a secure channel is active, and a single unauthenticated frame carrying a bad MAC causes sc_deactivate(), after which plaintext replies are again accepted.
With the default CONFIG_OSDP_UART_BUFFER_LENGTH of 256, roughly 180 bytes of fully attacker-chosen data can be written past the end of the stack-allocated event object, over saved registers and the return address on typical Cortex-M and RISC-V frame layouts (Zephyr does not enable stack canaries by default). The impact ranges from a hard crash of the access-control panel to potential control-flow hijack in the context of the OSDP receive thread. The fix adds an OSDP_EVENT_MAX_DATALEN bound to both handlers, capping each memcpy() at the size of its destination.
Technical POC Analysis
CWE-787 (out-of-bounds write) in cpdecoderesponse() in subsys/mgmt/osdp/src/osdpcp.c (Zephyr).
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
Zephyr-based OSDP control panels - the units that manage card readers on door and building access systems - contain a memory-corruption flaw in how they parse reader replies, allowing a malicious or compromised reader on the shared RS-485 wiring to crash the panel and potentially seize control of its processing flow. Leadership should care because these devices sit at the boundary between cyber and physical security: a successful attack could disable or subvert door control at a site, and the affected code ships in any firmware build that enables OSDP control-panel mode with an event callback, meaning installed door infrastructure may already be exposed.
Apply vendor patch.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
A buffer overflow occurs when a program writes more data to a memory buffer than it was allocated to hold, causing the excess data to spill into adjacent memory regions.
Memory corruption occurs when a program writes data beyond the boundaries of allocated memory regions or accesses memory in unintended ways, violating the integrity of the process's address space.
Potential off-by-one buffer overflow vulnerability in the Zephyr fuse file system. Rated critical severity (CVSS 10.0),
An out-of-bounds write in the Zephyr RTOS DNS resolver (dns_unpack_name()) lets a crafted DNS response corrupt memory on
Possible variant of CVE-2021-3434 in function le_ecred_reconf_req. Rated critical severity (CVSS 9.8), this vulnerabilit
Unchecked user input length in /subsys/net/l2/wifi/wifi_shell.c can cause buffer overflows. Rated critical severity (CVS
Potential buffer overflow vulnerability in the Zephyr CAN bus subsystem. Rated critical severity (CVSS 9.8), this vulner
Integer Underflow in 6LoWPAN IPHC Header Uncompression in Zephyr. Rated critical severity (CVSS 9.8), this vulnerability
Buffer overflow in Zephyr USB DFU DNLOAD. Rated critical severity (CVSS 9.8), this vulnerability is remotely exploitable
DOS: Incorrect 802154 Frame Validation for Omitted Source / Dest Addresses. Rated critical severity (CVSS 9.8), this vul
zephyr-rtos version 1.12.0 contains a NULL base pointer reference vulnerability in sys_ring_buf_put(), sys_ring_buf_get(
Potential buffer overflow vulnerabilities n the Zephyr Bluetooth subsystem. Rated critical severity (CVSS 9.6), this vul
The documentation specifies that the BT_GATT_PERM_READ_LESC and BT_GATT_PERM_WRITE_LESC defines for a Bluetooth characte
Potential buffer overflows in the Bluetooth subsystem due to asserts being disabled in /subsys/bluetooth/host/hci_core.c
EUVD-2026-104600
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB