《Forensic Science International: Digital Investigation》:Hiding data in Btrfs file systems
编辑推荐:
文件系统取证通常侧重于研究如何从文件系统中恢复信息(Carrier, 2005; Juch, 2014; Bhat and Wani, 2018; Toolan, 2025),而非研究如何在这些文件系统中隐藏信息。在诸如Btrfs等不太常见的文件系统方面,此类
文件系统取证通常侧重于研究如何从文件系统中恢复信息(Carrier, 2005; Juch, 2014; Bhat and Wani, 2018; Toolan, 2025),而非研究如何在这些文件系统中隐藏信息。在诸如Btrfs等不太常见的文件系统方面,此类研究更为匮乏。Btrfs文件系统最初创建于2007年,并于2015年和2020年分别被openSUSE和Fedora采纳为默认文件系统。Btrfs通过内置完整性校验、内置卷管理(即RAID)、快照与子卷以及SSD优化等功能,为大规模数据存储解决方案提供支持(Rodeh et al., 2013; Btrfs (nd), 2026a)。从取证和反取证两个角度来看,针对Btrfs文件系统的研究均很少。例如,商业文件系统取证工具均不支持Btrfs。The Sleuthkit(4.14版)为Btrfs文件系统提供了基础支持。目前在Btrfs文件系统中已实现的有限几种数据隐藏技术(G?bel et al., 2024)。本研究旨在确定Btrfs文件系统中还可以实现哪些其他数据隐藏技术。本文组织如下。第2节概述了相关工作,介绍了Btrfs文件系统结构,并引介了反取证领域(重点关注文件系统中的数据隐藏),最后介绍了Btrfs中现有的数据隐藏方法。第3节描述了本研究中引入的六种数据隐藏方法。第4节描述了本研究采用的评估方法并给出了每种已实现方法的结果。第5节对这些结果进行了讨论。第6节介绍了本研究的局限性并提出了未来工作的可能方向。第7节对全文进行了总结。
论文解读
一、研究背景与问题
文件系统取证研究长期以来主要聚焦于如何从文件系统中恢复已删除或隐藏的信息,而相对忽视了如何在文件系统中隐蔽地存储数据这一反取证视角。Btrfs作为一种现代基于B树(B-Tree)的文件系统,采用写时复制(Copy-on-Write, CoW)机制,自2007年诞生以来,已先后被openSUSE(2015年)和Fedora(2020年)采纳为默认文件系统,并在Linux内核中得到全面支持。然而,无论是从取证还是反取证角度,针对Btrfs的研究都极为匮乏:商业文件系统取证工具无一支持Btrfs,开源工具The Sleuthkit(4.14版)也仅提供基础支持。此前仅有G?bel等人(2024)在fishy框架中成功实现了两种Btrfs数据隐藏技术(文件松弛空间隐藏和纳秒时间戳隐藏),Wani等人(2020)尝试的多种隐藏方法则因Btrfs内置完整性校验机制而失败。因此,系统性地探索Btrfs文件系统中可行的数据隐藏技术,对于完善该文件系统的取证与反取证研究具有重要的学术价值和现实意义。
二、研究内容与主要结论
该研究在Btrfs文件系统中实现了六种数据隐藏方法,并对其可行性与隐藏容量进行了系统评估。研究首先梳理了Btrfs文件系统的核心结构,包括超级块(superblock)、根树(root tree)、文件系统树、区段树(extent tree)、区段校验和树(extent CSUM tree)、设备树(device tree)和块组树(chunk tree)等,指出Btrfs几乎所有元数据均存储于树节点中,且每个树节点和超级块均包含校验和(默认使用crc32c算法),任何对元数据的修改若不同步更新校验和都将导致文件系统不可用。基于这一认识,研究人员提出了六种数据隐藏方法:第一,利用首个超级块之前的64KiB(0x10000字节)空间,该区域在Btrfs中始终为零且不受校验和保护;第二,利用超级块中的保留区(0xF0字节,位于偏移0x23B处)和松弛空间(0x235字节,位于偏移0xDCB处),共提供0x325字节的隐藏容量,但需同步更新超级块校验和;第三,利用超级块中块组数组(chunk array)的松弛空间,Btrfs为块组数组分配了0x800字节,但单设备文件系统通常仅占用0x81字节,因此可提供约0x77F字节的隐藏空间,同样需更新超级块校验和;第四,利用INODE_ITEM结构中的保留空间,每个INODE_ITEM在偏移0x50处包含0x20字节的保留区,隐藏数据后需更新所在树节点的校验和;第五,利用内部节点(internal node)的松弛空间,内部节点由节点头和指向其他节点的指针组成,其余部分为自由空间,由于内部节点仅在新增指针时才会增长,因此该隐藏方法具有较好的稳定性,但需更新节点校验和;第六,利用Btrfs定义的STRING_ITEM结构,该结构在官方文档中被标注为“仅用于测试”,研究人员通过在一个叶子节点中增加一个STRING_ITEM项(类型值0xFD)并写入隐藏数据,实现了数据的隐蔽存储,该方法同样需要更新节点校验和。
研究结果表明,上述六种方法均能成功实现数据隐藏且不破坏文件系统的可挂载性。在隐藏容量方面,STRING_ITEM方法提供了最大的单点隐藏容量(约3.9KiB),其次是内部节点松弛空间方法(约2.6KiB),而超级块保留/松弛空间方法(0x325字节)和块组数组松弛空间方法(0x77F字节)的容量相对有限。在检测难度方面,利用超级块之前空间的方法最为隐蔽,因为该区域不受校验和保护且不留下任何结构性痕迹;而STRING_ITEM方法虽然容量最大,但由于其创建了一个新的文件系统项,可能更容易被基于结构分析的取证工具发现。研究还发现,在第二个超级块之前并不存在如G?bel等人所声称的64KiB自由空间——该区域实际上存储着有效的文件系统节点,因此预超级块隐藏方法仅适用于第一个超级块之前。
三、关键技术方法
研究人员主要采用了以下关键技术方法:一是对Btrfs文件系统磁盘结构进行逆向分析,精确定位超级块、树节点、INODE_ITEM等结构中的保留区和松弛空间;二是直接对磁盘镜像进行字节级读写操作,在目标结构中注入隐藏数据;三是利用crc32c校验和算法对修改后的树节点和超级块重新计算校验和,确保文件系统完整性校验通过;四是构建测试用Btrfs文件系统镜像,通过挂载操作验证各隐藏方法的可行性和文件系统的可挂载性;五是系统性地评估每种方法的隐藏容量和检测难度。研究未涉及特定样本队列来源。
四、研究结果
预超级块(Pre-superblock)方法:研究证实Btrfs文件系统中首个超级块之前的0x10000字节空间始终为零且不受校验和保护,可安全用于数据隐藏。但研究发现,第二个超级块之前并不存在自由空间——该区域实际存储着有效的文件系统节点,因此该方法仅适用于第一个超级块之前。
超级块保留/松弛空间(Superblock reserved/Slack space)方法:研究人员在超级块的保留区(0xF0字节)和松弛空间(0x235字节)中成功写入了隐藏数据,并通过更新超级块校验和确保了文件系统的一致性。该方法提供0x325字节的隐藏容量。
块组数组松弛空间(Chunk array slack space)方法:Btrfs在超级块中为块组数组分配了0x800字节空间,但单设备文件系统中块组数组通常仅占用0x81字节,留下约0x77F字节的可用空间。隐藏数据后需更新超级块校验和。
INODE_ITEM保留空间方法:每个INODE_ITEM在偏移0x50处包含0x20字节的保留空间,可用于数据隐藏。由于INODE_ITEM存储在树节点中,隐藏数据后必须更新所在树节点的校验和。
内部节点(Internal nodes)方法:内部节点由节点头和指向子节点的指针组成,其余为自由空间。由于内部节点仅在新增指针时才会增长,该方法具有较好的稳定性。隐藏数据后需更新节点校验和。
STRING_ITEM方法:研究人员利用Btrfs中定义为“仅用于测试”的STRING_ITEM结构(类型值0xFD),在叶子节点中创建新的STRING_ITEM项并写入隐藏数据。该方法提供了最大的单点隐藏容量(约3.9KiB),但需更新节点校验和。
五、讨论与结论
讨论部分指出,六种方法在隐藏容量、检测难度和文件系统稳定性方面各有优劣。预超级块方法最为隐蔽但容量有限且仅适用于第一个超级块;STRING_ITEM方法容量最大但可能因创建新的文件系统项而增加被检测的风险;内部节点方法稳定性较好但容量受限于节点空闲空间。研究还指出,所有涉及修改树节点或超级块内容的方法都必须同步更新相应的校验和值,这是Btrfs数据隐藏与许多其他文件系统的关键区别。此外,研究注意到The Sleuthkit等现有取证工具对Btrfs的支持仍不完善,这既增加了取证分析的难度,也为反取证技术提供了空间。研究的局限性在于未对多种校验和算法(如xxhash、sha256、blake2)下的方法兼容性进行验证,也未评估隐藏数据在文件系统正常读写操作下的持久性。未来工作可进一步探索其他Btrfs特有结构(如子卷、快照、设备树等)中的数据隐藏可能性,并开发相应的取证检测工具。研究结论部分指出,该研究成功地在Btrfs文件系统中实现了六种数据隐藏方法,其中STRING_ITEM方法为首次提出的新型隐藏技术,所有方法均通过了文件系统挂载验证,证明了Btrfs文件系统在反取证研究领域仍存在大量未被探索的空间。