CVE-2026-18413 in Zephyrinfo

Zusammenfassung

von VulDB • 28.09.2026

Die ADC-API erfordert, dass jeder Treiber eine Abfolge von Messungen (Sampling Sequence) ablehnt, wenn der Ziel-Puffer zu klein ist: Das Feld `buffer_size` in der Struktur `adc_sequence` in include/zephyr/drivers/adc.h dokumentiert, dass „der Treiber sicherstellen muss, dass keine Samples über das Limit hinaus geschrieben werden und einen Fehler zurückgeben muss, falls sich der Puffer als nicht groß genug erweist“. Der NXP MCUX LPADC-Treiber hat diesen Vertrag nicht eingehalten. `mcux_lpadc_start_read()` in drivers/adc/adc_mcux_lpadc.c führte vor der Zuweisung von `data->buffer = sequence->buffer` überhaupt keine Prüfung auf Puffergröße durch. Jeder abgeschlossene Konvertierungsvorgang speichert dann pro aktivem Kanal und jeder Abfrage-Runde ein 16-Bit-Sample über einen unbeschränkten Zeiger (`*data->buffer++`) ab: in `mcux_lpadc_isr()` für interruptgesteuerte Builds und in `mcux_lpadc_dma_callback()` für DMA-gesteuerte Builds auf Versionen mit dem DMA-Pfad. Eine Abfolge, die zwei Kanäle mit einem Zwei-Byte-Puffer auswählt, schreibt beispielsweise das zweite Sample hinter das Ende des Puffers hinaus.

Bei einem Build mit CONFIG_USERSPACE sind adc_read() und adc_read_async() Systemaufrufe. Der Handler in drivers/adc/adc_handlers.c kopiert die Sequenz aus dem Benutzerspeicher, überprüft nur, dass [buffer, buffer + buffer_size) vom aufrufenden Thread beschreibbar ist, und lehnt ein benutzerseitig angegebenes options->callback ab; er überlässt die Größenarithmetik bewusst dem Treiber. Ein Benutzermodus-Thread, der Zugriff auf ein LPADC-Geräteobjekt erhalten hat, kontrolliert daher vollständig Kanäle, Puffer, buffer_size und options->extra_samplings und kann weit mehr Samples anfordern, als sein Puffer aufnehmen kann: bis zu channels * 65536 Samples in einen Zwei-Byte-Puffer, da der Sample-Zeiger nur bei einer wiederholten Messung zurückgesetzt wird, niemals jedoch bei den zusätzlichen Abfragen (extra samplings) einer Sequenz.

Die daraus resultierenden Schreibvorgänge werden vom Treiber im Kernelmodus ausgeführt (im ADC-Interrupt-Handler oder dem DMA-Abschluss-Callback), wo die MPU das Speicherdomänen des Threads nicht einschränkt, sodass der Schreibzugriff linear aus dem Benutzerbereich heraus in benachbarten Speicher wie andere Partitionen, Kernel-Daten oder Thread-Stacks führt. Die Auswirkung ist eine Korruption von Kernel-Speicher mit vom Angreifer gewählter Länge an einer vom Angreifer gewählten Offset-Position, ein plausibles Mittel zur Privilegieneskalation und zum Denial of Service (DoS) aus einem nicht privilegierten Benutzermodus-Thread heraus. Builds ohne CONFIG_USERSPACE sind nur als Robustheitsmangel auf Aufruferseite betroffen, da die Anwendung den Puffer selbst bereitstellt.

Die Korrektur ruft den neuen gemeinsamen Hilfsfunktion adc_sequence_validate_buffer() in drivers/adc/adc_common.c aus mcux_lpadc_start_read() heraus auf. Die Hilfsfunktion berechnet active_channels * sizeof(uint16_t) * (1 + extra_samplings) und gibt -ENOMEM zurück, bevor eine Messung gestartet wird.

If you want to get best quality of vulnerability data, you may have to visit VulDB.

Zuständig

Zephyr

Reservieren

30.07.2026

Veröffentlichung

29.09.2026

Moderieren

akzeptiert

Eintrag

VDB-411177

CPE

bereit

EPSS

0.00118

KEV

nein

Aktivitäten

very low

Quellen

Do you know our Splunk app?

Download it now for free!