最近,我正在开发基于 Linux 安全框架的嵌入式 linux 应用程序白名单解决方案。我的 LSM 的主要重点是实现 bprm_check_security 挂钩,当程序在用户空间中执行时调用(我们不考虑内核进程)。这个钩子被赋予了一个“struct linux_binprm *bprm”类型的指针。该指针包括一个文件指针(包括被执行程序的可执行文件)和一个字符指针(包括被执行程序的名称)。
我们的应用程序白名单解决方案基于哈希计算。因此,在我的 LSM 中,我使用文件指针(包含在 bprm 指针中)来计算新的哈希值,并将该值与文件名(在 bprm 指针中)一起存储为列表中的条目。
但是,在 linux 启动期间(在执行 /sbin/init 之前),文件名和文件指针之间存在不匹配。例如,在第一个执行的程序中,bprm 指针中的文件名是“/bin/cat”,然而,同一 bprm 指针中的文件指针并不是/bin/cat 的实际文件,而是busybox。
研究了很久才发现,这些文件是busybox执行的,创建了一个初始的initrd,从而创建了真正的rootfs,所有这些文件都有一个幻数RAMFS_MAGIC(存储在inode->i_sb-> s_magic)。所以我用这个数字来过滤这些进程,但是,我不确定这是否是正确的方法。我会很感激任何帮助。
需要注意的是,我使用文件指针(包含在 bprm 指针中)来计算哈希值,换句话说,我不会根据文件名或文件路径从用户空间读取文件。
谢谢。
/include/linux/binfmts.h
struct linux_binprm {
struct file * file;
const char * filename; /* Name of binary as seen by procps */
};