15.05 inode 标志:命令 lsattr chattr + 系统调用 ioctl

简要介绍

这是一种 Linux 相对于 UNIX 上扩展的非标准功能,只在部分文件系统上支持。不过现代 BSD 上也有 chflags 命令和系统调用,功能有类似之处。

在程序中可利用 ioctl() 系统调用来获取并修改 i 节点标志;在终端则可以使用 lsattrchattr 命令操作文件属性。

ioctl 更新标志的例子:

inode 标记的功能

其中 FS_IMMUTABLE_FL 将文件设置为不可更改,既不能更新文件数据(write()truncate()),也不能改变文件元数据(即 chmod()chown()unlink()link()rename()rmdir()utime()setxattr()removexattr())只有特权级进程(具备 CAP_LINUX_IMMUTABLE 能力的进程)可为文件设置这一标志。该标志一旦设定,即便是特权级进程也无法改变文件的内容或元数据这也意味着文件不能被删除,2023 年底我校流行的一种挖矿病毒1上有使用到这个标志。

一般而言,如果针对某一目录设置了 i 节点标志,那么新建于其下的文件和子目录会自动将其继承。不过也有例外,比如 FS_DIRSYNC_FLchattr +D)只能应用于目录,所以只有子目录会继承;当将 FS_IMMUTABLE_FL (chattr +i) 标志应用于目录时,不会有创建于该目录下的文件或子目录继承此标志,因为该标志会阻止在此目录中添加任何新的条目。

更详细一点的标志列表可以用 man chattr 查看,书可能因为出版时间问题标志少了一些。


  1. 参考 yayaya Miner 木马病毒分析。其他相关信息:攻击者使用了开源程序 Diamorphine,以内核模块的方式隐藏进程。topps 看不到进程,但是 sysdig 能看到。WSL 现在还缺一些东西,无法正常运行 sysdig。 ↩︎