非专有可堆叠Linux安全模块可以使用安全Blob吗?

问题描述

我正在尝试Linux安全模块,试图制造一个

我关于它们应该如何工作的主要知识来源是邮件列表档案和现有LSM的来源,以及Linux文档中有关它们的几页。

我了解有两种LSM。

  • 诸如SELinux / AppArmor之类的专有LSM,在其LSM定义中设置了LSM_FLAG_EXCLUSIVE标志。
  • 非排他性的LSM,例如Yama,功能或锁定。

浏览所有这些LSM的源代码,我发现非排他性的LSM从不使用安全性Blob。另一方面,专有的则大量使用它们。

例如,请参见the AppArmor LSM definitionthe 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结合使用时,它将有效地替换当前准备的LSM struct lsm_blob_sizes中的每个大小,并替换为该LSM的一部分所在的偏移量。

  • 然后,框架调用其init函数。

  • 稍后,当分配具有安全性blob(例如task_struct)的任何结构时,框架将为所有安全性模块的blob分配一个具有足够空间的blob,这反过来会发现他们使用自己的lsm_blobs_sizes中的 offsets 在更大的blob中的位置。

实际上,应该使用init_debughere控制安全性Blob的总大小。

因此,这意味着所有LSM都可以定义安全性Blob的大小。该框架负责它们的分配(和deallocation),并且不同LSM的Blob可以愉快地并排存在内存中。