理解 xattr -p com.apple.quarantine 的输出结果

7

前几天,我在处理一些文件时发现它们有扩展属性 com.apple.quarantine。我知道它的目的,但一直很好奇当你输出其值时下面的属性是什么意思。

例如,当我输入命令:

xattr -p com.apple.quarantine xmlrpc.php

对于一个有这种xattr的文件,我会得到如下输出:

0083;59b926ad;Safari.app;55847AA4-5562-42A2-89A7-8FAD394B455C

第一个4位数字代表什么?即0083。谷歌没有给出任何好的结果,我找到了一些用户尝试精确解释这些数字所代表的含义的指南。

1个回答

30
您可能已经知道,当代理(浏览器、邮件客户端等)将文件保存到您的计算机时,隔离标志会被设置。这是导致在您第一次尝试打开从互联网下载的应用程序时出现警告的原因。
所有这些信息都被存储,并且每个用户都有完整的历史记录。
前4位数字是一组标志,我预计在quarantine.h中定义,该文件似乎是包含在苹果开源代码copyfile.c中的一个私有头文件。
这些标志表示状态,例如文件是否被隔离。
仔细分析后,内核扩展quarantine.kext负责处理此事,并且在反汇编时,我们可以看到函数quarantine_get_flags。
以下只是内核扩展的一部分反汇编代码 enter image description here 请注意xattr输出的前4个标志的格式与_sscanf(rbx, "%04x;") == 0x1)。
这会调用quarantine_get_info函数。

enter image description here

我们可以看到这里的标志表示系统上文件的各种状态,其中vfs是虚拟文件系统,vnode是文件的基本表示结构。
至于其余的xattr输出,每个用户都有一个本地的sqlite3数据库,记录了每个下载的项目。它的位置是:

~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2

这个数据库只有一个表格LSQuarantineEvent。你可以在终端使用sqlite3命令读取所有数据。

sqlite3 ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2 "select * from LSQuarantineEvent;" 

如果您过滤结果(使用grep或其他替代工具),您将能够匹配后半部分{{xattr}}输出所组成的GUID,并且您将看到有关该特定下载的所有信息,包括哪个代理负责下载文件以及检索文件的URL。

在Ventura中,DB仍然存在于该路径(首选项,而不是设置),它仍然包含LSQuarantineEvent,但该表似乎是空的。 - undefined
@WGroleau听起来好像有什么东西为你清除了,但在我的macOS 13.5.2上仍然有很多应用程序在运行。我注意到Microsoft Teams的更新程序特别吵闹! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接