本篇是继 ☞ 取证常见文件格式科普贴、取证之文件分区表科普贴的第三章。
文件系统已经经历了很多年的发展,其中的学问,不言而喻,因此我们很难用一篇文章把文件系统完整的讲清楚。本篇定位科普贴,涵盖文件系统中大多数概念与特性。
素材来源:弘连研发工程师 Spring
FILE SYSTEM 文件系统
计算机的文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易。
文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘(或者光盘)的地址为多少的数据块上,只需要记住这个文件的所属目录和文件名。
在写入新数据之前,用户不必关心硬盘上的那个块地址没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写入到了哪个文件中。

上面这段话来自维基百科对文件系统的介绍,真是晦涩难懂。总结成一句大白话,文件系统就是为了方便用户存和取文件的。

FAT16: 采用16bit记录长度信息实属硬伤,导致磁盘分区最大只能到2GB。这里特别写出FAT16是因为UEFI引导中ESP分区默认采用的是FAT16文件系统。
exFAT:FAT家族的文件系统发展到FAT32居然还有单文件不能大于4G的硬伤,这个问题在exFat里得以解决。exFat是windows,linux,macOS都支持的较好的文件系统。
NTFS:NTFS是一个93年出生的文件系统。最新版本是NTFS3.1,从windows xp一直用到win10。三大操作系统也只有windows自己能够完美支持NTFS的读写操作。在macOS和linux上面使用三方库对NTFS执行大量写操作都有丢数据的风险。
Ext4:广泛运用于各大linux发行版和android的文件系统。
APFS:苹果于2016年在WWDC宣布使用APFS文件系统用以代替年老的HFS+。从macOS10.13,iOS10.3版本开始均已默认使用APFS文件系统。
(PS:后面会与大家单独聊聊APFS文件系统)
0x02 扇区(Sector)和簇(Cluster)
基本概念
扇区和簇最大的区别是:扇区是物理硬盘层面的容量单位,而簇是文件系统层面的容量单位。大家都知道,机械硬盘是由多个盘片组成,每个盘片包含两个面,每个盘面都对应地有一个读/写磁头。磁头走过的路就是磁道,磁盘的磁道是一个个同心圆。磁盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区。硬盘的读写以扇区为基本单位。具体参考下图:

因为扇区的单位太小,因此把它捆在一起,组成一个更大的单位——簇,更方便用户对文件进行灵活管理。
簇是文件系统存储管理的的最小单位,在分区被格式化为文件系统时就将簇大小定了下来。每个文件系统对簇大小有自己的喜好,比如NTFS和Ext4常用4096(8个扇区)作为簇大小,f2fs则默认用2M作为块大小。
文件系统中文件的存取是以簇为基本单位。
以簇大小是4K为例,无论文件大小是1K还是3K文件系统都会分配4K大小给它,分配了但是未被使用的空间称为slack空间,slack空间的使用,是信息隐藏技术惯用的手段。
不同的文件系统都有不同的名称,比如NTFS中被称为Cluster,其他别名包括Block,Page,Fragment,Chunk。其实,都描述的是同一件事物。
0x03 文件系统的最小模型:tar tar和zip的数据结构,之前我们在 取证常见文件格式科普贴 有详细的说明,是我们特别常用的数据结构。tar的数据结构十分简单:分为文件元数据与数据两大部分。让我们再来感受一下tar的元数据部分数据结构:
Field offset | Field size | Field |
0 | 100 | File name |
100 | 8 | File mode |
108 | 8 | Owner's numeric user ID |
116 | 8 | Group's numeric user ID |
124 | 12 | File size in bytes (octal base) |
136 | 12 | Last modification time in numeric Unix time format (octal) |
148 | 8 | Checksum for header record |
156 | 1 | Link indicator (file type) |
157 | 100 | Name of linked file |
对比于 ls -l 命令的返回值,会发现一个文件的核心要素都在这里了。
在一个文件系统中,文件的元数据信息至少包括文件名,文件权限,文件类型,文件大小,所属用户与所属组,存储文件元数据信息的结构体叫【inode】。
0x04 tar的升级版zip相比于tar,zip提供了与真正文件系统更接近的特性:
01 magic number标识类型 判断一个文件是否是zip文件,首先看前4个字节十六进制是否是0x50 0x4b 0x03 0x04。如同判断是否是F2FS文件系统时,首先检查1024起始的4个字节是否是 0x10 0x20 0xF5 0xF2。 02 文件元数据与文件数据分离zip文件格式由文件数据区、中央目录结构,中央目录结束标志组成。在中央目录结构区记录了大量文件的元数据信息,通过deHeaderOffset偏移获得该文件在文件数据区的偏移。
这个行为更贴近于文件系统的存储方式,在文件元数据中存放一个指向真正数据的偏移。
文件系统中的文件数据在磁盘上不一定是连续存放的,所以文件元数据区会存放多个数据偏移和长度的组合,这种组合在NTFS中叫 data run,在其他文件系统中叫 extent 。 03 压缩数据以节省空间文件会先经过deflat压缩然后进入zip的文件数据区,这是一种节省空间的方案。


