美文网首页
取证之文件系统科普贴

取证之文件系统科普贴

作者: cracker_zhou | 来源:发表于2019-10-09 23:46 被阅读0次

    文件系统已经经历了很多年的发展,很难用一篇文章把文件系统完整的讲清楚。
    本篇定位科普贴,涵盖文件系统中大多数概念与特性。

    0x01 什么是文件系统?

    计算机的文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘(或者光盘)的地址为多少的数据块上,只需要记住这个文件的所属目录和文件名。在写入新数据之前,用户不必关心硬盘上的那个块地址没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写入到了哪个文件中。
    上面这段话来自维基百科对文件系统的介绍,真是晦涩难懂。总结成一句大白话就是方便用户存和取文件的东西。
    下面我们会基于这个重点从多个维度了解文件系统。

    0x02 常见的文件系统有哪些?

    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宣布的新一代文件系统用以代替年老的HFS+。从macOS10.13,ios10.3版本开始均已默认使用macOS文件系统。参考之前写过一篇macOS文件系统(https://www.jianshu.com/p/c401d546cebf)

    0x03 扇区(Sector)和簇(Cluster)基本概念

    最大的区别是:扇区是物理硬盘层面的容量单位,而簇是文件系统层面的容量单位。
    机械硬盘是由多个盘片组成,每个盘片包含两个面,每个盘面都对应地有一个读/写磁头。磁头走过的路就是磁道,磁盘的磁道是一个个同心圆。磁盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区。硬盘的读写以扇区为基本单位。具体参考下图:


    因为扇区的单位太小,因此把它捆在一起,组成一个更大的单位更方便进行灵活管理就形成了簇。簇是文件系统存储管理的的最小单位,在分区被格式化为文件系统时就将簇大小定了下来。每个文件系统对簇大小有自己的喜好,比如NTFS和Ext4喜欢用4096(8个扇区)作为簇大小,f2fs则默认用2M作为块大小。
    文件系统中文件的存取是以簇为基本单位。以簇大小是4K为例,无论文件大小是1K还是3K文件系统都会分配4K大小给它,分配了但是未被使用的空间称为slack空间,slack空间的使用信息隐藏技术惯用手段。(参考信息隐藏第一课:https://www.computersecuritystudent.com/FORENSICS/HIDING/lesson1/index.html
    不同的文件系统喜欢用不同的名称,比如NTFS中喜欢叫Cluster,其他别名包括Block,Page,Fragment,Chunk。其实是同一个东西。

    0x04 文件系统的最小模型: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。

    0x05 tar的升级版zip

    相比于tar,zip提供了与真正文件系统更接近的特性:

    1. 有magic number作为自身标志
      判断一个文件是否是zip文件首先看前4个字节十六进制是否是0x50 0x4b 0x03 0x04。如同判断是否是F2FS文件系统时首先检查1024起始的4个字节是否是 0x10 0x20 0xF5 0xF2
    2. 文件元数据与文件数据分离
      zip文件格式由文件数据区、中央目录结构,中央目录结束标志组成。在中央目录结构区记录了大量文件的元数据信息,通过deHeaderOffset偏移获得该文件在文件数据区的偏移。这个行为更贴近于文件系统的存储方式,在文件元数据中存放一个指向真正数据的偏移。文件系统中的文件数据在磁盘上不一定是连续存放的,所以文件元数据区会存放多个数据偏移和长度的组合,这种组合在NTFS中叫 data run,在其他文件系统中叫extent
    3. 压缩数据以节省空间
      文件会先经过deflat压缩然后进入zip的文件数据区,这是一种节省空间的方案。
      文件系统中节省空间有2种方案:sparse文件和文件内容压缩。
      sparse(稀疏)文件是各大文件系统都会比较喜欢的高效利用磁盘空间的方案,除了最差劲的HFS不支持sparse特性。当文件中部分(至少一个簇)内容或者全部内容为空(全0)时,则在文件系统中不为空数据分配空间。
      文件内容压缩Apple文件系统(HFS/HFS+/APFS)的特色,而且这些文件中并不是所有文件数据都会被压缩。因为数据的压缩意味着读取和修改时都需要经历解压再压缩的操作,很明显这个过程是很耗时间的。只有不被频繁修改的文件才适合启用压缩选项,比如库文件,可执行的二进制文件。
    4. 扩展域
      相比于tar,zip有一个很大的优点是提供了扩展域的支持。扩展域用于存储数据结构未规定的信息。比如zip标准数据结构中只有文件最后修改时间这个字段,但是文件创建时间和最后访问时间也很重要啊!此时就用到了扩展域。
      文件不仅仅包含元数据和文件内容。部分文件系统还提供了attribute这个概念,类似于zip的扩展域用以记录文件更多的信息。比如NTFS允许自行追加命名的$DATA属性内容,就形成了ADS流。APFS文件系统中"com.apple.decmpfs"记录了文件内容被压缩后的数据,类似的还有"com.apple.FinderInfo","com.apple.ResourceFork"等其他扩展属性。
    5. 数据加密
      文件打包为zip时允许输入密码以加密文件内容。现代部分文件系统也在逐渐带入加密特性支持,比如新出生的APFS和依然在发展的F2FS。老文件系统想加密数据只能依靠操作系统或者三方软件帮忙了,比如NTFS,HFS+。
      macOS10.13版本之前采用的文件系统是HFS和HFS+,因为HFS和HFS+文件系统本身不具备加密特性,所以macOS中FileVault功能采用的逻辑卷管理方案(Core Storage)。因为Core Storage是在操作系统层面做的加密,所以数据可以落到任意文件系统上面(对文件系统透明),并且生成一个未加密的逻辑设备对上层文件读写操作隐藏加密这个细节。在这种情况下如果对逻辑设备打镜像是未加密的,对原始磁盘打镜像则是加密的。
      macOS10.13中引入APFS文件系统后,操作系统事情变得简单了。因为直接采用文件系统层面的加密,所以也省去了Core Storage这个中间层。对上层文件读写操作而言依然感受不到数据被加密解密的过程。在这种情况下只能在操作系统层面关闭FileVault功能(会将磁盘上所有加密文件解密)再打未加密磁盘镜像,或者直接打磁盘镜像在取证软件中解密。

    0x06 文件的inum

    inum(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 bin
    4718593 drwxr-xr-x   3 root   root   4.0K Oct  8 14:05 boot
    4849665 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 dev
    6029313 drwxr-xr-x 111 root   root   4.0K Oct  7 12:48 etc
    5505025 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参数如何使用。

    文件系统很多,但每个几近相同。编程语言很多,但基本概念是共通的。三大操作系统本质上也没有区别。

    相关文章

      网友评论

          本文标题:取证之文件系统科普贴

          本文链接:https://www.haomeiwen.com/subject/gjnmpctx.html