了解xattr -p com.apple.quarantine的输出

Sal*_*igi 3 macos terminal xattr

前几天我搞乱了一些扩展属性为com.apple.quarantine的文件.我知道它的目的,但我一直很好奇当你输出它的值时,下面的属性意味着什么.

例如,当我输入时

xattr -p com.apple.quarantine xmlrpc.php

对于具有所述xattr的文件,我得到如下输出:

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

前4位代表什么?也就是0083谷歌没有提出任何好的东西,我发现用户也试图找出这些数字的确切代表.

The*_*ght 14

您可能已经知道,当代理(浏览器,邮件客户端等)将文件保存到您的计算机时,会设置隔离标志.这是您首次尝试打开从Internet下载的应用程序时出现的警告的原因.

存储所有这些信息,并为每个用户提供完整的历史记录.

前4位数字是我期望定义的一组标志quarantine.h,它们似乎是Apple的开源代码中copyfile.c中包含的私有标头.

这些标志表示状态,例如文件是否被隔离.

仔细分析,内核扩展quarantine.kext负责处理这个,在反汇编时,我们可以看到函数quarantine_get_flags.

这里只是一个反汇编kext的片段 在此输入图像描述

注意使用_sscanf(rbx,"%04x;")== 0x1)格式化xattr输出的前4个标志

这叫quarantine_get_info.

在此输入图像描述

我们在这里可以看到,标志表示系统上文件的各种状态,vfs是虚拟文件系统,vnode是文件的基本表示结构.

至于xattr输出的其余部分,每个用户都有一个本地sqlite3数据库,用于记录下载的每个项目.它的位置是

〜/库/首选项/ com.apple.LaunchServices.QuarantineEventsV2

数据库只有一个表LSQuarantineEvent.您可以使用sqlite3终端中的命令读取所有数据

sqlite3 ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2 "select * from LSQuarantineEvent;" 
Run Code Online (Sandbox Code Playgroud)

如果您过滤结果(grep或替代),您将能够匹配构成xattr输出后半部分的GUID,并且您将看到有关该特定下载的所有信息,包括哪个代理负责下载文件,甚至是检索它的URL.