非独占(可堆叠)Linux 安全模块可以使用安全 blob 吗?
Can non-exclusive (stackable) Linux Security Modules use security blobs?
我正在试验 Linux 安全模块,试图制作一个。
关于它们应该如何工作,我的主要知识来源是邮件列表档案和现有 LSM 的来源,以及 Linux 文档中关于它们的几页。
我知道有两种 LSM。
- 像 SELinux / AppArmor 这样的独家 LSM,在它们的 LSM 定义中设置了
LSM_FLAG_EXCLUSIVE
标志。
- 非排他性 LSM,例如 Yama、功能或锁定。
浏览所有这些 LSM 的源代码,我发现非排他性 LSM 从不使用安全 blob。另一方面,独家的大量使用它们。
例如,参见 the AppArmor LSM definition, and the one for Yama。
那么,非排他性 LSM 是否可以指定 blob 大小并使用此功能?
为了找到答案,我探索了框架的源代码,看看是否可以在每个 LSM 挂钩调用之间切换安全 blob,我猜这将允许每个 LSM 只能访问自己的 blob,而不能访问另一个 blob LSM.
然而,我们可以看到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
,它有效地用该 LSM 的 blob 部分所在的偏移量替换了当前准备的 LSM struct lsm_blob_sizes
中的每个大小。
框架然后调用他们的初始化函数。
稍后,当任何具有安全 blob 的结构(例如 task_struct
)被分配时,框架将为所有的 blob 分配一个足够 space 的 blob安全模块,这些模块反过来会使用它们自己的 lsm_blobs_sizes
.
中的 offsets 在这个更大的 blob 中找到它们的位置
安全 blob 的 summed-up 大小实际上是要使用 init_debug
、here、
来控制
所以这意味着所有 LSM 都可以定义安全 blob 大小。框架负责它们的分配(和 deallocation),不同 LSM 的 blob 可以愉快地并存于内存中。
我正在试验 Linux 安全模块,试图制作一个。
关于它们应该如何工作,我的主要知识来源是邮件列表档案和现有 LSM 的来源,以及 Linux 文档中关于它们的几页。
我知道有两种 LSM。
- 像 SELinux / AppArmor 这样的独家 LSM,在它们的 LSM 定义中设置了
LSM_FLAG_EXCLUSIVE
标志。 - 非排他性 LSM,例如 Yama、功能或锁定。
浏览所有这些 LSM 的源代码,我发现非排他性 LSM 从不使用安全 blob。另一方面,独家的大量使用它们。
例如,参见 the AppArmor LSM definition, and the one for Yama。
那么,非排他性 LSM 是否可以指定 blob 大小并使用此功能?
为了找到答案,我探索了框架的源代码,看看是否可以在每个 LSM 挂钩调用之间切换安全 blob,我猜这将允许每个 LSM 只能访问自己的 blob,而不能访问另一个 blob LSM.
然而,我们可以看到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
,它有效地用该 LSM 的 blob 部分所在的偏移量替换了当前准备的 LSMstruct lsm_blob_sizes
中的每个大小。框架然后调用他们的初始化函数。
稍后,当任何具有安全 blob 的结构(例如
中的 offsets 在这个更大的 blob 中找到它们的位置task_struct
)被分配时,框架将为所有的 blob 分配一个足够 space 的 blob安全模块,这些模块反过来会使用它们自己的lsm_blobs_sizes
.
安全 blob 的 summed-up 大小实际上是要使用 init_debug
、here、
所以这意味着所有 LSM 都可以定义安全 blob 大小。框架负责它们的分配(和 deallocation),不同 LSM 的 blob 可以愉快地并存于内存中。