Внедрение LSM-хука bprm_check_security - PullRequest
0 голосов
/ 10 января 2019

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