CVE-2026-18413 in Zephyr정보

요약

\~에 의해 VulDB • 2026. 09. 29.

ADC API는 각 드라이버가 목적지 버퍼 크기가 너무 작은 샘플링 시퀀스를 거부하도록 요구합니다: include/zephyr/drivers/adc.h에 있는 struct adc_sequence의 buffer_size 필드는 "드라이버는 샘플이 한계를 초과하여 기록되지 않도록 보장해야 하며, 버퍼가 충분히 크지 않은 경우 오류를 반환해야 합니다"라고 문서화하고 있습니다. 그러나 NXP MCUX LPADC 드라이버는 이러한 계약을 준수하지 않았습니다. drivers/adc/adc_mcux_lpadc.c의 mcux_lpadc_start_read() 함수는 data->buffer = sequence->buffer를 할당하기 전에 버퍼 크기 검사를 전혀 수행하지 않았습니다. 각 완료된 변환은 샘플링 라운드마다 활성화된 채널당 하나의 16비트 샘플을 무제한 *data->buffer++를 통해 저장합니다: 인터럽트 기반 빌드의 경우 mcux_lpadc_isr()에서, DMA 경로가 있는 릴리스의 경우 DMA 기반 빌드인 mcux_lpadc_dma_callback()에서 발생합니다. 예를 들어 두 채널과 2바이트 버퍼를 선택하는 시퀀스의 경우 두 번째 샘플이 버퍼 끝을 넘어 기록됩니다.

CONFIG_USERSPACE가 설정된 빌드의 경우 adc_read() 및 adc_read_async()는 시스템 호출입니다. drivers/adc/adc_handlers.c의 핸들러는 사용자 메모리에서 시퀀스를 복사하고, [buffer, buffer + buffer_size) 범위가 호출 스레드에 의해 쓰기 가능한지 여부만 검증하며, 사용자가 제공한 options->callback은 거부합니다; 이는 의도적으로 크기 산술 연산을 드라이버에 위임하는 것입니다. 따라서 LPADC 디바이스 객체에 대한 접근 권한이 부여된 사용자 모드 스레드는 채널, 버퍼, buffer_size 및 options->extra_samplings를 완전히 제어할 수 있으며, 샘플 포인터가 반복 샘플링 시에만 재설정되고 시퀀스의 추가 샘플링 시에는 재설정되지 않기 때문에(최대 channels * 65536개의 샘플을 2바이트 버퍼에 요청 가능) 자신의 버퍼가 수용할 수 있는 것보다 훨씬 많은 샘플을 요청할 수 있습니다.

결과적인 저장 작업은 MPU가 스레드의 메모리 도메인을 제한하지 않는 커널 모드(ADC 인터럽트 핸들러 또는 DMA 완료 콜백)에서 드라이버에 의해 수행되므로, 쓰기는 사용자 파티션 밖으로 선형적으로 진행되어 인접한 다른 파티션, 커널 데이터 또는 스레드 스택과 같은 메모리로 침투합니다. 그 영향은 공격자가 선택한 오프셋에서 공격자가 선택한 길이의 커널 메모리 손상이며, 이는 비권한 사용자 모드 스레드로부터의 가능한 특권 상승 및 서비스 거부(Denial-of-Service) 원시적 수단입니다. CONFIG_USERSPACE가 없는 빌드는 애플리케이션 자체가 버퍼를 제공하므로 호출자 측의 견고성 결함으로만 영향을 받습니다.

이 수정은 mcux_lpadc_start_read()에서 drivers/adc/adc_common.c의 새로운 공유 헬퍼 함수 adc_sequence_validate_buffer()를 호출합니다. 이 헬퍼는 active_channels * sizeof(uint16_t) * (1 + extra_samplings)을 계산하고, 샘플링 시작 전에 -ENOMEM을 반환합니다.

Once again VulDB remains the best source for vulnerability data.

책임이 있는

Zephyr

예약하다

2026. 07. 30.

모더레이션

수락

항목

VDB-411177

EPSS

0.00118

활동

낮음

출처

Do you know our Splunk app?

Download it now for free!