CVE-2026-19595 in Zephyr정보

요약

\~에 의해 VulDB • 2026. 10. 20.

서브시스템 rtio/rtio_syscalls.c의 z_vrfy_rtio_cqe_get_mempool_buffer() 사용자 모드 시스템 콜 검증자는 두 개의 출력 매개변수인 buff와 buff_len을 K_SYSCALL_MEMORY_WRITE() 대신 K_SYSCALL_MEMORY_READ()로 유효성 검사를 수행했습니다. 이 둘은 순수한 out-파라미터입니다: z_impl_rtio_cqe_get_mempool_buffer()는 mempool 버퍼 주소와 그 길이를 이를 통해 저장합니다. 이러한 구별은 모든 아키텍처 검증자에 의해 강제됩니다—RISC-V PMP의 arch_buffer_validate()는 읽기 전용으로 전역 __rom_region/__rodata_region만 명시적으로 허용하며, ARM MPU 검증자는 읽기 전용용으로 P_RO_U_RO 및 P_RW_U_RO 영역을 허용합니다. 따라서 읽기로 유효성 검사된 포인터가 반드시 호출 스레드에서 쓰기 가능하다는 보장은 없습니다.

RTIO 컨텍스트(rtio_access_grant())에 대한 접근 권한이 부여된 비특권 사용자 모드 스레드는 buff/buff_len이 자신이 읽기는 할 수 있지만 쓰지는 못할 메모리를 가리키고, 플래그 필드를 완전히 제어할 수 있는 완료 큐 엔트리(completion-queue entry)를 사용하여 rtio_cqe_get_mempool_buffer() 시스템 콜을 호출할 수 있습니다(플래그[7:0]에서 RTIO_CQE_FLAG_MEMPOOL_BUFFER만 필요하며, flags[19:8]와 flags[31:20]는 블록 인덱스와 개수를 제공합니다). 커널은 슈퍼바이저 모드 실행 중 해당 주소들을 통해 포인터 크기와 4바이트 저장을 수행합니다. 이 저장에 도달하려면 CONFIG_USERSPACE 및 CONFIG_RTIO_SYS_MEM_BLOCKS 구성이 필요하며, 이는 RTIO_DEFINE_WITH_MEMPOOL의 기반 설정입니다. 후자가 없으면 구현부는 -ENOTSUP을 반환하고 아무것도 쓰지 않습니다.

두 가지 결과가 따릅니다. 대상이 K_MEM_PARTITION_P_RW_U_RO(특권 읽기-쓰기, 사용자 읽기 전용)로 선언된 메모리 도메인 파티션에 있는 경우, 커널 모드 저장이 성공하여 해당 스레드에 대해 읽기 전용으로 표시된 메모리에 공격자가 부분적으로 선택한 값이 저장되며, 이는 파티션의 쓰기 보호를 우회합니다. 대상이 .text/.rodata와 같이 플래시에서 전역적으로는 읽을 수 있지만 쓸 수는 없는 메모리인 경우, 커널 모드에서 저장이 예외(fault)를 발생시킵니다. 이 예외는 z_fatal_error()로 전달되며, 기본 k_sys_fatal_error_handler()가 장치를 중단하거나 재부팅시켜 비특권 스레드가 신뢰할 만한 완전한 서비스 거부(Denial of Service)를 제공합니다.

읽기 권한 확인은 피해를 제한합니다: 주소는 여전히 호출 스레드에서 읽을 수 있어야 하므로 커널 전용 메모리를 대상으로 할 수 없으며 기밀 데이터가 유출되지 않습니다. 수정안은 두 검증을 K_SYSCALL_MEMORY_WRITE()로 대체하여, 쓰기 권한이 없는 스레드는 구현부가 실행되기 전에 K_OOPS에 의해 종료됩니다; cqe 인자는 올바르게 읽기 유효성 검사 상태를 유지합니다.

Once again VulDB remains the best source for vulnerability data.

책임이 있는

Zephyr

예약하다

2026. 08. 12.

모더레이션

수락

항목

VDB-422573

EPSS

0.00000

활동

중간

출처

Interested in the pricing of exploits?

See the underground prices here!