深入探索Spotlight:macOS文件索引系统的安全攻击面

本文详细分析了macOS Spotlight系统的安全机制,包括其通过fsevents监听文件事件、mdworker进程的文件解析过程,以及如何通过mdimport进行模糊测试和漏洞挖掘,揭示了文件类型导入器的潜在攻击面。

凝视聚光灯:探索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。以下命令显示我笔记本电脑上存在的导入器列表。它显示一些第三方应用程序安装了自己的导入器。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$ mdimport -L
2017-07-30 00:36:15.518 mdimport[40541:1884333] Paths: id(501) (
    "/Library/Spotlight/iBooksAuthor.mdimporter",
    "/Library/Spotlight/iWork.mdimporter",
    "/Library/Spotlight/Microsoft Office.mdimporter",
    "/System/Library/Spotlight/Application.mdimporter",
...
    "/System/Library/Spotlight/SystemPrefs.mdimporter",
    "/System/Library/Spotlight/vCard.mdimporter",
    "/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Library/Spotlight/MZSpotlight.mdimporter",
    "/Applications/LibreOffice.app/Contents/Library/Spotlight/OOoSpotlightImporter.mdimporter",
    "/Applications/OmniGraffle.app/Contents/Library/Spotlight/OmniGraffle.mdimporter",
    "/Applications/GarageBand.app/Contents/Library/Spotlight/LogicX_MDImport.mdimporter",
    "/Applications/Xcode.app/Contents/Library/Spotlight/uuid.mdimporter"
)

这些.mdimporter文件实际上只是包含二进制文件的包。这些二进制文件正是我们攻击的目标。

使用mdimport很简单 - mdimport <file>。Spotlight只会为具有关联导入器的文件类型索引元数据。文件类型通过magic标识。例如,mdimport从MAGIC环境变量读取或使用/usr/share/file/magic目录,该目录包含编译的.mgc文件和实际的magic模式。magic文件的格式在官方Apple开发人员文档中讨论。

崩溃文件

需要注意的一点是,崩溃日志将包含有关原因的一些有用信息。以下消息由mdworker和mdimport记录,它们共享许多相同的代码:

1
2
Application Specific Information:
import fstype:hfs fsflag:480D000 flags:40000007E diag:0 isXCode:0 uti:com.apple.truetype-datafork-suitcase-font plugin:/Library/Spotlight/Font.mdimporter - find suspect file using: sudo mdutil -t 2682437

2682437是磁盘上相关文件的iNode引用号。mdutil的-t参数将要求它基于卷ID和iNode查找文件并输出字符串。它在伪目录/.vol/<Volume ID>/<File iNode>上执行open和fcntl。您可以通过stat系统调用查看文件的信息。

1
2
3
4
5
6
7
$ stat /etc
16777220 418395 lrwxr-xr-x 1 root wheel 0 11 "Dec 10 05:13:41 2016" "Dec 10 05:13:41 2016" "Dec 10 05:15:47 2016" "Dec 10 05:13:41 2016" 4096 8 0x88000 /etc

$ ls /.vol/16777220/418395
afpovertcp.cfg    fstab.hd            networks          protocols
aliases           ftpd.conf           newsyslog.conf    racoon
aliases.db        ftpd.conf.default   newsyslog.d       rc.common

导入器注册的UTI也显示为“com.apple.truetype-datafork-suitcase-font”。在这种情况下,崩溃是由格式错误的Datafork TrueType suitcase (.dfont)文件引起的。

当我们发现一个错误时,我们可以在lldb下研究它。使用崩溃文件作为参数在调试器下启动mdimport。在这个特定的错误中,它在/System/Library/Spotlight/Font.mdimporter导入器中因异常而中断。

下面的屏幕截图显示了问题过程,并突出显示了此特定错误的崩溃指令。

rsi寄存器指向内存映射的字体文件。读出一个值并存储在rax中,然后将其用作从rcx的偏移量,rcx指向内存中可执行文件的文本段。在硬编码表上进行查找,并从那里继续解析。从字体文件中读出的整数从未经过验证。

在编写或逆向Spotlight导入器时,首先要查看的主要符号是GetMetadataForFileGetMetadataForURL。此函数接收要解析的路径,并期望返回元数据作为CFDictionary。

从堆栈跟踪中,我们可以看到mdimport如何以及在哪里跳转到Font导入器中的GetMetadataForFile函数。模糊测试mdimport很简单,崩溃和信号很容易捕获。

macOS上存在的各种导入器有时会与框架库一起修补,因为代码是共享的。然而,许多代码是这些二进制文件独有的,代表了一个很好的攻击面。Spotlight系统广泛,包括自己的查询语言,是一个需要更多研究的绝佳目标。

在macOS上进行模糊测试时,通常禁用Spotlight对生成和删除输入样本的文件夹的监督。该文件夹可以添加到“系统偏好设置”->“Spotlight”->“隐私”中。您不能从此文件夹模糊测试mdimport,而是使用“mdutil -i off”禁用Spotlight,并从其他文件夹运行模糊测试器。

@day6reak

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计