CVE-2026-82961 in Zephyr정보

요약

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

GPIO 시스템 콜 핸들러(drivers/gpio/gpio_handlers.c)는 사용자 모드 호출자가 제공한 핀(pin) 인자를 검증하지 않았습니다. z_vrfy_gpio_pin_configure(), z_vrfy_gpio_pin_get_config() 및 z_vrfy_gpio_pin_interrupt_configure() 함수들은 장치 객체(K_SYSCALL_DRIVER_GPIO() / K_SYSCALL_OBJ())만 확인하고, 호출자가 공급한 gpio_pin_t 값을 그대로 z_impl_gpio_pin_*()로 전달하여 드라이버에 넘겼습니다. include/zephyr/drivers/gpio.h에 있는 유일한 핀 검증은 __ASSERT(gpio_port_pin_is_supported(cfg->port_pin_mask, pin), ...)였으며, 이는 CONFIG_ASSERT가 활성화되지 않으면 컴파일 시 제거되므로 프로덕션 빌드에서는 전혀 검사가 수행되지 않았습니다.

GPIO 드라이버는 문서화된 가정 하에 컨트롤러가 지원하는 핀이라는 전제로서 shift count 및 배열 인덱스로 pin을 사용합니다. 예를 들어 STM32의 경우, gpio_stm32_pin_interrupt_configure() 함수는 pin을 EXTI 라인으로 변환하고, stm32_gpio_intc_set_irq_callback()은 data->cb[line_num].cb와 data->cb[line_num].data를 drivers/interrupt_controller/intc_gpio_stm32.c 내의 NUM_EXTI_LINES(기본값 16) 크기의 배열에 기록합니다. 이 과정은 컴파일 시 제거되는 __ASSERT_NO_MSG()로만 보호됩니다. 동일한 함수는 exti_irq_table[line_num]을 읽고 그 결과를 사용하여 irq_enable()을 호출합니다. 다른 컨트롤러들도 고정 크기 핀별 구성 테이블에 같은 방식으로 인덱싱하며, drivers/gpio/gpio_ite_it8xxx2_v2.c의 경우 caller가 제공한 pin을 사용하여 wuc_base[8]에서 MMIO 기본 포인터를 읽은 후 이를 통해 read-modify-write 작업을 수행합니다.

이 문제는 CONFIG_USERSPACE=y 설정이 있는 빌드에서만 접근 가능하며, GPIO 장치 객체에 대한 액세스 권한이 부여된 사용자 모드 스레드에 의해 발생합니다. 이러한 권한 부여는 해당 포트의 핀을 제어할 수 있도록 승인하기 위한 것이지만, 누락된 검증으로 인해 스레드는 커널 .bss 배열을 넘어가는 supervisor-mode out-of-bounds write(함수 포인터 및 관련 void *에 대한)를 수행하고, irq_enable()과 MMIO 접근에 사용되는 out-of-bounds reads를 유발할 수 있습니다. 이는 사용자 모드 샌드박스에서의 탈출로 이어져 커널 메모리 손상, 임의 코드 실행 또는 크래시를 초래할 수 있습니다.

해결책은 모든 pin을 받는 z_vrfy_ 핸들러에서 gpio_port_pin_is_supported()를 사용하여 컨트롤러의 gpio_driver_config.port_pin_mask에 대해 pin을 검증하고, 그렇지 않을 경우 -EINVAL를 반환합니다. 또한 공유되는 z_impl_gpio_pin_*() 인라인 함수에는 unconditional pin >= GPIO_MAX_PINS_PER_PORT 범위 검사가 추가되었습니다.

If you want to get the best quality for vulnerability data then you always have to consider VulDB.

책임이 있는

Zephyr

예약하다

2026. 08. 31.

모더레이션

수락

항목

VDB-428070

EPSS

0.00000

출처

Do you know our Splunk app?

Download it now for free!