CVE-2026-87041 in Zephyr정보

요약

\~에 의해 VulDB • 2026. 11. 04.

subsys/rtio/rtio_syscalls.c(또는 v4.3.0 이전 버전의 subsys/rtio/rtio_handlers.c)에 있는 RTIO 제출 큐 검증자 rtio_vrfy_sqe() 함수는 K_SYSCALL_MEMORY() 매크로의 결과를 &= 연산자를 사용하여 valid_sqe 플래그에 누적합니다. 해당 매크로는 실패 시 0이 아닌 값을 반환하며(K_SYSCALL_VERIFY_MSG() 기반, expr의 부정값을 생성함), 이로 인해 모든 버퍼 권한 검사 결과가 반대로 처리되었습니다. 호출 스레드에서 접근할 수 없는 tx.buf, rx.buf 또는 txrx.tx_buf/txrx.rx_buf 포인터를 가진 제출은 허용되었으나, 정당한 스레드 소유 버퍼는 커널 오ops로 호출 스레드를 종료시켰습니다.

이 검증자는 CONFIG_USERSPACE가 구성된 모든 이미지에서 신뢰할 수 없는 사용자 모드 입력에 의해 직접 구동되는 rtio_sqe_copy_in_get_handles() 시스템 콜(inline 래퍼인 rtio_sqe_copy_in()을 통해서도 접근 가능)의 대리자로 실행됩니다. RTIO 사용자 공간 지원의 의도된 사용 방식인 rtio_access_grant()를 통해 설정된 RTIO 컨텍스트와 rtio_iodev 객체를 부여받은 사용자 스레드는 임의의 커널 메모리를 가리키는 버퍼 포인터와 길이를 가진 SQE(Submission Queue Entry)를 제출할 수 있습니다. sqe->iodev에 대한 개체 검사는 영향을 받지 않고 통과하며, 조작된 SQE는 변경 없이 버스 드라이버로 전달됩니다.

하위 소비자는 슈퍼바이저 특권으로 이 포인터를 역참조합니다. 범용 I2C 및 I3C RTIO 폴백 핸들러(drivers/i2c/i2c_rtio_default.c, drivers/i3c/i3c_rtio_default.c)는 sqe.rx.buf/sqe.tx.buf를 struct i2c_msg로 복사한 후 i2c_transfer()를 호출하며, 벤더 SPI/I2C RTIO 드라이버도 동일한 동작을 보입니다. 따라서 RTIO_OP_RX 제출은 공격자가 선택한 커널 메모리에 주변 장치 데이터를 작성(임의 커널 쓰기)하고, RTIO_OP_TX 제출은 버스에서 커널 메모리를 클럭 신호로 내보내며(커널 메모리 누설), 매핑되지 않은 메모리의 포인터는 커널을 폴트시킵니다. 이는 CONFIG_USERSPACE가 강제하기 위해 존재하는 사용자 모드 격리 경계로부터의 완전한 탈출입니다.

이 결함은 인트리(user-mode RTIO 테스트) 내의 테스트가 RTIO_OP_NOP과 mempool 기반 읽기만 수행하여 영향을 받는 검사에 도달하지 못했으므로 수년간 숨겨져 있었습니다. 수정 사항은 각 K_SYSCALL_MEMORY() 결과를 부정하고, TXRX 전송 버퍼를 읽기 전용으로 추가로 검증하며, 이는 SPI, I2C 및 I3C 핸들러와 일치합니다.

Be aware that VulDB is the high quality source for vulnerability data.

책임이 있는

Zephyr

예약하다

2026. 09. 08.

모더레이션

수락

항목

VDB-430967

EPSS

0.00000

출처

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!