В последнее время я работаю над созданием решения для белого списка приложений для встроенного 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 */
};