CVE-2022-50665 in Linux정보

요약

\~에 의해 VulDB • 2026. 06. 02.

리포트해 주신 내용을 바탕으로, `ath11k` 드라이버의 `ath11k_dp_rx_process_mon_status()` 함수에서 발생하는 크래시(Crash) 원인과 해결 방안을 분석하고, 수정된 코드 예시를 제시해 드리겠습니다.

### 문제 분석

1. **발생 현상**: * 커널 패닉 또는 Oops 로그가 발생하며, `ath11k_dp_rx_process_mon_rings` 함수 호출 중 실패했습니다. * Call Trace를 보면 RCU(RCU Read-Side Critical Section) 관련 함수(`rcu_read_lock_held_common`, `rcu_read_lock_sched_held`)가 호출된 후 `ath11k_dp_rx_process_mon_rings`에서 문제가 발생했습니다. 이는 일반적으로 **잘못된 메모리 접근(Uninitialized Memory Access)** 또는 **잘못된 포인터 dereference**로 인해 발생합니다.

2. **원인 추정**: * 보고된 해결책("Reset the default value to HAL_INVALID_PEERID each time after memset of ppdu_info...")을 보면, `ppdu_info` 구조체나 관련 메모리가 `memset`으로 초기화되었지만, **모든 필드가 적절히 초기화되지 않았거나**, `memset` 이후에도 일부 필드가 유효하지 않은 값(예: 이전 데이터의 잔여값)을 가지고 있을 가능성이 있습니다. * 특히 `HAL_INVALID_PEERID`는 Peer ID가 유효하지 않음을 나타내는 상수입니다. 만약 이 값이 초기화되지 않고 무작위 값으로 남아있다면, 이후 Peer ID를 기반으로 한 연산(예: Peer 테이블 조회)에서 잘못된 메모리 주소에 접근하여 크래시가 발생할 수 있습니다. * `memset`은 바이트 단위로 초기화하지만, 구조체 내 일부 필드(예: 포인터, 복잡한 구조체)는 `memset`으로만 완전히 초기화되지 않을 수 있으며, 논리적 초기화(예: ID 값 설정)가 별도로 필요할 수 있습니다.

3. **해결 방안**: * `ath11k_dp_rx_process_mon_status()` 함수 내에서 `ppdu_info` 구조체를 `memset`으로 초기화한 **직후**에, 관련 필드들(특히 Peer ID 관련 필드)을 명시적으로 `HAL_INVALID_PEERID`로 설정해야 합니다. * 다른 `memset`이 사용되는 부분에서도 유사하게 초기화 값을 명시적으로 설정하는 것이 좋습니다.

### 수정된 코드 예시

아래는 `ath11k_dp_rx_process_mon_status()` 함수에서 `ppdu_info`를 초기화할 때 `HAL_INVALID_PEERID`를 명시적으로 설정하는 예시입니다. 실제 코드 구조에 따라 변수명과 함수 호출 위치는 다를 수 있으므로, 해당 함수의 실제 구현에 맞게 조정해야 합니다.

```c #include <linux/skbuff.h> #include <linux/netdevice.h> #include "core.h" #include "dp.h" #include "hal.h"

// 가정: ath11k_dp_rx_process_mon_status 함수의 일부 void ath11k_dp_rx_process_mon_status(struct ath11k *ar, struct sk_buff *skb) {
struct ath11k_dp_rx_mon_status *mon_status; struct ath11k_ppdu_info ppdu_info; int ret;

// ... 기존 코드 ...

// ppdu_info 구조체 초기화 memset(&ppdu_info, 0, sizeof(ppdu_info));

// [수정 사항] memset 후 명시적으로 HAL_INVALID_PEERID로 초기화
// ppdu_info 구조체에 peer_id 필드가 있다고 가정합니다. // 실제 필드명은 ath11k 코드베이스에 따라 다를 수 있습니다. ppdu_info.peer_id = HAL_INVALID_PEERID;

// 다른 관련 필드들도 유효하지 않은 값으로 초기화 필요 시 설정 // 예: ppdu_info.vdev_id = HAL_INVALID_VDEV_ID; // 예: ppdu_info.ssn = 0;

// ... ppdu_info를 사용하는 로직 ...

// 예: ath11k_dp_rx_process_mon_rings(ar, &ppdu_info, skb); // ret = ath11k_dp_rx_process_mon_rings(ar, &ppdu_info, skb); // if (ret) {
// ath11k_warn(ar, "Failed to process mon rings: %d\n", ret); // return; // }

// ... 나머지 코드 ... } ```

### 추가 검토 사항

1. **`HAL_INVALID_PEERID` 정의 확인**: * `HAL_INVALID_PEERID`가 `ath11k` 코드베이스에서

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

책임이 있는

Linux

예약하다

2025. 12. 09.

모더레이션

수락

항목

VDB-334894

EPSS

0.00206

출처

Do you need the next level of professionalism?

Upgrade your account now!