← 返回博客

为什么 NTFS 给取证的远比 FAT 多得多

· 阅读 2 分钟

FAT 与 NTFS 解决同一个问题:跟踪哪些簇属于哪个文件。两种文件系统给出的答案非常不同,而这种差异正是现代 Windows 取证拥有今日这套工具链的全部原因。在 FAT 上,你通常能证明一个文件曾经存在过。在 NTFS 上,你通常还能证明它里面有什么、何时被触碰、谁链接到它、之后又发生了什么。

FAT 的运作方式,一段话

FAT 维护一张单一的表,每个条目把一个簇映射到文件里的下一个簇、一个链尾标记,或者值 0,表示空闲。另一项独立的目录条目把文件名和文件的第一个簇配对。读取文件就沿链走。删除文件时,FAT 把整条链上的簇条目都清成 0,并把目录条目中文件名的第一个字符替换为 0xE5。数据留在原处,但 链本身被破坏了:你能恢复第一个簇与部分文件名,但与后续簇的关联已经丢失。

最后一句就是 FAT 恢复的全部问题。FAT 恢复工具可以找到文件片段。但当文件在磁盘上被分散过,就无法可靠地把它们重新拼起来。顺序写入的文件(相机、录音机写出的一个大 WAV)能完整回来;碎片化的文件(任何 Office 文档、随时间写入的任何文件、半满卷上的任何文件)能回来一部分,或者完全回不来。

NTFS 的运作方式

NTFS 用 Master File Table 取代了分配表——一张表里,所有其他文件至少有一条 1,024 字节的记录描述它们。每条记录是一个带类型属性的小容器:$STANDARD_INFORMATION$FILE_NAME$DATA$INDEX_ROOT 等,详见 属性参考

关键在于,$DATA 不是指向"第一个簇"再依赖单独的表去串链。它直接携带完整的 runlist:一连串(起始 LCN、长度)对,覆盖该文件的每一个分片。删除文件不会破坏这份列表。这份列表就住在记录里,记录在被别的东西认领之前一直留着。

这就是为取证改变一切的那个单一设计决策。

取证因此改变了什么

已删除文件保留 runlist。 在 MFT 槽位被复用之前,你可以读出已删除文件的 runlist,走到它的簇上(分配器可能还没把它们派出去),即使文件高度碎片化也能重建数据。FAT 做不到。

每条记录八个时间戳,其中两个对篡改有一定抵抗力。 $STANDARD_INFORMATION$FILE_NAME 各持四个时间戳。SI 几乎每次操作都会动;FN 在创建后保持稳定。两组互为参照。它揭示的 timestomping 信号见 四个 MFT 时间戳。FAT 只有一个创建时间戳、一个修改时间戳(DOS 时间格式,粒度 2 秒),以及一个可选的访问日期。没有交叉校验、没有细粒度、对简单 timestomping 没有任何防御。

小文件的常驻数据。 数据约小于 700 字节的文件完全存在于自己的 MFT 记录里。恢复记录就恢复了文件,根本不用碰数据区。这就是一个一个月前被删除、数据簇已被覆盖的小文本文件依然能完好返回的机制。见 resident data

硬链接与 ADS。 单条 MFT 记录可以有多个 $FILE_NAME 属性(硬链接)以及多个 $DATA 属性(主数据流,加上 备用数据流)。这些为取证提供的证据极丰富,而 FAT 没有任何对等物。ADS 是攻击者藏载荷的地方。硬链接是一种让同一文件以不同父引用出现在多个目录里的手段,对追踪持久化机制很有用。

日志。 变更日志 $UsnJrnl 记录每一次元数据操作:创建、删除、重命名、数据覆盖,配上时间戳与原因。$LogFile 记录事务级细节。FAT 两者都不记录。

安全描述符。 $Secure 集中存放 ACL;每个文件按 ID 引用其 ACL。取证相关:你能证明谁拥有访问权限,以及 ACL 何时被修改(SetSecurityInfo 写入 SECURITY_CHANGE 的 USN reason)。FAT 没有按文件权限的概念。

Reparse points。 符号链接、junction、挂载点、OneDrive 占位符、重复数据删除的桩,以及 WSL 的 POSIX 元数据,全都在 $REPARSE_POINT 属性里。FAT 无法表达这些;依赖 reparse points 的现代 Windows 功能在 FAT 卷上根本不工作。

总体效果:如果你在同一事件的 FAT 镜像与 NTFS 镜像之间二选一,NTFS 镜像几乎总能回答更多问题。常常是一个数量级。

你仍会遇到 FAT 的地方

FAT 没死。你仍会在以下地方碰到它:

  • 出厂格式化的 USB 闪存(更大的用 exFAT,较小的用 FAT32)。
  • 每一台 UEFI Windows 安装的 EFI 系统分区(FAT32,约 100–300 MB,承载 Windows Boot Manager)。
  • 相机、无人机、嵌入式设备里的 SD 卡。
  • 较老的工业控制器以及仍以 FAT 作为可移动存储默认值的一长串嵌入式 Linux。
  • 一些与 Windows 共享的 Mac 格式化卷(exFAT)。

任何现代 Windows 机器的系统卷上,你看到的都是 NTFS。ReFS 出现在部分服务器安装与存储空间中,但不在引导盘上。你要的工件是 $MFT

简单说一下 exFAT

exFAT 是介于两者之间的情况。Microsoft 用它取代了在超过 FAT32 实际 32 GB 限制的卷上的 FAT32。它使用带簇链的现代分配表,但没有日志、没有 MFT、没有 ADS、没有硬链接、没有安全描述符。从取证视角看,它更接近 FAT 而不是 NTFS。你能拿到时间戳(比 FAT 更细)、簇链以及目录条目。你拿不到 NTFS 取证之所以有价值的那些东西。

当你在重要的可移动设备上看到 exFAT 时,工具链就要切换:用 PhotoRec 与 scalpel 做签名 carving,用 Sleuth Kit 的 fsstatfls 处理那点有限的结构,并在报告里坦诚地说明工件集合是有限的。

一个实务后果

有时候有人会问,为什么他们用 FAT 格式化的 U 盘相比同一事件中的 NTFS 卷能取出的东西如此之少。诚实的答案是结构性的:文件系统在事件发生数年前就决定了会留下哪些证据。格式选择本身就是一个取证变量,习惯于从 Windows 桌面取工件的人,看到 exFAT 相机卡时会大失所望。

如果你能控制选择(公司基线、实验室的镜像介质),选 NTFS。如果不能(在你未指定的目标上做事件响应),就接受限制,调整工具链。

延伸阅读

外部资源