每条 MFT 记录都在两个独立的属性 —— $STANDARD_INFORMATION 和 $FILE_NAME —— 中分别保存四个时间戳,记录的是同样的四个时刻:
- 创建 —— 文件首次写入卷的时刻
- 修改 —— 内容最近一次变化的时刻
- 访问 —— 文件最近一次被读取的时刻
- MFT 修改 —— 记录本身最近一次被改动的时刻
也就是说,每条记录有八个值。它们并不总是同步的。
为什么会有两组
$STANDARD_INFORMATION(SI)在每一次常规文件操作时都会被更新。$FILE_NAME(FN)最初是为 POSIX 兼容性而引入,更新频率要低得多 —— 通常仅在创建、重命名或跨目录移动时才会变动。
实务上,SI 时间戳会持续跳动,而 FN 时间戳保持稳定。
时间篡改会留下指纹
修改时间戳的工具通常调用 Windows 的 SetFileTime API。它写入的是 SI,不会改动 FN。
经过 timestomping 之后,SI 显示的是攻击者所选择的值 —— 通常会回拨数年 —— 而 FN 仍保留真正的创建时间,有时差距相当大。
在取证排查中要留意的两种模式:
- SI 创建时间早于 FN 创建时间。文件不可能在被命名之前就存在,这在自然情况下不会发生。
- 对于明显没有被重命名或移动过的文件,SI 和 FN 的修改时间相差超过几秒。
任一现象都是元数据被操纵的强烈信号。
时间精度也能告诉你更多
NTFS 以 100 纳秒精度保存时间戳,而许多 timestomping 工具会四舍五入到整秒。一个以 .0000000 UTC 结尾的时间戳值得怀疑 —— 真实的 Windows 活动通常会保留秒以下的精度。