Staring into the Spotlight
2017年11月15日 - John Villamil
Spotlight是OSX用户空间中无处不在的"洞察之眼"。它从内核喷涌出的文件事件流中汲取信息,并建立索引以备后续使用。这个由多个二进制文件和库组成的系统为用户提供了便捷的文件检索功能,同时也带来了有趣的攻击面。
发现异常崩溃
我们在/Users/<name>/Library/Logs/DiagnosticReports
目录中发现了一些有趣的崩溃记录。这些崩溃并非来自目标程序,而是来自Spotlight的mdworker
进程。当macOS中创建新文件时,内核会生成文件系统事件。Spotlight监听这些事件并立即解析新创建的文件以提取元数据。
fsevents工作机制
Spotlight系统由mds
守护进程管理,它通过读取/dev/fsevents
设备获取内核发出的文件系统事件流。与fseventsd
不同,mds
将这些事件分发给工作进程进行处理。mds
通过Mach消息与mdworker
进程通信,根据简单规则创建、监控和终止这些工作进程。
内核会对能够读取该设备的根级进程进行过滤。每个mdworker
进程被创建后解析文件、写入元数据信息,然后终止。mdworker
与命令行工具mdimport
共享大量代码,后者可用于调试和测试Spotlight导入器,因此成为审计和模糊测试的理想目标。
导入器机制
导入器位于以下路径:
/Library/Spotlight
/System/Library/Spotlight
- 应用程序包内的
/Contents/Library/Spotlight
使用mdimport -L
命令可以查看系统上安装的所有导入器。这些.mdimporter
文件实际上是包含二进制文件的包,正是我们关注的安全目标。
崩溃分析
崩溃日志包含有价值的信息,例如:
|
|
其中数字2682437
是文件在磁盘上的iNode编号。mdutil -t
命令可以通过卷ID和iNode查找对应文件。崩溃的UTI(Uniform Type Identifier)也显示在日志中,本例中是com.apple.truetype-datafork-suitcase-font
。
漏洞调试
当发现漏洞时,可以使用lldb
调试mdimport
。关键函数是GetMetadataForFile
或GetMetadataForURL
,它接收文件路径并返回元数据字典。
在分析的漏洞案例中,Font.mdimporter
导入器在解析恶意构造的.dfont
字体文件时崩溃。调试显示程序使用了文件中的未经验证的值作为偏移量,导致非法内存访问。
模糊测试建议
在macOS上进行模糊测试时,建议:
- 在"系统偏好设置->Spotlight->隐私"中添加测试文件夹
- 或使用
mdutil -i off
完全禁用Spotlight - 从不同文件夹运行模糊测试工具
Spotlight系统包含丰富的功能和自己特有的查询语言,是一个值得深入研究的攻击面。许多导入器包含独特的代码逻辑,而非仅仅依赖框架库,这增加了潜在的攻击可能性。