深入解析OSX Spotlight系统漏洞挖掘与文件解析机制

本文详细分析了macOS Spotlight系统的运行机制,包括其通过fsevents监听文件事件、mdworker进程的文件解析流程,以及如何通过mdimport工具进行模糊测试和漏洞挖掘的技术细节。

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文件实际上是包含二进制文件的包,正是我们关注的安全目标。

崩溃分析

崩溃日志包含有价值的信息,例如:

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查找对应文件。崩溃的UTI(Uniform Type Identifier)也显示在日志中,本例中是com.apple.truetype-datafork-suitcase-font

漏洞调试

当发现漏洞时,可以使用lldb调试mdimport。关键函数是GetMetadataForFileGetMetadataForURL,它接收文件路径并返回元数据字典。

在分析的漏洞案例中,Font.mdimporter导入器在解析恶意构造的.dfont字体文件时崩溃。调试显示程序使用了文件中的未经验证的值作为偏移量,导致非法内存访问。

模糊测试建议

在macOS上进行模糊测试时,建议:

  1. 在"系统偏好设置->Spotlight->隐私"中添加测试文件夹
  2. 或使用mdutil -i off完全禁用Spotlight
  3. 从不同文件夹运行模糊测试工具

Spotlight系统包含丰富的功能和自己特有的查询语言,是一个值得深入研究的攻击面。许多导入器包含独特的代码逻辑,而非仅仅依赖框架库,这增加了潜在的攻击可能性。

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