Apple FSEvents相关的取证问题总结

xiaohui Web安全 2018年12月19日发布
Favorite收藏

导语:在这篇文章中,我们将介绍一下存储在磁盘中的苹果FSEvents日志的方方面面,包括FSEvents的背景信息和行为分析,主要涉及OS X以及iOS。

苹果FSEvents或文件系统事件对于每个苹果系统的安全审查员而言都是不可或缺的工具,通常,恶意软件在进行了非法操作之后,都会尝试删除其运行痕迹,而利用FSEvents,即使恶意软件已经将其操作痕迹完全清除了,我们仍可以轻松地获取到恶意文件的完整路径,创建和删除的日期。在这篇文章中,我们将介绍一下存储在磁盘中的苹果FSEvents日志的方方面面,包括FSEvents的背景信息和行为分析,主要涉及OS X以及iOS。

FSEvents简介

FSEvents或文件系统事件记录了文件系统对象,如安装在OS X中的卷上发生的文件和文件夹的更改事件,OS X中包括TimeMachine和Spotlight在内的多个工具都在使用它。

一开始,OS X 10.5和10.6版本仅捕获与文件夹相关的事件,等到OS X 10.7及以后的版本都引入了FSEvemts,它类似于Windows系统的NTFS更改日志,用于记录文件系统活动的全部记录,并将数据存储在UsnJrnl:$ J中。

当FSEvent日志被解析时,以前发生的文件系统事件,如文件,文件夹,符号链接和硬链接创建,删除,重命名,修改,权限更改等数据都可以被调出来审查。

可能对调查有价值的信息包括,安装和卸载外部驱动器和磁盘映像,用户配置文件目录中的活动,文档编辑,互联网活动,移动到垃圾文件的文件,下载的文件等等。

FSEvent日志存在的位置

在OS X的位置

在OS X上,FSEvent日志位于系统分区根目录中的“.fseventsd /”的隐藏文件夹中。请注意,默认情况下,该文件夹会在正在运行的Mac上的Finder中被隐藏,并且访问它需要提升用户的权限。

5.1.png

在iOS的位置

对于iOS设备来说,存在多个存储FSEvent日志的位置。请注意,通常需要越狱设备来获取FSEvent日志。 FSEvent日志位置包括:

1)系统:/.fseventsd'

2)数据:/private/var/.fseventsd'

3)开发人员补丁:/DeveloperPatch/.fseventsd'

包含用户首次使用设备之前的记录,如果操作系统在购买后被修补过,还可能包括修补程序活动。

在外部设备中的位置

对于插入Mac的外部设备来说,FSEvent日志将位于“.fseventsd /”目录中的设备的根文件夹中。然而,有几种特殊情况会导致外部设备虽然具有“.fseventsd /”文件夹,但文件夹中却没有记录的日志:

1.虽然外部设备已插入Mac,但设备已拔下电源,没有进行安全删除,这会导致FSEvent日志丢失。例如,用户直接从Mac中拔出usb,而不使用Finder中的卸载标识。

2.虽然将外部设备插入到Mac,设备也被安全卸载了,但是在操作系统完成将FSEvent写入磁盘之前,设备已拔下电源。

3.虽然外部设备已插入Mac,但日志文件与设备的文件系统存在兼容性问题。

FSEvent日志文件

'.fseventsd /'目录可以包含多达数百个日志文件,每个日志文件都会包含几天到几个月的历史文件系统和用户活动的日志。

单个日志文件的保存时间,取决于卷宗上所记录的运行操作数量,比如,系统更新,升级和应用程序安装往往会生成大量的FSEvent。

日志是以gzip存档,并使用以十六进制格式表示的特定命名标准命名。每个FSEvent日志的名称是由存储在FSevent日志文件中的最后一个事件ID加1标识的。

例如,使用下图中列出的第一个FSEvent日志,当文件名从十进制值“00000000000a4b3e”转换为十进制时,该值为674622。因此,此文件中的最后一个事件ID为674621,比674622小1。

5.2.png

FSEvent记录周期

