这个故事的一个版本在安全文章中流传,其中一些现在是由人工智能助手生成的:macOS 的后台索引守护进程 mdworker 据说可以在您下载的任何 HTML 文件中获取远程图像,因此您从未打开的文件仍然可以向发送它的人报告您的 IP 地址。这是一个好故事。这也是一种在重复之前应该进行测试的说法,所以我们测试了它。
新文件会发生三种不同的情况
该主张模糊了三个独立的机制。当文件到达磁盘时,Spotlight 的元数据服务器将其交给导入器插件,在 mdworker_shared 进程内运行,该进程提取文本和属性,以便文件变得可搜索(导入 和 米德尔斯 是该文件的命令行窗口)。另外,当 Finder 需要图标时,快速查看缩略图 会呈现一个小缩略图。仅当您选择文件并按空格键时,快速浏览 才会呈现完整预览。其中每一个的行为都可能不同,因此每一个都需要自己的测试。
测试
我们在环回地址上运行了一个小型 HTTP 监听器,用它的 User-Agent 记录每个请求,然后在 ~/Downloads 中创建两个指向它的文件:一个带有单像素图像和外部样式表的 HTML 页面,以及一个带有嵌入外部图像的 SVG。 Loopback 使实验保持独立;远程跟踪服务器将收到相同的请求,以及您的公共 IP 地址。
<html><head><title>Q3 Financial Report</title></head><body>
<h1>Financial Summary</h1>
<img src="http://127.0.0.1:8765/html-img.png" width="1" height="1">
<link rel="stylesheet" href="http://127.0.0.1:8765/html-css.css">
</body></html><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100" height="100">
<image xlink:href="http://127.0.0.1:8765/svg-image.png" width="100" height="100"/>
</svg>1. 下载即可:Spotlight 索引
创建文件后,我们等待了 40 秒,然后确认 Spotlight 已将它们编入索引。听众什么也没收到。
mdls -name kMDItemContentType ~/Downloads/fireai-lab-test/q3-report.html
kMDItemContentType = "public.html"
# listener log: empty2. 强制Spotlight导入器
为了排除时间限制,我们手动运行导入程序。它使用Apple的RichText导入器,提取了37个属性,并且没有提出任何请求。
mdimport -t -d1 ~/Downloads/fireai-lab-test/q3-report.html
Imported '…/q3-report.html' of type 'public.html' with plugIn /System/Library/Spotlight/RichText.mdimporter.
37 attributes returned
# listener log: still empty3. Finder 图标:快速查看缩略图
qlmanage -t -s 256 -o /tmp ~/Downloads/fireai-lab-test/q3-report.html ~/Downloads/fireai-lab-test/badge.svg
* …/q3-report.html produced one thumbnail
Done producing thumbnails
# listener log: still empty4. 按空格键:快速查看预览
qlmanage -p 打开与在 Finder 中选择文件并按空格键 (质量管理) 相同的预览面板。这次,两个文件的监听器立即亮起:
qlmanage -p ~/Downloads/fireai-lab-test/q3-report.html
13:40:22.408 GET /html-img.png UA=Mozilla/5.0 (Macintosh; …) AppleWebKit/605.1.15 … Safari/605.1.15
13:40:22.408 GET /html-css.css UA=Mozilla/5.0 (Macintosh; …) AppleWebKit/605.1.15 … Safari/605.1.15
qlmanage -p ~/Downloads/fireai-lab-test/badge.svg
13:40:30.035 GET /svg-image.png UA=Mozilla/5.0 (Macintosh; …) AppleWebKit/605.1.15 … Safari/605.1.15| 用户做了什么 | 机制 | 远程请求? |
|---|---|---|
| 什么都没有(文件已下载) | 聚焦 mdworker_shared 中的导入程序 | 不 |
| 没有(强制导入) | mdimport,富文本导入器 | 不 |
| 看了看文件夹 | 快速查看缩略图(Finder 图标) | 不 |
| 选择文件,按空格键 | 快速查看预览 (WebKit) | 是:图像、样式表、SVG 图像 |
这意味着什么
“零点击”版本不是我们测量的:位于“下载”中的文件由 Spotlight 索引,并显示为未调出的图标。这很重要,因为建立在错误模型上的防御会在错误的地方浪费精力。例如,从网络中阻止 mdworker 不会改变此测试中的任何内容。
一键版本是真实的。 Quick Look 的预览使用 WebKit 渲染 HTML 和 SVG 并加载其远程资源,因此在附加的“报告”上按一下空格键即可告诉发件人该文件被查看、何时查看以及从哪个 IP 地址查看。这是网络信标,与电子邮件跟踪像素使用的技巧相同,Apple 的邮件隐私保护 的存在是为了在邮件中钝化;当相同的内容作为文件到达时,它根本不会被覆盖。用攻击者的话来说,这是侦察,而不是妥协:米特 ATT&CK T1598 在真正的攻击之前对这种信息收集进行分类。
本次测试的局限性
- 一个 macOS 版本 (26.7),每个案例运行一次。其他版本的行为可能有所不同;在您的计算机上重新运行它,上面的文件就是您所需要的。
- 我们使用了环回地址。公共 URL 对于 WebKit 的行为是相同的,但我们在这里没有对其进行测量。
- 我们测试了 HTML 和 SVG。具有远程引用的其他类型(例如
.webarchive、具有链接图像的 Office 文档或第三方快速查看扩展)未经测试,并且在任一方向上的行为可能有所不同。 qlmanage -p是 Apple 用于预览的调试前端; Finder 的空格键预览使用相同的框架,但我们没有检测 Finder 本身。
该怎么办
- 将快速查看不受信任的 HTML 或 SVG 文件视为打开它。如果您想安全地检查其中一个,请将其作为文本读取:
cat file.html,或在纯文本编辑器中打开它。 - 在预览之前检查文件的类型:
mdls -name kMDItemContentType file告诉您“快速查看”会将其呈现为什么,无论其图标表示什么。 - 观察哪个进程建立了连接,而不仅仅是是否发生了连接。这是代表 Apple 行事的 WebKit 预览版,这就是为什么只信任或不信任“您安装的应用程序”的规则会错过它。
更广泛的教训是关于方法。这个故事的戏剧版本写得很自信,很容易出版。二十分钟的聆听者和四个命令显示了哪里出了问题,以及真正的、较小的风险在哪里。
FireAI 和 HisnLabs 在其中扮演的角色
The fetch in this test came from a WebKit preview running on Apple’s behalf, not from an app you installed, which is exactly the kind of connection a per-app firewall exists to show you: FireAI lists the process, the destination and the country, and lets you deny it.
FireAI 是 HisnLabs 自己的产品:一款直接在 Mac 上运行的 AI 防火墙。它用通俗易懂的语言显示你的应用建立的每一个连接,并让你决定哪些数据可以离开你的 Mac——它的 AI 在本地运行,因此你的流量永远不会发送给我们或任何其他人。HisnLabs 的安全研究团队负责让这些判断保持准确:归类哪些域名只是普通的遥测、哪些属于真正的服务,追踪连接背后的国家和网络,并用真实的流量模式训练设备端模型(Autopilot 功能)——这一切都不会离开你的 Mac。
你可以阅读它背后的技术决策,或试用 FireAI 17 天:HisnLabs 出品的 FireAI。
