CVE-2026-19184 in Zephyr
요약
\~에 의해 VulDB • 2026. 10. 05.
NXP GAU ADC 드라이버(drivers/adc/adc_mcux_gau_adc.c)는 호출자가 제공한 sequence->buffer_size(바이트 단위)를 샘플 수인 활성 채널 수와 비교하여 유효성을 검사했습니다. 그런 다음 해당 바이트 카운트를 data->results_length에 직접 저장하고 mcux_gau_adc_read_samples()에서 사용 가능한 uint16_t 슬롯의 개수로 사용했습니다. 각 변환 결과는 sizeof(uint16_t)바이트를 차지하므로, "충분히 크다"고 받아들여진 버퍼에는 실제 크기의 최대 2배인 바이트 수만큼 데이터가 작성될 수 있어, 버퍼 중점 이후의 모든 샘플이 경계 밖으로 기록되었습니다.
adc_read() 및 adc_read_async()는 Zephyr 시스템 호출입니다. drivers/adc/adc_handlers.c에 있는 syscall 검증자는 호출자가 buffer_size만큼의 쓰기 가능한 바이트를 소유하고 있는지(K_SYSCALL_MEMORY_WRITE)만 확인하며, 해당 크기가 요청된 채널과 extra_samplings에 충분한지 여부는 완전히 드라이버에게 위임됩니다. CONFIG_USERSPACE=y로 빌드된 환경에서 ADC 장치 객체에 대한 권한이 부여된 사용자 모드 스레드는 의도적으로 절반 크기의 버퍼를 제출하여, 호출자의 MPU 제한 외부에서 슈퍼바이저 모드로 실행되는 드라이버의 작업 큐 핸들러가 해당 버퍼 끝을 넘어 ADC 변환 결과를 호출자가 선택한 주소와 길이로 작성하도록 유도할 수 있습니다.
이 오버런은 요청된 시퀀스에 의해 제한됩니다: sequence->options->extra_samplings가 설정되면 샘플링 루프는 각 샘플링마다 버퍼 포인터를 앞으로 이동시키므로, 총 오버런 크기는 제공된 버퍼의 전체 크기(큰 extra_samblings인 경우 킬로바이트 단위)에 도달할 수 있습니다. 작성되는 단어들은 16비트 ADC 변환 결과이므로 콘텐츠는 선택된 아날로그 입력, 이득 및 해상도를 통해 공격자가 부분적으로 영향을 줄 수 있지만, 대상 주소와 길이는 완전히 제어되므로 커널 메모리 손상, 크래시 또는 사용자 공간에서 커널로의 권한 상승(privilege escalation)에 충분합니다. CONFIG_USERSPACE가 없는 빌드나 GAU ADC 노드가 활성화된 NXP RW61x 이외의 SoC에서는 이러한 권한 경계로 인한 노출이 발생하지 않습니다. 해당 환경에서는 동일한 결함이 애플리케이션 자체가 undersized 버퍼를 전달할 때 침묵하는 오버플로우(silent overflow)만 유발합니다.
해결책은 ad-hoc 검사를 공유 adc_sequence_validate_buffer() 헬퍼 함수(num_channels * sizeof(uint16_t)에 대해 유효성 검사)로 대체하고, results_length에 buffer_size / sizeof(uint16_t)를 저장하며, 루프 경계를 후감산(post-decrement) 방식으로 수정하여 정확히 사용 가능한 슬롯 수만큼만 작성되도록 합니다.
If you want to get best quality of vulnerability data, you may have to visit VulDB.