FSEvent记录最初存储在内存中,当记录卷宗上的事件对象发生更改时,FSEvents API将检查对象是否已经使用它的相对完整路径分配了事件ID(包括事件ID在内的FSEvent记录的组件将在后面进行更详细的讨论)。如果没有为内存中的对象分配事件ID,则会分配一个事件ID,并将对象的相对完整路径,记录标志和事件ID存储在内存中。如果对象已经被分配了一个事件ID,API将更新记录标志以包括当前的更改。对于对象在内存中分配事件ID时所引起的每个后续更改,API会根据记录标志将更改对象合并并将其存储为对象的单个事件。

当FSEvents API确定内存缓冲区已满或已卸载卷宗时,就会以FSEvent日志文件的形式将事件刷新到磁盘。一旦刷新到磁盘,API将不会修改日志的内容。

如前所述,可以在单个FSEvent记录中记录多个更改,每个更改都会清楚记录对象发生了什么样的更改。例如,如果创建了用户桌面上的文本文件,然后修改,五分钟后再次修改,然后最终删除,这两个修改只会作为单个事件记录一次,解析文本文件的事件记录可能如下所示:

5.3.png

请注意,即使上面的FSEvent记录显示了发生了哪些更改,但更改的顺序也不会显示在日志中,这是由于FSEvent API API在记录更改时所施加的粒度不足而导致的结果。

FSEvent日志格式

FSEvent日志以gzip格式存储为压缩文件,文件解压缩后,可以使用十六进制编辑器打开文件,以便可以查看原始字符串。

5.4.png

FSEvent记录组件

每个FSEvent日志都包含代表卷宗上对象的历史更改记录,FSEvent日志中的每个记录包含三个主要组件:

5.5.png

完整的记录路径

记录完整路径是的引起更改文件系统对象的唯一相对完整路径。

记录事件ID

在苹果文档中,文件系统对象的完整路径只会为每个FSEvent日志分配一个事件ID。但是,它可以在多个日志中具有多个事件ID。

记录事件标志

事件标志存储在每个FSEvent记录中,并包含位标志:

· “记录完整路径”(类型标志):文件、文件夹、硬链接或符号链接;

· “记录完整路径”(原因标志)发生了什么变化:创建、删除、修改、重命名、权限、Inode元数据、Finder信息、挂载或卸载;

其他原因标志包括:最后一个硬链接被删除,结束事务和文档修订;

日志的十六进制组成

下面的示例来自包含驱动器上发生活动的USB解压缩的FSEvents日志。

日志的前12个字节分配给FSEvents日志文件页眉,并以 “1SLD”开头,一个FSEvents日志中可以有多个页眉,每个页面标题之后是事件的记录完整路径的开始。

在下图中,总共有三个事件,但我们在此只讨论第一个事件。第一个存储的事件在偏移0x0C处具有“My_File_1.txt”的记录完整路径。

5.6.jpg

每个记录完整路径末尾的空的终结符“0x00”表示的是完整路径的结尾,路径的空的终止符之后是记录的事件ID。对于我们示例中的第一个事件来说,位于偏移0x1a处。该记录的事件ID为0x01548d或十进制87181。

事件ID是记录标志,其存储在该事件的偏移量0x22处。解码记录标志不会被非常详细地覆盖,但是对于该事件,0x5505800的十六进制值表示这是已经被创建,修改,查找器信息被改变并且inode元数据被改变的文件。

FSEvent记录标志

在下表中涵盖了有关每个可能标志的信息,包括但不限于可能导致设置该标志的情况。

5.7.jpg

5.8.jpg

5.9.jpg

解析FSEvents

可以使用付费和开源工具来解析FSEvents。

FSEventParser是由G-C Partners开发的一款免费开源的基于Python的工具,它也能解析FSEvents。在GitHub上下载最新版本,网址为:https://github.com/dlcowen/FSEventsParser

在从要分析的卷宗中提取FSEvent日志之后,GitHub页面上提供了包含要使用的命令行选项的说明。

用法:FSEParser_v2.1.py -c CASENAME -s SOURCEDIR -o OUTDIR

1.-h,-help显示此帮助消息并退出

2.-c CASENAME当前会话的名称,用于命名标准

3.-s SOURCEDIR包含要解析的fsevent文件的源目录

4.-o OUTDIR用于存储解析报告的目标目录

一旦发出命令,解析器将提取位于命令提供的SOURCEDIR中的每个FSEvent日志文件中的记录,将解析的数据放入一个制表符分隔的tsv文件和位于所提供的OUTDIR中的SQLite数据库。

