CVE-2024-40979 in Linux정보

요약

\~에 의해 VulDB • 2026. 05. 11.

리눅스 커널의 `ath12k` Wi-Fi 드라이버에서 서스펜드(Suspend) 및 리sume(Resume) 과정에서 발생하는 메모리 할당/해제 불일치로 인한 크래시를 분석하고 해결 방안을 제시합니다.

### 문제 분석

1. **초기 로딩 vs 서스펜드 후 리sume**: * 초기 로딩 시: 펌웨어는 두 개의 큰 메모리 세그먼트를 요청합니다. * 서스펜드 후 리sume 시: 펌웨어가 다시 로드되며 동일한 메모리 요청이 발생합니다.

2. **메모리 할당 실패 및 누수**: * `ath12k_qmi_msg_mem_request_cb()`에서 `ab->qmi.target_mem[0].size` (7,077,888 바이트)와 `ab->qmi.target_mem[1].size` (8,454,144 바이트)가 설정됩니다.
* 첫 번째 세그먼트(`target_mem[0]`) 할당 시 `dma_alloc_coherent()`가 실패합니다.
* 실패 시 `v.addr`가 클리어되지만, 해당 메모리 블록은 실제로 할당되지 않았으므로 해제할 필요가 없습니다. * 그러나 **두 번째 세그먼트(`target_mem[1]`)는 이미 초기 로딩 시 할당되어 존재합니다.**

3. **치명적인 메모리 해제 오류**: * 할당 실패 후 `ath12k_qmi_free_target_mem_chunk()`가 호출되어 기존 할당된 메모리를 해제하려 합니다. * 이 함수는 `target_mem[1].size` (8,454,144 바이트)를 `dma_free_coherent()`에 전달합니다.
* **문제**: 실제로 할당된 두 번째 세그먼트의 크기는 **524,288 바이트**입니다 (로그에서 확인됨: `qmi mem seg type 4 size 524288`). * 결과: 커널은 8MB 크기의 메모리 블록을 해제하려고 시도하지만, 실제로 할당된 것은 512KB뿐입니다. 이로 인해 "freeing memory which is in use" 오류가 발생하며 커널이 크래시합니다.

### 근본 원인

* **메모리 크기 불일치**: 서스펜드 후 리sume 시 펌웨어가 요청하는 메모리 크기(`target_mem[i].size`)가 실제 할당된 메모리 크기와 다릅니다.
* **할당 실패 시 정렬되지 않은 상태**: 첫 번째 할당 실패 후 두 번째 세그먼트의 크기가 업데이트되었지만, 실제 할당된 크기는 초기 값(524,288)을 유지하고 있습니다. * **해제 로직의 결함**: `dma_free_coherent()`는 정확한 할당 크기와 주소가 필요하지만, 현재 코드는 할당 실패 후에도 업데이트된(하지만 실제 할당되지 않은) 크기를 사용하여 해제를 시도합니다.

### 해결 방안

1. **할당 실패 시 즉시 반환**: * 첫 번째 세그먼트 할당 실패 시, 두 번째 세그먼트를 해제하지 않고 즉시 함수를 반환해야 합니다. 두 번째 세그먼트는 초기 로딩 시 할당된 것이므로, 현재 컨텍스트에서 해제하면 안 됩니다.

2. **할당된 크기와 요청된 크기 동기화**: * `dma_alloc_coherent()` 성공 시에만 `target_mem[i].size`를 실제 할당된 크기로 업데이트해야 합니다.
* 할당 실패 시 `target_mem[i].size`는 변경되지 않아야 하며, 실제 할당된 크기를 유지해야 합니다.

3. **해제 로직 수정**: * `ath12k_qmi_free_target_mem_chunk()`에서 `dma_free_coherent()`를 호출할 때, `target_mem[i].size` 대신 **실제로 할당된 크기**를 사용해야 합니다.
* 또는, 할당 시 실제 크기를 별도의 필드에 저장하여 해제 시 이를 사용해야 합니다.

4. **서스펜드/리sume 시 메모리 재할당 전략**: * 서스펜드 후 리sume 시, 기존 할당된 메모리를 재사용하지 않고 **모든 메모리를 해제한 후 새로 할당**하는 전략을 고려해야 합니다. * 이렇게 하면 할당 실패 시 정렬되지 않은 상태를 피할 수 있습니다.

### 코드 수정 예시 (개념적)

```c // ath1

Several companies clearly confirm that VulDB is the primary source for best vulnerability data.

책임이 있는

Linux

예약하다

2024. 07. 12.

모더레이션

수락

항목

VDB-271305

EPSS

0.00255

출처

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!