凝视聚光灯:探索macOS Spotlight的安全攻击面
2017年11月15日 - 作者:John Villamil
Spotlight是macOS用户空间中无处不在的“眼睛”。它从内核喷发的文件事件流中汲取信息,并整齐地索引这些内容以供后续使用。它是二进制文件和库的混合体,所有这些都被巧妙地组合在一起,只为让用户能够 oversight 他们的机器。它提供了有趣的攻击面,这篇博文将解释其中部分工作原理。
某天,我们在/Users/<name>/Library/Logs/DiagnosticReports中发现了一些有趣的崩溃记录,但这些崩溃并非来自目标程序。在macOS中,每当创建文件时,都会生成文件系统事件并从内核发送下来。Spotlight监听此事件及其他事件,立即解析创建的文件以获取元数据。在对本地文件解析器进行模糊测试时,这些Spotlight崩溃开始从mdworker进程中出现。Spotlight试图索引每个变异的输入样本,意图稍后将它们包含在搜索结果中。
fsevents
Spotlight系统由mds监督。它打开并读取/dev/fsevents,该设备从内核流式传输文件系统事件信息。与fseventsd不同,它不将事件转储到磁盘,而是将事件转储到工作进程中,代表Spotlight进行解析。mds负责委派工作和管理mdworker进程,通过mach消息进行通信。它根据一些轻量规则创建、监控和终止mdworker。内核不会阻塞,通过fsevents设备流式传输的事件量可能很大。mds在处理更高事件量时会生成更多mdworker进程,但不能保证它能看到并捕获每个事件。
内核过滤哪些根级进程可以从此设备读取。
每个mdworker进程被生成,解析一些文件,写入元信息,然后死亡。Mdworker与mdimport共享大量代码,后者是其命令行等效工具。mdimport二进制文件用于调试和测试Spotlight导入器,因此是审计和模糊测试的绝佳目标。我们关于mdimport讨论的许多内容也适用于mdworker。
导入器
您可以使用以下命令查看mdworker在做什么:sudo fs_usage -w -f filesys mdworker
导入器可以在/Library/Spotlight、/System/Library/Spotlight或应用程序包内的/Contents/Library/Spotlight中找到。如果选择后者,应用程序通常会运行一个安装后脚本,使用mdimport -r <importer>和/或lsregister。以下命令显示我笔记本电脑上存在的导入器列表。它显示一些第三方应用程序安装了自己的导入器。
|
|
这些.mdimporter文件实际上只是包含二进制文件的包。这些二进制文件正是我们攻击的目标。
使用mdimport很简单 - mdimport <file>。Spotlight只会为具有关联导入器的文件类型索引元数据。文件类型通过magic标识。例如,mdimport从MAGIC环境变量读取或使用/usr/share/file/magic目录,该目录包含编译的.mgc文件和实际的magic模式。magic文件的格式在官方Apple开发人员文档中讨论。
崩溃文件
需要注意的一点是,崩溃日志将包含有关原因的一些有用信息。以下消息由mdworker和mdimport记录,它们共享许多相同的代码:
|
|
2682437是磁盘上相关文件的iNode引用号。mdutil的-t参数将要求它基于卷ID和iNode查找文件并输出字符串。它在伪目录/.vol/<Volume ID>/<File iNode>上执行open和fcntl。您可以通过stat系统调用查看文件的信息。
|
|
导入器注册的UTI也显示为“com.apple.truetype-datafork-suitcase-font”。在这种情况下,崩溃是由格式错误的Datafork TrueType suitcase (.dfont)文件引起的。
当我们发现一个错误时,我们可以在lldb下研究它。使用崩溃文件作为参数在调试器下启动mdimport。在这个特定的错误中,它在/System/Library/Spotlight/Font.mdimporter导入器中因异常而中断。
下面的屏幕截图显示了问题过程,并突出显示了此特定错误的崩溃指令。
rsi寄存器指向内存映射的字体文件。读出一个值并存储在rax中,然后将其用作从rcx的偏移量,rcx指向内存中可执行文件的文本段。在硬编码表上进行查找,并从那里继续解析。从字体文件中读出的整数从未经过验证。
在编写或逆向Spotlight导入器时,首先要查看的主要符号是GetMetadataForFile或GetMetadataForURL。此函数接收要解析的路径,并期望返回元数据作为CFDictionary。
从堆栈跟踪中,我们可以看到mdimport如何以及在哪里跳转到Font导入器中的GetMetadataForFile函数。模糊测试mdimport很简单,崩溃和信号很容易捕获。
macOS上存在的各种导入器有时会与框架库一起修补,因为代码是共享的。然而,许多代码是这些二进制文件独有的,代表了一个很好的攻击面。Spotlight系统广泛,包括自己的查询语言,是一个需要更多研究的绝佳目标。
在macOS上进行模糊测试时,通常禁用Spotlight对生成和删除输入样本的文件夹的监督。该文件夹可以添加到“系统偏好设置”->“Spotlight”->“隐私”中。您不能从此文件夹模糊测试mdimport,而是使用“mdutil -i off”禁用Spotlight,并从其他文件夹运行模糊测试器。
@day6reak