5.10.png

FSEventsParser里的信息导出

解析器完成解析后,可以使用Excel打开制表符分隔文件。 FSEvent记录使用的是记录完整路径的文件,并以字母顺序存储在日志中。要在解析信息导出时实现以时间顺序的排序,请按“event_id”列排序。但是请记住,时间顺序仅与对象发生第一次更改时相关。

5.11.png

FSEventsParser脚本还生成一个包含解析记录的SQLite数据库,这对于分析的记录超过100万的时候很有用。

相关案例介绍

所有讨论的事件都使用G-C Partners的FSEventParser工具进行解析,该工具将事件导出到SQLite数据库,这里列出的事件只会搜索到FSEvents日志中可以找到的内容。本文可以提供给你一个在这些日志中找到的内容的办法,解释如何生成这些事件的确切原因还需要我们再进行测试和验证。

垃圾活动

FSEvents日志文件会记录垃圾邮件活动,其中包括发送到垃圾箱和垃圾箱清空的文件。发送到垃圾箱的文件将包含“重命名”掩码。从“垃圾箱”中清空的文件将包含“已删除”掩码。

下图显示了发送到垃圾箱的文件和文件夹。请注意,在“掩码”列中,所有事件都包括“重命名”。 “重命名”掩码以两种方式分配给事件:

1.文件的名称已更改。

2.该文件从一个文件夹移动到另一个文件夹(仅限本地移动,不能跨卷宗移动)。

在垃圾箱文件夹下,当文件发送到垃圾箱时,会收到一个“重命名”掩码,因为它们已从卷宗上某个其他位置移动到垃圾箱。

5.12.png

SQLite查询示例

SELECT
*, _ROWID_ “NAVICAT_ROWID”
FROM
“fsevents”
WHERE
“filename” LIKE ‘Users/%/.Trash/%’

系统引导

系统启动时,苹果系统将挂载“/ home”和“/ net”。我们可以查询SQLite数据库以获取系统引导的大致日期列表。在下图中,仅查询“/ home”。

5.13.png

SQLite查询示例

SELECT
*, _ROWID_ “NAVICAT_ROWID”
FROM
“fsevents”
WHERE
(
“filename” = ‘/home’
OR “filename” = ‘/net’
)
AND “mask” LIKE ‘%mount%’

用户个人资料文件夹

用户个人资料中的活动也能被检测出来,比如从文档,下载和桌面活动。在下图中,一个文件夹被重命名,并在桌面上创建了两个DMG。在“下载”目录中,创建了一个ZIP文件。

请注意,这些文件的一些创建是由用户发起的,还有些是由应用程序或操作系统创建的。在下载目录中,.BAH.XSEHo,.DS_Store和M9hlK5RI.zip.part没有直接由用户创建或修改。

5.14.png

SQLite查询示例

SELECT
*, _ROWID_ “NAVICAT_ROWID”
FROM
“fsevents”
WHERE
(
“filename” LIKE ‘Users/%/Documents/%’
OR “filename” LIKE ‘Users/%/Downloads/%’
OR “filename” LIKE ‘Users/%/Desktop/%’
)
AND “filename” NOT LIKE ‘Users/%/Library/Caches/com.%’
AND “filename” NOT LIKE ‘Users/%/Library/Containers/com.%’
AND “filename” NOT LIKE ‘Users/%/Documents/Microsoft User Data/Office %’

安装卷宗

当驱动器插入时,操作系统将尝试安装它。当双击DMG时,操作系统将尝试安装它。挂载也记录在FSEvents中。

5.15.png

SQLite查询示例

SELECT
*, _ROWID_ “NAVICAT_ROWID”
FROM
“fsevents”
WHERE
“mask” LIKE ‘%mount%’
AND “filename” NOT LIKE ‘/net’
AND “filename” NOT LIKE ‘/home’

互联网活动

与互联网活动相关联的文件的名称会以网站地址或URL进行存储,这些文件的更改记录在FSEvents中。下图中列出的大多数网站是我们直接访问该网站的结果,其他网站似乎来自第三方网站,并没有直接访问。

5.16.png

SQLite查询示例

