从 USN 日志还原用户活动时间线

三分钟的 $UsnJrnl 记录,通常就够你还原用户在做什么 — Office、浏览器、下载、写代码。如何把日志当作一份行为日志来读。

作者: 阅读约 2 分钟

"这台计算机在 14:00 到 16:00 之间发生了什么"这类问题,绝大多数都可以仅凭 USN 日志直接回答,无需其他痕迹。这些记录不是系统调用日志,也没有按用户标签,但它们提供了几乎同样有用的东西:机器触及的每个文件、按操作粒度的高频记录。配上几次案件积累出的模式知识,你就能按 Office 保存、浏览器跳转、IDE 重建、午休的粒度还原行为。

本文是把日志当作行为时间线来读的实操指南。

为什么这能行

Windows 桌面上多数用户可见的动作都会产生可辨识的文件系统签名。点击 Word 的"保存",Word 会写入一个临时文件、原子地重命名,并在结果上发出 BasicInfoChange | Close。在 Chrome 中打开新标签页,磁盘缓存会追加。运行一次 npm install,几秒内会冒出上千个 package.json 文件。

这些签名没有写在任何 Microsoft 参考文档中。靠的是看实验环境主机的日志,与已知活动作对照学出来。下面是一个起步集合,按我在案件中遇到的频率排序。

实际中的 Office

当用户保存 Word、Excel 或 PowerPoint 文件时,你会看到:

FileCreate | Close            ~$<filename>.docx     (锁文件)
FileCreate | Close            <filename>.tmp        (原子 temp)
DataExtend | Close            <filename>.tmp        × N
RenameOldName | Close         <filename>.docx
FileDelete | Close            <filename>.docx
RenameNewName | Close         <filename>.docx       (原为 <filename>.tmp)
FileDelete | Close            ~$<filename>.docx
BasicInfoChange | Close       <filename>.docx

~$ 锁文件是 Office "文档正打开"的信号。它的 FileCreateFileDelete 精确地界定了打开/关闭窗口。.tmp.docx 的原子重命名就是保存本身。最后的 BasicInfoChange 是新文件在关闭时被打上 mtime。

我在每个案件里都用的转视角技巧:过滤文件名以 ~$ 开头的 FileCreate 记录。它给你窗口内用户打开过的每个 Office 文档。再减去同名的 FileDelete,你就拿到了取证时仍处于打开状态的文档 — 在活动捕获中,对应着镜像化时刻用户正在打开的文档。这一点已经被写进多份报告,作为"我们走进去那一刻用户到底在做什么"的答案。

浏览器活动

现代浏览器维护着重型的文件系统缓存。Chrome 和 Edge 使用 \Users\<u>\AppData\Local\<browser>\User Data\Default\Cache\Cache_Data\(还有 Code Cache\)。Firefox 使用 \Users\<u>\AppData\Local\Mozilla\Firefox\Profiles\<id>\cache2\。浏览过程中:

  • 缓存目录里持续的低速率 FileCreate | CloseDataExtend | Close
  • 偶尔的 FileDelete | Close,因为 LRU 在驱逐旧条目。
  • 每隔几分钟,缓存文件因索引压缩出现 RenameNewName

缓存写入爆发与访问富媒体或单页应用相关。安静时段对应用户离开或处于长加载的页面。活跃的视频播放呈现不同的形状 — 在单一缓存文件上出现大且持续的 DataExtend,而非许多小的 create。

缓存文件名不编码 URL。要拿 URL,转到浏览器自身的 SQLite 数据库,参见 浏览器取证工具。日志的贡献是节奏 — 表明用户在某个窗口内活跃地浏览 — 加上对有意下载在 \Users\<u>\Downloads\ 中明确的 FileCreate 事件。

编码活动

如果用户是开发者,IDE 与构建工具的活动会产生非常有特色的爆发:

  • Webpack、Vite、Turbopack — 在 node_modules\.cache\node_modules\.vite\.next\dist\ 中大量 FileCreate。一次构建几百个。
  • Visual Studio C++ — 在 Debug\Release\ 子树中 .obj.pdb 文件的 FileCreate
  • Cargo(Rust) — 增量构建大量触及 target\debug\incremental\;完整构建还会触及 target\debug\deps\
  • Go — 在 $GOPATH\pkg\\Users\<u>\AppData\Local\go-build\ 下的构建缓存出现短而密集的爆发。
  • npm installyarn install — 数十秒内在 node_modules\ 下产生数千条 FileCreate 记录。日志中最吵的单一用户活动。

node_modules\ 里 5 分钟的 FileCreate 爆发,后面跟一群对 dist\bundle.jsDataExtend,意思是"跑了构建,然后开发服务器热重载了"。请阅读下面的排除章节 — 在非开发分析中,如果不把它们过滤掉,会淹没其他一切。