sparse(稀疏)文件是各大文件系统都会比较喜欢的高效利用磁盘空间的方案,除了最差劲的HFS不支持sparse特性。
当文件中部分(至少一个簇)内容或者全部内容为空(全0)时,则在文件系统中不为空数据分配空间。
文件内容压缩是Apple的文件系统(HFS/HFS+/APFS)特色,而且并不是所有文件的内容都会被压缩。
因为数据的压缩意味着读取和修改时都需要经历解压再压缩的操作,很明显这个过程是很耗时间的。
只有不被频繁修改的文件才适合启用压缩选项,比如库文件,可执行的二进制文件。 04 扩展域 相比于tar,zip有一个很大的优点是提供了扩展域的支持。扩展域用于存储数据结构未规定的信息。比如:zip标准数据结构中只有文件最后修改时间这个字段,但是文件创建时间和最后访问时间也很重要,此时就用到了扩展域。
文件不仅仅包含元数据和文件内容。部分文件系统还提供了attribute这个概念,类似于zip的扩展域用以记录文件更多的信息。
比如:NTFS允许自行追加命名的$DATA属性内容,就形成了ADS流。
APFS文件系统中"com.apple.decmpfs”记录了文件内容被压缩后的数据,类似的还有"com.apple.FinderInfo","com.apple.ResourceFork"等其他扩展属性。 05 数据加密 文件打包为zip时允许输入密码以加密文件内容。现代部分文件系统也在逐渐带入加密特性支持,比如新出生的APFS和依然在发展的F2FS。老文件系统想加密数据只能依靠操作系统或者三方软件帮忙了,比如NTFS,HFS+。
macOS10.13版本之前采用的文件系统是HFS和HFS+,因为HFS和HFS+文件系统本身不具备加密特性,所以macOS中FileVault功能采用的逻辑卷管理方案(Core Storage)。
因为Core Storage是在操作系统层面做的加密,所以数据可以落到任意文件系统上面(对文件系统透明),并且生成一个未加密的逻辑设备对上层文件读写操作隐藏加密这个细节。
在这种情况下如果对逻辑设备打镜像是未加密的,对原始磁盘打镜像则是加密的。
macOS10.13中引入APFS文件系统后,操作系统事情变得简单了。因为直接采用文件系统层面的加密,所以也省去了Core Storage这个中间层。对上层文件读写操作而言依然感受不到数据被加密解密的过程。
在这种情况下只能在操作系统层面关闭FileVault功能(会将磁盘上所有加密文件解密)再打未加密磁盘镜像,或者直接打磁盘镜像在取证软件中解密。
同样在Windows中也提供了Bitlocker加密作为数据安全的保护方案。由于NTFS在文件系统层面不支持加密,所以情况与上面提到的Core Storage情况类似。
自带TPM芯片的surface平板就是这么一个活生生样例,系统启动后完全感受不到数据盘是被加密的。对逻辑驱动盘(C盘,D盘)制作的镜像是未加密的,落盘的数据经过Bitlocker加密的。
0x05 文件的inuminum(index number)概念广泛存在于所有文件系统,用于唯一标识某个文件,存储在每个文件的元数据数据结构中。
注意:这与上面提到的inode概念区分,inode是一个结构体保存文件元数据信息,inum是存储在inode中的一个序号。
每个文件的inum可以通过ls命令查看,下面是针对 ls 命令的 -i 参数官方文档解释(来自 man ls ):
-i, --inode print the index number of each file
ls -li 命令返回值示例(inum在第一列):
3407873 drwxr-xr-x 2 root root 4.0K Sep 12 14:48 bin4718593 drwxr-xr-x 3 root root 4.0K Oct 8 14:05 boot4849665 drwxr-xr-x 4 root root 4.0K May 5 11:19 data 2 drwxr-xr-x 19 root root 3.9K Oct 7 12:48 dev6029313 drwxr-xr-x 111 root root 4.0K Oct 7 12:48 etc5505025 drwxr-xr-x 4 root root 4.0K Jan 11 2019 home 22 lrwxrwxrwx 1 root root 33 Oct 7 12:48 initrd.img -> boot/initrd.img-4.15.0-65-generic 12 lrwxrwxrwx 1 root root 33 Oct 7 12:48 initrd.img.old -> boot/initrd.img-4.15.0-64-generic
当理解inum这个概念后,就很容易的理解linux命令中很多命令。比如 ls -l 展示出来的硬链接数,软链接与硬链接的本质区别,find命令中-inum参数如何使用。
文件系统很多,但每个几近相同。编程语言很多,但基本概念是共通的。三大操作系统本质上也没有区别。
完
2019/11/22
星期五

