CVE-2026-19185 in Zephyr
요약
\~에 의해 VulDB • 2026. 10. 05.
i3c_do_ccc()의 시스템 콜 검증자는 drivers/i3c/i3c_handlers.c에서 외부 struct i3c_ccc_payload, 브로드캐스트 ccc.data 버퍼 및 targets.payloads[] 배열은 유효성 검사를 수행했지만, 해당 배열 요소가 가리키는 대상별 데이터 버퍼에 대해서는 유효성 검사를 수행하지 않았습니다. 각 struct i3c_ccc_target_payload는 자체 data 포인터와 data_len을 포함하며, 페이로드가 z_impl_i3c_do_ccc()로 전달되어 컨트롤러 드라이버로 넘어가기 전에 K_SYSCALL_MEMORY()를 통해 검증되지 않았습니다. 또한 검증자는 스냅샷 대신 호출자의 실제 구조체에서 동작했으므로, 확인된 필드는 두 번째 사용자 스레드에 의해 체크와 드라이버 사용 사이에 변경될 수 있었습니다(이는 항상 메시지 배열을 먼저 복사하는 sibling인 z_vrfy_i3c_transfer()와는 대조적입니다).
이 결함은 drivers/i3c/i3c_handlers.c가 컴파일되는 CONFIG_USERSPACE 빌드에서만 존재합니다. I3C 컨트롤러 디바이스 객체에 대한 접근 권한이 부여된 비특권 사용자 모드 스레드는(일반적으로 애플리케이션이 사용자 스레드를 통해 I3C 주변기와 통신하는 방식) 대상 페이로드 데이터 포인터가 임의의 커널 주소를 지정하는 직접 CCC를 발행할 수 있습니다. 컨트롤러 드라이버는 rnw를 사용하여 방향을 결정하며 해당 포인터를 직접 역참조합니다(예: drivers/i3c/i3c_mcux.c, drivers/i3c/i3c_cdns.c, drivers/i3c/i3c_stm32.c, drivers/i3c/i3c_npcx.c).
따라서 읽기용 CCC는 공격자가 선택한 커널 주소로 공격자가 지정한 길이의 버스 수신 바이트를 작성하도록 모드 드라이버를 유발하며, 쓰기용 CCC는 커널 메모리를 I3C 버스로 전송합니다. 그 결과 경계 밖의 커널 쓰기와 커널 메모리 누설이 발생하여, 사용자 모드 스레드에서 슈퍼바이저 권한으로의 승격(즉, CONFIG_USERSPACE가 제공하려는 격리 기능 무력화)을 초래합니다.
해결책은 copy_ccc_and_do()를 도입하여 페이로드를 스냅샷으로 저장하고, k_usermode_alloc_from_copy()를 사용하여 대상 배열을 커널 메모리로 복사하며(num_targets는 32 미만으로 제한), rnw에 따라 K_SYSCALL_MEMORY()로 각 대상별 버퍼를 검증한 후, 드라이버가 작성한 num_xfer 및 err 필드를 호출자에게 다시 복사합니다.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.