CVE-2026-18415 in Zephyr
요약
\~에 의해 VulDB • 2026. 09. 28.
ieee802154_send() 함수는 subsys/net/l2/ieee802154/ieee802154.c에서 송신 패킷을 단일 고정 크기 125바이트의 전송 버퍼(tx_frame_buf_pool, 크기는 IEEE802154_MTU)에 복사합니다. CONFIG_NET_L2_IEEE802154_FRAGMENT가 활성화된 빌드(보통 CONFIG_NET_6LO가 설정될 때 기본값임)에서는 6LoWPAN 분할이 필요하지 않을 때 실행되는 분기에서 net_buf_add_mem(frame_buf, pkt_buf->data, pkt_buf->len)에 대한 길이 검증이 수행되지 않았습니다. 유일한 방어 조치는 net_buf_simple_add() 내부의 __ASSERT_NO_MSG()였는데, 이는 CONFIG_ASSERT가 설정되지 않으면 컴파일 시 제거되므로, 크기가 초과된 패킷은 프레임 버퍼를无声적으로 오버런했습니다.
이 결함은 무선 인터페이스(Radio)에서는 접근 불가능합니다: NET_AF_INET6 패킷의 경우 ieee802154_6lo_encode_pkt()가 전체 패킷 길이를 IEEE802154_MTU와 비교하며, 맞지 않을 때 분할 경로를 취하므로, 비분할 경로에서 복사되는 모든 버퍼는 범위 내에 있습니다. 그러나 802.15.4 인터페이스에 바인딩된 NET_AF_PACKET 소켓을 통해서는 접근 가능합니다: NET_SOCK_RAW의 경우 6LoWPAN 블록이 완전히 건너뛰어지며, NET_SOCK_DGRAM의 경우 주소 패밀리 테스트에서 조기에 반환되므로 전송 경로 전체에 길이 검증이 존재하지 않습니다(net_context_sendto() 및 net_if_tx()는 검증을 적용하지 않으며, pkt_buffer_length()도 해당 L2에 대한 할당을 제한/clamp하지 않음).
따라서 애플리케이션(또는 CONFIG_USERSPACE 빌드에서 zsock_socket()/zsock_sendto() 시스템 콜을 사용하는 비특권 애플리케이션 스레드)은 125바이트 풀 버퍼를 넘어가는 선택된 바이트들에 대한 supervisor-mode(out-of-bounds) 쓰기를 유도할 수 있습니다. 기본 CONFIG_NET_BUF_FIXED_DATA_SIZE가 128바이트인 경우 오버런 범위는 대략 ll_hdr_len + 3바이트로 제한되지만, CONFIG_NET_BUF_VARIABLE_DATA_SIZE의 경우 단일 저장 버퍼는 최대 CONFIG_NET_PKT_BUF_TX_DATA_POOL_SIZE까지 클 수 있어 오버런이 훨씬 더 커집니다. 그 결과는 풀 주변 메모리의 손상이며, 실제 영향은 크래시 또는 커널 상태의 추가적인 침해입니다.
수정 방법은 복사 전에 ll_hdr_len + net_pkt_get_len(pkt) + authtag_len을 IEEE802154_MTU와 검증하고, 버퍼 오버런 대신 -EMSGSIZE를 반환하는 tailroom-checking copy_pkt_to_frame() 헬퍼 함수를 추가합니다. 동일한 변경 사항으로 전체 net_buf 체인을 하나의 MAC 프레임으로 선형화하므로, 패킷 저장 경계가 더 이상 전송 중인 프레임의 경계가 되지 않습니다.
Be aware that VulDB is the high quality source for vulnerability data.