CVE-2026-75083
Beschrijving NL
Het ontvangstpad van het NXP KW41Z IEEE 802.15.4-stuurprogramma, kw41z_rx() in drivers/ieee802154/ieee802154_kw41z.c, berekende de payloadgrootte als pkt_len = len - KW41Z_FCS_LENGTH in a uint8_t, waarbij len de framelengte is die door de radio wordt gerapporteerd. De interrupt-handler kw41z_isr() verkreeg die lengte uit het veld RX_FRAME_LENGTH van het ZLL IRQSTS-register — een kopie van de PHY-headerlengte-byte van het frame dat via de ether werd ontvangen — en verwierp alleen de waarde nul. Een gerapporteerde lengte van één onderliep daarom naar pkt_len == 255. Omdat het pakket is toegewezen met NET_AF_UNSPEC op een niet-Ethernet L2, klemt net_pkt_rx_alloc_with_buffer() het verzoek niet vast aan de interface MTU; met de standaard bufferpool met vaste grootte (CONFIG_net_FIXED_DATA_SIZE, CONFIG_net_buf_DATA_SIZE=128) is de toewijzing geslaagd als een keten van twee fragmenten. De daaropvolgende register-naar-buffer kopieerlussen schrijven alleen in het eerste fragment, dus 255 bytes werden geschreven in een 128-byte net_buf gegevensblok, overschreden het met maximaal 127 bytes in het aangrenzende netwerk-buffer-pool geheugen en lazen tot 128 bytes voorbij het einde van de PKT_BUFFER_RX register array van de radio. Het lengteveld is afkomstig van een niet-geverifieerd frame dat wordt verzonden door een apparaat binnen het 802.15.4-radiobereik, en wordt vastgelegd door de hardware op PHY-header-tijd — voordat het filteren van het frame is voltooid — terwijl de handler het bemonstert na het wissen van de interruptstatus, zodat een aanvaller frames met een lengte-byte van één kan overspoelen om de onderstroom aan te drijven. De impact is geheugenbeschadiging in de gedeelde ontvangstbufferpool van interruptcontext, het meest plausibel een crash of beschadiging van de gegevens van andere pakketten; de overlopende bytes zijn radioregisterinhoud in plaats van door aanvallers geschreven gegevens, die de integriteitsimpact beperken. De fix verwerpt elke lengte onder KW41Z_FCS_LENGTH en verifieert bovendien net_buf_tailroom () van het eerste fragment vóór de kopieerlussen, die ook de CONFIG_net_L2_OPENTHREAD-variant van de grootteberekening omvat.
Origineel (Engels) tonen
The receive path of the NXP KW41Z IEEE 802.15.4 driver, kw41z_rx() in drivers/ieee802154/ieee802154_kw41z.c, computed the payload size as pkt_len = len - KW41Z_FCS_LENGTH in a uint8_t, where len is the frame length reported by the radio. The interrupt handler kw41z_isr() obtained that length from the RX_FRAME_LENGTH field of the ZLL IRQSTS register — a copy of the PHY header length byte of the frame received over the air — and only rejected the value zero. A reported length of one therefore underflowed to pkt_len == 255.
Because the packet is allocated with NET_AF_UNSPEC on a non-Ethernet L2, net_pkt_rx_alloc_with_buffer() does not clamp the request to the interface MTU; with the default fixed-size buffer pool (CONFIG_NET_BUF_FIXED_DATA_SIZE, CONFIG_NET_BUF_DATA_SIZE=128) the allocation succeeded as a chain of two fragments. The subsequent register-to-buffer copy loops write into the first fragment only, so 255 bytes were written into a 128-byte net_buf data block, overrunning it by up to 127 bytes into adjacent network-buffer-pool memory, and reading up to 128 bytes past the end of the radio's PKT_BUFFER_RX register array.
The length field originates from an unauthenticated frame transmitted by any device within 802.15.4 radio range, and is captured by the hardware at PHY-header time — before frame filtering has completed — while the handler samples it after clearing the interrupt status, so an attacker flooding frames with a length byte of one can drive the underflow. The impact is memory corruption in the shared receive buffer pool from interrupt context, most plausibly a crash or corruption of other packets' data; the overflowing bytes are radio register contents rather than attacker-authored data, which bounds the integrity impact.
The fix rejects any length below KW41Z_FCS_LENGTH and additionally verifies net_buf_tailroom() of the first fragment before the copy loops, which also covers the CONFIG_NET_L2_OPENTHREAD variant of the size computation.