先分清语义再排时间
同一条文件记录上通常挂着四类时间:内容修改、访问、元数据变更、创建。它们由不同动作触发,含义完全不同:读文件刷新访问时间,改权限或改名刷新元数据变更时间,只有写入内容才刷新修改时间。时间线分析的前提就是把语义分清,否则「文件在 03:20 被访问」会被误读成「文件在 03:20 被写入」,事件顺序直接错位。ext4 与 NTFS 对四类时间的实现细节还有差异,需要分别对待。
语义对照
| 语义 | ext4 字段 | NTFS 字段 |
|---|---|---|
| 内容修改 | mtime | $STANDARD_INFORMATION 修改时间 |
| 访问时间 | atime | $SI Access |
| 元数据变更 | ctime | $SI MFT Changed |
| 创建时间 | crtime(支持有限,statx 暴露为 Birth) | $SI Creation / $FN 创建时间 |
基本信息
| 适用平台 | ext4(Linux)、NTFS(Windows)两大类文件系统 |
|---|---|
| 读取方式 | stat/statx(Linux)、MFT 解析(NTFS,$SI 与 $FN 属性) |
| 时间精度 | ext4 纳秒级(取决于内核与挂载选项),NTFS 100 纳秒 |
| 挂载影响 | noatime/relatime 会显著改变 atime 的更新行为 |
| 常见干扰 | 复制、解压、杀毒扫描、备份工具都会刷新部分时间戳 |
典型使用场景
- 判断文件是新建还是被修改:看创建时间与修改时间的相对关系
- 解释「文件明明没变,修改时间却更新」的情况
- 识别时间戳伪造:$SI 被改而 $FN 未同步
- 评估 atime 可信度:先确认挂载参数是否禁用了访问时间更新
- 把文件时间与日志事件对齐,确定操作先后顺序
- 为清理动作找痕迹:删除后元数据变更时间往往停在被删那一刻
快速查看
快速查看
# ext4 上的四类时间,stat 会输出 Access / Modify / Change / Birth
stat /etc/passwd
# 只取关键字段,便于批量采集
stat -c '%n mtime=%y ctime=%z atime=%x birth=%w' /usr/bin/* 2>/dev/null | head
# 确认挂载选项:relatime 下 atime 不会每次读取都刷新
findmnt -o TARGET,SOURCE,FSTYPE,OPTIONS -T /
# NTFS:$SI 时间可由工具改写,$FN 时间需解析 MFT 属性获取
# 两者不一致本身就是可疑信号,需用专门工具提取比对复制、解压、扫描类操作都可能刷新访问或修改时间。判读时结合具体场景:备份任务跑过之后整目录 mtime 变化,通常与被入侵无关。反之,一个目录内绝大部分文件 mtime 高度一致,往往说明是被整体复制或解压产生的。
NTFS 的 $STANDARD_INFORMATION 时间容易被工具直接改写(俗称 timestomp),$FILE_NAME 属性的时间只在重命名等操作时更新,两组时间记录在 MFT 的不同属性里,出现明显不一致时应优先怀疑时间戳被篡改。
ext4 的创建时间支持与内核及文件系统特性有关,部分环境读出来为空或为零,不能据此断定文件「不存在创建时间」,需要结合 inode 内容与其他来源判断。