泄露 Windows 资源管理器浏览记录的 Shell Bags

Windows 资源管理器会记住用户访问过的每个文件夹的视图细节,包括窗口大小、视图模式、排序方式、图标大小、分组依据等。这个特性有点类似 macOS 系统里的 .DS_store 文件夹。这些文件夹的视图信息会被保存在注册表中,我们根据微软对这组注册表项的命名,将该特性称作 Shell Bags。一些 Windows 取证工具利用该特性,可以提取出用户的访问历史,包括已删除的文件夹、网络文件夹和可移动存储设备文件夹。

有两款工具可以查看系统的 Shell Bags 信息:

其中,ShellBagsView 似乎不支持解析中文路径,而 ShellBags Explorer 的功能更强大一些。

出乎意料的是,某些主流的系统清理软件(说的就是 CCleaner)没有提供清理 Shell Bags 的功能。如果要实现手动清理 Shell Bags,那么需要先了解一下它的实现原理。

在 Windows XP 系统里,Shell Bags 数据保存在 %UserProfile%\NTUSER.dat 文件中。对应注册表以下位置:

在之后的 Windows 系统里,数据结构发生了改变。Shell Bags 数据分别保存在 %UserProfile%\NTUSER.dat%LocalAppData%\Microsoft\Windows\UsrClass.dat 文件中。分别对应注册表以下位置:

每个注册表分支下都包含两个分支:

regedit

其中,Bags 分支用于记录文件夹的视图配置信息,其下的子节点按以 1 开始的整数顺序命名。这些子节点也被称为 Slot。当资源管理器首次访问一个文件夹时,便会创建一个新的节点。因此,取证工具可以通过注册表项的最后修改时间来了解用户访问文件夹的时间。此外,由于节点编号是连续的,也很容易判断用户是否删除过记录。BagMRU 分支用于记录文件夹名称和路径,其子节点是一个和 Shell Namespace 一致的树状结构。

实现原理

BagMRU 分支下的项可以包含以下几类键:

  • 0, 1, 2, 3 ……整数键
    每个键对应一个子节点,亦表示一个子文件夹。其值是一个二进制数据,保存着文件夹的路径
  • MRUListEx
    MRU 即 Most Recent Used。该键的值是一组 DWORD 数组,记录最近一次访问时子文件夹的顺序。每个 DWORD 表示一个子文件夹编号,以 -1 表示末尾。比如当前节点有三个子文件夹,编号为 0, 1 和 2,最近访问了编号为 2 的文件夹,则 MRUListEx 的值为 [2, 0, 1, -1]
  • NodeSlot
    指向 Bags 分支下保存着视图配置信息的 Slot 节点编号
  • NodeSlots
    仅出现在 BagMRU 根节点下,在创建新的 Shell Bag 时更新

Bags 分支下的子项可以包含以下两种子项:

  • Shell
    表示数据为资源管窗口理器视图配置
  • ComDlg
    表示数据为通用对话框(文件打开、保存)视图配置

用户可以通过手动删除注册表下这两个分支来清理资源管理器的访问历史,也可以使用工具 Shellbag Analyzer & Cleaner 进行清理。要注意的是,系统还原点会保存之前的注册表信息,要彻底清除访问历史,务必要删除所有系统还原点数据

为了避免留痕访问,建议使用第三方的文件管理器来替代 Windows 资源管理器。经过测试,下列第三方文件管理器不会生成 Shell Bags 数据:

顺带一提

注册表 HKEY_CURRENT_USER\SOFTWARE\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache 下的数据会暴露用户曾使用过的应用信息,建议一并删除。

MUI,即 Multilingual User Interface,多语言用户接口。