{"id":30347,"date":"2026-09-29T08:30:59","date_gmt":"2026-09-29T00:30:59","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-18413"},"modified":"2026-09-29T08:30:59","modified_gmt":"2026-09-29T00:30:59","slug":"cve-2026-18413","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-18413","title":{"rendered":"CVE-2026-18413 [HIGH] &#8211; The ADC API requires each driver to reject a sampling sequence whose destination buffer is"},"content":{"rendered":"<p>The ADC API requires each driver to reject a sampling sequence whose destination buffer is too small: the buffer_size field of struct adc_sequence in include\/zephyr\/drivers\/adc.h documents that &#8220;the driver must ensure that samples are not written beyond the limit and it must return an error if the buffer turns out to be not large enough&#8221;. The NXP MCUX LPADC driver did not honour that contract. mcux_lpadc_start_read() in drivers\/adc\/adc_mcux_lpadc.c performed no buffer-size check at all before assigning data-&gt;buffer = sequence-&gt;buffer. Each completed conversion then stores one 16-bit sample per enabled channel per sampling round through an unbounded *data-&gt;buffer++: in mcux_lpadc_isr() for interrupt-driven builds, and in mcux_lpadc_dma_callback() for DMA-driven builds on releases that have the DMA path. A sequence selecting two channels with a two-byte buffer, for example, has its second sample written past the end of the buffer.<\/p>\n<p>On a build with CONFIG_USERSPACE, adc_read() and adc_read_async() are system calls. The handler in drivers\/adc\/adc_handlers.c copies the sequence in from user memory, verifies only that [buffer, buffer + buffer_size) is writable by the calling thread, and rejects a user-supplied options-&gt;callback; it deliberately leaves the size arithmetic to the driver. A user-mode thread that has been granted access to an LPADC device object therefore fully controls channels, buffer, buffer_size and options-&gt;extra_samplings, and can request far more samples than its buffer can hold: up to channels * 65536 samples into a two-byte buffer, since the sample pointer is only rewound on a repeat sampling, never on the extra samplings of a sequence.<\/p>\n<p>The resulting stores are performed by the driver in kernel mode (in the ADC interrupt handler or the DMA completion callback), where the MPU does not restrict the thread&#8217;s memory domain, so the write walks linearly out of the user partition and into adjacent memory such as other partitions, kernel data or thread stacks. The impact is kernel-memory corruption of attacker-chosen length at an attacker-chosen offset, a plausible privilege-escalation and denial-of-service primitive from an unprivileged user-mode thread. Builds without CONFIG_USERSPACE are affected only as a caller-side robustness defect, since the application itself supplies the buffer.<\/p>\n<p>The fix calls the new shared helper adc_sequence_validate_buffer() in drivers\/adc\/adc_common.c from mcux_lpadc_start_read(). The helper computes active_channels  sizeof(uint16_t)  (1 + extra_samplings) and returns -ENOMEM before any sampling is started.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The ADC API requires each driver to reject a sampling sequence whose destination buffer is too small: the buffer_size field of struct adc_sequence in include\/zephyr\/drivers\/adc.h documents that &#8220;the d<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-30347","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/30347","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=30347"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=30347"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=30347"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}