[하루한줄] CVE-2021-32537: Realtek 드라이버의 OOB Access 취약점

URL

CVE-2021-32537: Out-of-bounds access in RTKVHD64 leading to pool corruption.

Target

  • Microsoft Surface Book/Pro
  • Lenovo Thinkpad
  • Dell XPS 13

Explain

Realtek의 오디오 드라이버에서 OOB Access 취약점이 발견되어 세부 정보 및 PoC가 공개되었습니다.

취약점은 오디오 드라이버 RTKVHD64.sys에서 발생합니다. 해당 드라이버는 초기화 중 PcAddAdapterDevice 함수의 파라미터인 StartDevice에 의해 호출된 InitDeviceExtension 함수에서 커널 풀에 MEVT 구조체를 할당합니다.

devext->unk->events = ExAllocatePoolWithTag(pooltype, 0x5F0ui64, 'mEvt');

struct EVT {
    PKSPIN_LOCK lock;
    PVOID       event;
    UINT64      someflag;
} /* sizeof == 0x18 */

struct MEVT {
    struct EVT array[63];
    UINT64 flags;
} /* sizeof == 0x18*63 + 8 == 0x5f0 */

MEVTEVT 구조체는 63개의 고정된 크기의 배열입니다.

input_index = *(_DWORD *)IrpSystemBuffer;
v5 = Crash(mevts, stack->FileObject, unk, &mevts->array[input_index].event,
        (KSPIN_LOCK *)&mevts->array[input_index]);

드라이버에 0x225f04 IOCTL 코드를 전송하면 유저버퍼인 IrpSystemBuffer의 첫 번째 DWORD 데이터가 input_index에 저장됩니다. input_index는 위 Crash 함수에서 (KSPIN_LOCK *)&mevts->array[input_index]와 같이 MEVTEVT 배열에 접근할 때 인덱스로 사용됩니다. 따라서 해커는 IOCTL 입력 버퍼를 통해 input_index를 임의의 값으로 설정할 수 있어 Out Of Bound Access로 이어집니다.