[하루한줄] 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_size0x11을 더한 크기만큼 kmalloc으로 할당합니다. 이 때 supplied_size 크기에 대한 검증이 없어 integer overflow가 발생할 수 있습니다.

EX) supplied_size0xffffffff면 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 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.