[하루한줄] CVE-2021-45608: NetUSB 원격 코드 실행 취약점
URL
https://www.sentinelone.com/labs/cve-2021-45608-netusb-rce-flaw-in-millions-of-end-user-routers/
Target
- Kcodes NetUSB
Explain
NetUSB는 프린터, 웹캠 등의 USB 디바이스를 네트워크상에서 사용할 수 있도록 하는 리눅스의 커널 모듈이며 Netgear, D-Link, Western Digital 등 여러 제조사의 수백만대의 라우터에서 사용합니다. 이러한 NetUSB 커널 모듈에서 integer overflow로 인한 원격 코드 실행 취약점이 발견되었습니다.
취약점은 0x805f
command로 호출되는 SoftwareBus_dispatchNormalEPMsgOut
함수에 존재합니다.
uVar17 = SoftwareBus_fillBuf(sbus_info, (char *)&supplied_size, 4);
if((int)uVar17 == 0) {
return;
}
allocated_region = (char *)__kmalloc(supplied_size + 0x11, 0xd0); // Vuln!
if((soft_bus_info *)allocated_region == (soft_bus_info *)0x0){
log_msg = "INFO%04X: Out of memory in USBSoftwareBus";
log_line = (char *)0x1156;
goto LAB_0001a8fc;
}
원격 PC에서 가져온 4byte supplied_size
에 0x11
을 더한 크기만큼 kmalloc
으로 할당합니다. 이 때 supplied_size
크기에 대한 검증이 없어 integer overflow가 발생할 수 있습니다.
EX) supplied_size
가 0xffffffff
면 integer overflow로 인해 커널 힙에 할당되는 크기는 0x10
할당된 커널 힙은 SoftwareBus_fillBuf
함수 및 역참조에서 사용됩니다.
allocated_region->cmd_shifted = cmd_shifted_;
allocated_region->partial_cmd = partial_cmd_;
allocated_region->allocated_size = supplied_size;
uVar14 = SoftwareBus_fillBuf(sbus_info, allocated_region->number_of_packets,4);
...
따라서 integer overflow로 인해 0x10
이하로 할당된 커널 힙에 Out-Of-Bound Write가 트리거되고 원격 코드 실행으로 이어질 수 있습니다.
제조사에서는 아래와 같이 supplied_size
값의 검증 루틴을 추가해 취약점을 패치했습니다.
if (supplied_size < 0x1000000) {
allocated_region = (int *)__kmalloc(supplied_size + 0x11, 0xd0);
...
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.