[하루한줄] CVE-2021–38646: MS Office Legacy Library의 원격 코드 실행 취약점

URL

All Your (d)Base Are Belong To Us, Part 2: Code Execution in Microsoft Office (CVE-2021–38646)

Target

  • Microsoft Office

Explain

9월 Patch Tuesday에서 패치된 Microsoft Office의 원격 코드 실행 취약점에 관한 세부 정보가 공개되었습니다.

취약점의 원인은 Office에 포함된 데이터베이스 서비스인 Microsoft Access에 존재하는 레거시 데이터베이스 엔진 라이브러리입니다.

.text:1000E1CD                 push    eax             ; phkResult
.text:1000E1CE                 push    20019h          ; samDesired
.text:1000E1D3                 push    0               ; ulOptions
.text:1000E1D5                 push    offset SubKey   ; "Software\\\\Borland\\\\Database Engine"
.text:1000E1DA                 push    80000002h       ; hKey
.text:1000E1DF                 call    ds:RegOpenKeyExW
...
.text:1000E2BE                 push    edi
.text:1000E2BF                 push    eax
.text:1000E2C0                 push    offset aIdapi32Dll ; "\\\\IDAPI32.DLL"
.text:1000E2C5                 call    Mso20Win32Client_1065

MS Access는 DBF 파일을 데이터베이스 엔진 모듈 중 하나인 xBase ISAM에서 처리합니다. xBase ISAM의 ACEXBE.dll은 DBF 파일을 파싱할 때 Borland DataBase Engine(BDE) 라이브러리인 IDAPI32.dll 를 로드해 BDE 파일로 변환한 뒤 파싱합니다.

dBase : 파일 기반 데이터베이스(ISAM) 저장 방식의 DBMS로, 초기 데이터베이스 시장의 주류였으며 xBase라는 이름으로 표준화되었으나 네트워크 환경에 대응하지 못하다가 MySQL, PostgreSQL 등의 DBMS 등장으로 사장됨

DBF(dBase Table File Format) : dBase의 파일 포맷. MS Office, Apache OpenOpffice 등의 ISAM에서 레거시로 지원

BDE(Borland DataBase Engine) : MS Office에서 DBF 파일을 지원하기 위해 사용하는 Borland사의 dBase 레거시 데이터베이스 엔진

IDAPI32.dll 라이브러리는 2001년 마지막 버전이 릴리즈된 이후 더 이상 사용되지 않는 라이브러리이며 버퍼 오버플로우, OOB Write 등 여러 취약점이 수정되지 않은 채로 존재한 것이 확인되었습니다.

발견된 취약점들 중 exploitable한 취약점의 크래시는 아래와 같습니다.

(26ac.26b0): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=00000000 ebx=00000000 ecx=00000008 edx=00000021 esi=6bde36dc edi=00490000
eip=4de39db2 esp=00b4d31c ebp=00b4d324 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010202
IDDBAS32!BL_Exit+0x102:
4de39db2 f3a5            rep movs dword ptr es:[edi],dword ptr [esi]
0:000> k
 # ChildEBP RetAddr  
WARNING: Stack unwind information not available. Following frames may be wrong.
00 00b4d324 4de00cd8 IDDBAS32!BL_Exit+0x102
01 00b4d344 4de019f6 IDDBAS32!XDrvInit+0x1fb7c
02 00b4d370 4ddfc2a9 IDDBAS32!XDrvInit+0x2089a
03 00b4d4d0 4ddee2cd IDDBAS32!XDrvInit+0x1b14d
04 00b4d9d0 4dde2758 IDDBAS32!XDrvInit+0xd171
05 00b4da0c 4bdff194 IDDBAS32!XDrvInit+0x15fc
06 00b4dcc0 4bde5019 IDAPI32!ImltCreateTable2+0x3532
07 00b4de18 79587bb3 IDAPI32!DbiOpenTable+0xcd

크래시가 발생한 위치는 rep movs 로, ESI에서 EDIECX의 크기만큼 복사합니다. 해당 값들을 해커가 페이로드가 포함된 BDF 파일로 모두 제어할 수 있어 write-what-where이 가능하고, IDAPI32.dll에는 ASLR과 DEP 또한 적용되어 있지 않아 추가적인 우회 없이 코드 실행이 가능합니다.

해커는 이를 악용해 악성 페이로드가 포함된 DBF파일을 타겟 시스템에 배포해 원격 코드 실행을 트리거할 수있습니다.



본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.