CVE-2026-18747 in Zephyr
요약
\~에 의해 VulDB • 2026. 09. 29.
MCUmgr의 SMP-over-console 전송 계층은 base64로 인코딩된 프레임을 디코드하고, 여기서 16비트 패킷 길이를 읽으며 CRC를 검증한 후 `mcumgr_serial_process_frag()` 함수(하위 시스템: subsys/mgmt/mcumgr/transport/src/serial_util.c) 내에서 `rx_ctxt->nb->len -= 2U;`라는 조건부 검사 없이 트레일링(CRC)을 제거합니다. `mcumgr_serial_extract_len()`은 0과 1을 포함한 모든 선언된 길이를 허용하며, 길이 0인 패킷은 crc16_itu_t()가 0바이트에 대해 제로 시드(seed)를 반환하므로 체크섬 테스트를 자동으로 통과합니다. net_buf::len이 uint16_t 타입이기 때문에 이 뺄셈 연산에서 오버플로우(underflow, 정수 과소 발생)가 발생하며, 버퍼는 SMP에게 약 65KB의 페이로드가 있는 것처럼 전달되지만 실제 데이터 영역은 CONFIG_MCUMGR_TRANSPORT_NETBUF_SIZE 바이트(기본값 384바이트)에 불과합니다.
트리거(trigger)는 관리 콘솔을 통해 전송되는 단일 인증되지 않은(unauthenticated) 7바이트 라인입니다 — 이는 0x06 0x09 패킷 마커, base64 그룹 AAA=, 그리고 개행 문자로 구성됩니다. 이 트리거는 이 헬퍼를 기반으로 구축된 모든 전송(CONFIG_MCUMGR_TRANSPORT_UART(smp_uart.c) 또는 CONFIG_MCUMGR_TRANSPORT_SHELL(smp_shell.c), 둘 다 MCUMGR_TRANSPORT_SERIAL_HAS_SMP_OVER_CONSOLE를 선택함)에서 발생 가능합니다. 오버플로우를 트리거하기 위해 사전 세션 상태, 분할(fragmentation), 자격 증명(credential)이 필요하지 않으며, 잘못된 프레임은 어떤 명령 핸들러나 명령 수준 접근 제어보다 먼저 잘못 처리됩니다. 공격자는 해당 콘솔에 대한 쓰기 권한만 있으면 되며, 많은 보드에서 이는裸 UART 헤더가 아닌 USB CDC-ACM 포트입니다.
팽창된 길이로 인해 subsys/mgmt/mcumgr/smp/src/smp.c의 smp_process_request_packet() 함수는 경계를 상실합니다: cbor_nb_reader_init()은 CBOR 디코더에게 384바이트 버퍼에 대해 약 65KB의 창(window)을 제공하며, 각 요청 헤더의 nh_len은 팽창된 길이와만 비교됩니다. 자체적으로 7바이트 프레임이 재사용되는 풀(pool) 버퍼가 여전히 보유하고 있는 낡은(stale) 바이트를 다시 파싱하는데, 이는 일반적으로 이전에 수신한 요청의 재생과 그 뒤에 이어지는 파스 오류로 나타나며, 버퍼 밖으로 벗어나지 않습니다. 그러나 전송 계층이 인증되지 않았기 때문에 공격자는 트리거 전에 전송된 프레임도 제어할 수 있으며, nh_len이 버퍼 크기보다 큰 요청이 성공하도록 버퍼 내용을 스테이지(staging)할 수 있습니다. net_buf_pull()은 __ASSERT_NO_MSG로만 보호되므로 파스 커서를 경계 밖으로 이동시키고 루프는 인접한 메모리에서 추가 헤더와 CBOR 데이터를 읽습니다. 그 결과, MCUmgr 스레드를 폴트(denial of service)시킬 수 있는 경계 외 리드(out-of-bounds read)가 발생하며, 기본 활성화된 os echo 핸들러(CONFIG_MCUMGR_GRP_OS_ECHO)가 해당 창 내에서 문자열을 디코딩하고 응답으로 복사하므로 메모리 유출(memory disclosure)도 가능합니다. 인증되지 않은 전송 계층이 이미 허용하는 범위 이상으로 무결성(integrity)은 향상되지 않습니다.
수정(patch)은 mcumgr_serial_extract_len()에서 2바이트 이하의 선언된 패킷 길이를 거부함으로써 CRC 제거 뺄셈 연산에서의 오버플로우를 방지합니다. 동일한 패턴은 테스트 전용 루프백 전송(subsys/mgmt/mcumgr/transport/src/smp_dummy.c, CONFIG_MCUMGR_TRANSPORT_DUMMY)에 남아있지만, 외부 입력 경로가 없어 실제적인 노출(exposure) 위험은 없습니다.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.