В ядре Linux устранена следующая уязвимость: wifi: ath12k: исправлен сбой ядра во время возобновления работы В настоящее время во время воз…
В ядре Linux устранена следующая уязвимость: wifi: ath12k: исправлен сбой ядра во время возобновления работы В настоящее время во время возобновления работы память цели QMI обрабатывается неправильно, что приводит к сбою ядра, если не поддерживается переназначение DMA: BUG: Bad page state in process kworker/u16:54 pfn:36e80 page: refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x36e80 page dumped because: nonzero _refcount Call Trace: bad_page free_page_is_bad_report __free_pages_ok __free_pages dma_direct_free dma_free_attrs ath12k_qmi_free_target_mem_chunk ath12k_qmi_msg_mem_request_cb Причина в следующем: После загрузки модуля ath12k микропрограмма отправляет запрос памяти хосту. Если переназначение DMA не поддерживается, ath12k отклоняет первый запрос из-за сбоя при выделении с большим размером сегмента: ath12k_pci 0000:04:00.0: qmi firmware request memory request ath12k_pci 0000:04:00.0: qmi mem seg type 1 size 7077888 ath12k_pci 0000:04:00.0: qmi mem seg type 4 size 8454144 ath12k_pci 0000:04:00.0: qmi dma allocation failed (7077888 B type 1), will try later with small size ath12k_pci 0000:04:00.0: qmi delays mem_request 2 ath12k_pci 0000:04:00.0: qmi firmware request memory request Позже микропрограмма возвращается с большим количеством, но небольших сегментов, и выделение проходит успешно: ath12k_pci 0000:04:00.0: qmi mem seg type 1 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 1 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 1 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 1 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 1 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 1 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 1 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 1 size 262144 ath12k_pci 0000:04:00.0: qmi mem seg type 1 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 1 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 1 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 1 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 1 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 4 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 4 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 4 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 4 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 4 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 4 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 4 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 4 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 4 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 4 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 4 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 4 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 4 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 4 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 4 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 4 size 524288 ath12k_pci 0000:04:00.0: qmi mem seg type 4 size 65536 ath12k_pci 0000:04:00.0: qmi mem seg type 1 size 524288 Теперь ath12k работает. Если срабатывает приостановка, микропрограмма будет перезагружена во время возобновления работы. Как и прежде, микропрограмма сначала запрашивает два больших сегмента. В ath12k_qmi_msg_mem_request_cb() назначаются количество и размер сегментов: ab->qmi.mem_seg_count == 2 ab->qmi.target_mem[0].size == 7077888 ab->qmi.target_mem[1].size == 8454144 Затем выделение завершается неудачей, как и прежде, и вызывается ath12k_qmi_free_target_mem_chunk() для освобождения всех выделенных сегментов. Обратите внимание, что первый сегмент пропускается, потому что его v.addr очищается из-за сбоя выделения: chunk->v.addr = dma_alloc_coherent() Также обратите внимание, что это приводит к утечке этого сегмента, потому что он не был освобожден. При освобождении второго сегмента размер 8454144 передается в dma_free_coherent(). Однако помните, что этот сегмент выделяется при первой загрузке микропрограммы, перед приостановкой. Таким образом, его реальный размер составляет 524288, что намного меньше 8454144. В результате ядро обнаружило, что мы освобождаем некоторую память, которая используется, и поэтому происходит сбой. ---truncated---
Продукт делает неверные допущения об организации данных протокола или памяти на нижнем уровне, что приводит к непредвиденному поведению программы.
https://cwe.mitre.org/data/definitions/188.html →Открыть в коллекции CWE →Продукт не отслеживает должным образом и не освобождает выделенную память после её использования, делая память недоступной для повторного выделения и использования.
https://cwe.mitre.org/data/definitions/401.html →Открыть в коллекции CWE →| Продукт | Вендор | Статус |
|---|---|---|
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux | Отслеживается | |
| linux-5.10 | Отслеживается | |
| linux-5.10 | Отслеживается | |
| linux-5.10 | Отслеживается | |
| linux-allwinner-5.19 | Отслеживается | |
| linux-aws | Отслеживается | |
| linux-aws | Отслеживается | |
| linux-aws | Отслеживается | |
| linux-aws | Отслеживается |