问题描述
我正在尝试Linux安全模块,试图制造一个。
我关于它们应该如何工作的主要知识来源是邮件列表档案和现有LSM的来源,以及Linux文档中有关它们的几页。
我了解有两种LSM。
- 诸如SELinux / AppArmor之类的专有LSM,在其LSM定义中设置了
LSM_FLAG_EXCLUSIVE
标志。 - 非排他性的LSM,例如Yama,功能或锁定。
浏览所有这些LSM的源代码,我发现非排他性的LSM从不使用安全性Blob。另一方面,专有的则大量使用它们。
例如,请参见the AppArmor LSM definition和the one for Yama。
那么,非排他性LSM可以指定blob大小并使用此功能吗?
试图找到答案,我探索了框架的来源,以查看是否可能在每个LSM挂钩调用之间切换了安全性Blob,我想这将允许每个LSM仅访问自己的Blob,而不能访问另一个LSM的Blob。
但是,我们可以看到here in the LSM framework并非如此。
如果我的LSM声明了Blob大小,那么如果我的内核也启用了SELinux,是否可以使用Blob? SELinux和我的结构不会重叠吗?
解决方法
好的,我在LSM框架中找到了相关的代码。
QED :是的,所有LSM都可以使用安全性Blob,只要它们在模块被点燃后就将sizes结构用作包含偏移量即可。
说明:
定义LSM时,使用DEFINE_LSM
宏,后跟各种信息,包括指向struct lsm_blobs_sizes
的指针。
在其自身点火期间,LSM框架(主要在security/security.c
中实现)通过一些操作来操纵您的结构。
- 它在其自己的结构实例(声明为here)中存储所有LSM的安全性Blob大小之和。准确地,查看此堆栈跟踪:
ordered_lsm_init()
`- prepare_lsm(*lsm)
`- lsm_set_blob_sizes(lsm->blobs)
`- lsm_set_blob_size(&needed->lbs_task,&blob_sizes.lbs_task);
lsm_set_blob_size
负责对框架结构实例的实际添加。
-
但是,与
lsm_set_blob_sizes
结合使用时,它将有效地替换当前准备的LSMstruct lsm_blob_sizes
中的每个大小,并替换为该LSM的一部分所在的偏移量。 -
然后,框架调用其init函数。
-
稍后,当分配具有安全性blob(例如
task_struct
)的任何结构时,框架将为所有安全性模块的blob分配一个具有足够空间的blob,这反过来会发现他们使用自己的lsm_blobs_sizes
中的 offsets 在更大的blob中的位置。
实际上,应该使用init_debug
,here控制安全性Blob的总大小。
因此,这意味着所有LSM都可以定义安全性Blob的大小。该框架负责它们的分配(和deallocation),并且不同LSM的Blob可以愉快地并排存在内存中。