Функция драйвера цифрового аудиоинтерфейса Intel ALH dai_alh_get_properties() в драйверах/dai/intel/alh/alh.c использовала предоставленный вызывающей стороной intstream_id без проверки диапазона. Это значение индексирует массив static const uint8_t alh_handshake_map[64] фиксированного размера и масштабирует адрес регистра FIFO, поэтому значениеstream_id, находящееся вне диапазона, производит чтение за пределами допустимого диапазона одного байта с выбранным злоумышленником знаковым смещением от массива. Этот байт записывается в prop->dma_hs_id, а полученная структура dai_properties копируется обратно вызывающему объекту, передавая его.
dai_get_properties_copy() — это __syscall Zephyr, и его верификатор z_vrfy_dai_get_properties_copy() (drivers/dai/dai_handlers.c) проверяет только разрешение объекта устройства и буфер назначения, а неstream_id.
Таким образом, поток пользовательского режима, которому предоставлен доступ к объекту устройства ALH DAI, может вызвать системный вызов с произвольным идентификатором потока, пересекая границу пользовательского пространства/песочницы ядра. Результатом является раскрытие информации ядра с произвольным смещением по одному байту на вызов (и утечка вычисленного адреса ядра через fifo_address); stream_id, который разрешает ошибки несопоставленной страницы в контексте ядра, вызывая локальный отказ в обслуживании. Для эксплуатации требуется CONFIG_USERSPACE и доступ к устройству, что делает эту проблему локальной и средней серьезности.
Исправление заранее отклоняет отрицательные и слишком большие значенияstream_id и возвращает NULL, который оболочка копирования сопоставляет с -ENOENT.
Показать оригинальное описание (EN)
The Intel ALH digital-audio-interface driver function dai_alh_get_properties() in drivers/dai/intel/alh/alh.c used a caller-supplied int stream_id with no range validation. The value indexes the fixed-size static const uint8_t alh_handshake_map[64] array and scales a FIFO register address, so an out-of-range stream_id produces an out-of-bounds read of one byte at an attacker-chosen signed offset from the array. That byte is written into prop->dma_hs_id and the resulting struct dai_properties is copied back to the caller, leaking it. dai_get_properties_copy() is a Zephyr __syscall, and its verifier z_vrfy_dai_get_properties_copy() (drivers/dai/dai_handlers.c) validates only the device-object permission and the destination buffer, not stream_id. A user-mode thread that has been granted access to the ALH DAI device object can therefore call the syscall with an arbitrary stream_id, crossing the userspace/kernel sandbox boundary. The impact is a one-byte-per-call arbitrary-offset kernel information disclosure (and leakage of a computed kernel address via fifo_address); a stream_id that resolves to an unmapped page faults in kernel context, giving a local denial of service. Exploitation requires CONFIG_USERSPACE and device access, making this a local, moderate-severity issue. The fix rejects negative and too-large stream_id values up front and returns NULL, which the copy wrapper maps to -ENOENT.
Характеристики атаки
Последствия
Строка CVSS v3.1