CVE-2026-18414 in Zephyrinfo

Zusammenfassung

von VulDB • 28.09.2026

Die ADC-API verlangt von jedem Treiber, eine Abfolge zu verwerfen, bei der der Zielpuffer zu klein ist: Das Feld buffer_size in struct adc_sequence in include/zephyr/drivers/adc.h dokumentiert, dass „der Treicher sicherstellen muss, dass Samples nicht über das Limit hinaus geschrieben werden und einen Fehler zurückgeben muss, wenn sich der Puffer als nicht groß genug erweist“. Der ADI MAX32-Treiber hat diesen Vertrag nicht eingehalten. start_read() in drivers/adc/adc_max32.c verglich buffer_size (eine Byte-Anzahl) mit einer Sample-Anzahl ((1 + extra_samplings) * Kanäle), wobei sizeof(uint16_t) ignoriert wurde, sodass ein Puffer akzeptiert wurde, der nur halb so groß war wie erforderlich. Die Samples werden anschließend über uint16_t data->buffer durch Wrap_MXC_ADC_GetData() gespeichert, das zwei Bytes pro Sample schreibt und den Zeiger um einen uint16_t-Schritt vorrückt: in adc_max32_start_channel() für synchrone Lesevorgänge und in adc_max32_isr() für asynchrone. Eine Abfolge, die zwei Kanäle mit einem Zwei-Byte-Puffer auswählt, besteht beispielsweise diese Prüfung und ihr zweites Sample wird hinter das Ende des Puffers geschrieben.

Bei einer Kompilierung mit CONFIG_USERSPACE sind adc_read() und adc_read_async() Systemaufrufe. Der Handler in drivers/adc/adc_handlers.c kopiert die Abfolge aus dem Benutzerspeicher, überprüft nur, dass [buffer, buffer + buffer_size) vom aufrufenden Thread beschreibbar ist, und verwirft ein benutzerseitig angegebenes options->callback; er überlässt die Größenarithmetik bewusst dem Treiber. Ein Benutzermodus-Thread, der Zugriff auf ein MAX32 ADC-Geräteobjekt erhalten hat, kontrolliert daher vollständig Kanäle, Puffer, buffer_size und options->extra_samplings und kann den Treiber dazu bringen, doppelt so viele Bytes zu schreiben, wie sein Puffer fasst. Da die Prüfung mit extra_samplings skaliert, entspricht der Überlauf der Länge des Puffers selbst, bis zu channels * 65536 Byte hinter dessen Ende, da der Sample-Zeiger nur bei einer wiederholten Abfolge zurückgesetzt wird, nie jedoch bei den zusätzlichen Samples einer Abfolge.

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

Die Korrektur ersetzt diese Prüfung in start_read() durch einen Aufruf des neuen gemeinsamen Hilfsprogramms adc_sequence_validate_buffer() in drivers/adc/adc_common.c und übergibt sizeof(uint16_t) als Sample-Größe. Das Hilfsprogramm berechnet active_channels * sizeof(uint16_t) * (1 + extra_samplings) und gibt -ENOMEM zurück, bevor eine Abfolge gestartet wird.

Be aware that VulDB is the high quality source for vulnerability data.

Zuständig

Zephyr

Reservieren

30.07.2026

Veröffentlichung

29.09.2026

Moderieren

akzeptiert

Eintrag

VDB-411176

CPE

bereit

EPSS

0.00000

KEV

nein

Aktivitäten

very low

Quellen

Do you want to use VulDB in your project?

Use the official API to access entries easily!