SELECT
*, _ROWID_ “NAVICAT_ROWID”
FROM
“fsevents”
WHERE
“filename” LIKE ‘Users/%/Library/Caches/Metadata/Safari/History/%’
OR “filename” LIKE ‘Users/%/Library/Application Support/Google/Chrome/Default/Local Storage/%’
OR “filename” LIKE ‘Users/%/Library/Safari/LocalStorage/%’

iOS中的案例分析

iCloud同步文件

从连接的iCloud帐户同步的文件由FSEvents记录。

5.17.png

SQLite查询示例

SELECT
*, _ROWID_ “NAVICAT_ROWID”
FROM
“fsevents”
WHERE
“filename” LIKE ‘mobile/Library/Mobile Documents/com~apple~CloudDocs/%’

互联网活动

还记录了移动设备上的互联网活动。

5.18.png

SQLite查询示例

SELECT
*, _ROWID_ “NAVICAT_ROWID”
FROM
“fsevents”
WHERE
“filename” LIKE ‘%websitedata/local%’

电子邮件活动

邮件活动包括收到的项目(收件箱),发送的项目(发送箱)和相关的附件名称也由FSEvents记录。

5.19.png

SQLite查询示例

SELECT
*, _ROWID_ “NAVICAT_ROWID”
FROM
“fsevents”
WHERE
“filename” LIKE ‘mobile/Library/Mail/%’

注意事项

在使用FSEvents时,这些注意事项包括:

1. FSEvents的丢失

2.日志缺少时间标识

3.外部设备对FSEvents的影响

4.反取证

5.合并多项事件的变更

FSEvent日志的丢失

有几种情况会导致FSEvent日志丢失或从卷宗中删除:

1.系统的硬复位

2.系统崩溃

3.未正确卸载卷宗

4.系统升级

在OS X上,当从卷宗中删除FSEvent日志时,它们将被分配。因此,可以使用数据恢复技术和分割工具分割gzip文件来分割FSEvent日志。

日志缺少时间标识

如前所述,FSEvent记录由三个组件组成:完整路径,记录标志和事件ID。请注意,时间标识并不在其中。

不过,可以从苹果系统日志文件的名称中提取数据的发生时间,并且可能会在FSEvent日志中记录其他文件的名称,以帮助确定事件发生的大致时间。

外部设备对FSEvents的影响

外部设备上的FSEvent可能特别不稳定。

1.当进行安全删除时,操作系统会将FSEvent记录写入设备。这可以通过观察装配在一些可移动设备上的读/写光来观察。在OS中启动安全删除后,指示灯将闪烁,并在完成后停止。如果在指示灯停止闪烁之前驱动器已拔下,则操作系统可能尚未完成磁盘写入,并且这些FSEvent记录可能会丢失并且无法恢复。

2.当外部设备已拔下但用户未执行安全删除时,存储在设备内存中的FSEvent也将丢失,不会写入外部设备。

3.如果驱动器使用EXFAT或FAT32格式化,则即便使用了安全删除也并不能确保将事件写入磁盘。确切的原因尚未确定,但是对于非hfs格式化的可移动设备,一直观察到有丢失的事件发生。

反取证

根据Apple上的文档说明,可以禁用卷上的FSEvent。在.fseventsd文件夹中存在名为“no_log”的文件是对卷宗的FSEvents已禁用的提示。 

合并多项事件的变更

FSEvent记录标志可以对文件或文件夹发生的多次更改进行记录,由于FSEvents API记录和存储的属性,确定每个单独变化发生的顺序以及发生这些更改的次数所需的粒度是不可能的。

使用FSEvents,我们只能确定对象的第一次更改发生的时间顺序。

美中不足的是FSEvents主要基于文件系统对象的相对完整路径存储更改对象,比如,我在桌面上创建了一个名为“example.zip”的文件。 在短时间内,该文件以任何方式被删除,然后再次创建具有完全相同名称和位置的另一个文件,这样在我的桌面上就是一个完全不同的文件。 但FSEvents API会将它们看作是同一个文件,因为它仅在记录更改时考虑相对完整路径。 所以即使“example.zip”创建了两次,是两个完全不同的文件,它只记录一次(请记住,这是在短时间内发生的)。

本文翻译自:http://nicoleibrahim.com/apple-fsevents-forensics/如若转载,请注明原文地址: https://www.4hou.com/web/15205.html
点赞 5
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论