下载与安装

通过 Chrome 的直接下载:

FileCreate | Close             \Users\<u>\Downloads\<file>.crdownload
DataExtend | Close             \Users\<u>\Downloads\<file>.crdownload  × N
RenameNewName | Close          \Users\<u>\Downloads\<file>
BasicInfoChange | Close        \Users\<u>\Downloads\<file>

Firefox 用 .part,Edge 用 .download。结尾的原子重命名让文件在资源管理器和其他读取器中显示为"已完成"。

新程序的安装通常表现为:在 Downloads 中安装包(.exe.msi.appx)的 FileCreate,然后是在 \Program Files\\Program Files (x86)\\Users\<u>\AppData\Local\Programs\ 下一波 FileCreate 记录。分钟级直方图能轻松识别安装。再用 AmCachePrefetch 对执行端做交叉参照。

总装:日次时间线食谱

"今天用户做了什么"报告的食谱:

  1. 抓取用户当天的解析过日志。限制到解析路径以 \Users\<u>\(目标用户)开头的记录。这消除了通常占主导的 Windows Update、系统缓存和操作系统噪声。
  2. 按每 10 分钟一桶统计:FileCreateDataExtendBasicInfoChange 的计数。
  3. 绘制三条序列。形状告诉你大致活动:
    • 高 create 加高 extend。 写或保存内容。
    • 仅高 BasicInfoChange 浏览、滚动、Office 或编辑器在轻度编辑文件而无明显写入。
    • 高 extend 低 create。 大文件下载或媒体播放。
    • Cache\ 路径下持续的 create。 浏览。
    • node_modules\target\Debug\ 下持续的 create。 编程。
  4. 检查每个桶中前五的文件名,为尖峰打标。Office 文件名和 ~$ 锁文件是绝佳锚点。缓存文件名通常可忽略。

本页解析器在其时间线组件中公开了分钟级直方图。点击柱子会把表格过滤到该窗口 — 这就是上面流程的"不写代码"版。

要做归因 — 是 哪个 用户在键盘前 — 把日志时间线与 EVTX 解析器Security.evtx4624 交互式登录(LogonType=2)与 4647 用户发起的注销配对。这界定会话边界,并给活动一个名字。

排除项与陷阱

备份与 AV 扫描 会产生表面上像用户活动的全卷 BasicInfoChange 爆发。它们遵循计划时间,访问所有目录而非聚焦于某个子树。容易通过路径覆盖识别并排除。

同步代理(OneDrive、Dropbox、Google Drive Backup and Sync)产生看起来像用户活动的日志流量,但那是代理自己的工作。要看用户发起的活动,过滤到同步文件夹之外的记录;要看 外泄文章 中记录的云外泄模式,就特别在同步文件夹内查看。

后台索引器。 SearchIndexer.exe 触碰 \Users\<u>\AppData\Roaming\Microsoft\Windows\Recent\\ProgramData\Microsoft\Search\ 中的文件。MsMpEng.exe(Defender)扫描时会产生 BasicInfoChange 事件。两者都容易归入系统噪声。

Chrome Software Reporter、Edge 更新器、Windows Update。 都会在 \Program Files\\Windows\SoftwareDistribution\ 下产生可预测的 FileCreateDataExtend 爆发。按路径过滤。

node_modules\ 等构建产物会主导任何含它们的时间线。对非开发场景,按路径前缀排除 node_modules\target\Debug\Release\obj\bin\.next\dist\build\

日志无法还原的内容

  • 用户身份。 把时间戳与 Security.evtx 4624 登录关联。
  • 用户访问过的 URL。 这些由浏览器历史数据库保存 — 日志只知道缓存写入节奏。
  • 任何文件的内容。 只有元数据。
  • 环形缓冲区窗口之外的任何东西。 32 MB 的 $J 在桌面机上覆盖几天。更早的内容这份痕迹里已经没了;需要更远的回溯就拉 Shadow Copies 和 $LogFile

对"X 到 Y 之间用户在做什么"问题的 80%,$J$MFT 配合可以直接回答。剩下 20% 需要 Sysmon、EVTX、用于应用级网络与 CPU 使用的 SRUM,以及合格的 super-timeline。

延伸阅读

  • Plaso (log2timeline) — 经典的 super-timeline 工具,可以摄入解析过的 USN 日志,并把它与每一种其他 Windows 时间线痕迹合并为一份可排序视图。
  • SANS DFIR — Windows Forensic Analysis 海报 是单页参考,告诉你哪个痕迹回答哪个用户活动问题。
  • Velociraptor 的 artifact exchange — 多个社区工件结合了 USN、MFT 与 EVTX 等上文所述的关联。