Внедрение LSM-хука bprm_check_security
В последнее время я работаю над созданием решения для белого списка приложений для встроенного Linux на основе Linux Security Framework. Основной целью моего 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 */
};