最近,我正在基于Linux安全框架为嵌入式Linux开发应用程序白名单解决方案。我的LSM的主要重点是实现在用户空间中执行程序时调用的bprm_check_security挂钩(我们不考虑内核进程)。 该挂钩具有类型为“ struct linux_binprm * bprm”的指针。该指针包括一个文件指针(包括执行的程序的可执行文件)和一个char指针(包括执行的程序的名称)。
我们的应用程序白名单解决方案基于哈希计算。因此,在我的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 */
};