0

我正在尝试使用 Linux 安全模块,试图制作一个。

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

我知道有两种 LSM。

  • SELinux / AppArmor 等独家 LSM,LSM_FLAG_EXCLUSIVE在其 LSM 定义中设置了标志。
  • 非排他性 LSM,如 Yama、功能或锁定。

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

例如,请参阅AppArmor LSM 定义Yama 的定义。

那么,非排他性 LSM 可以指定 blob 大小并使用此功能吗?

为了找到答案,我探索了框架的源代码,看看是否可能在每个 LSM 挂钩调用之间切换了安全 blob,我猜这将允许每个 LSM 只能访问自己的 blob,而不能访问另一个 LSM 的 blob。

但是,我们可以在 LSM 框架中看到,情况并非如此。

如果我的 LSM 声明了 blob 大小,如果我的内核也启用了 SELinux,我可以使用这些 blob 吗?SELinux 和我的结构不会重叠吗?

4

1 回答 1

0

好的,我在LSM框架中找到了相关代码。

QED:是的,所有 LSM 都可以使用安全 blob,只要它们使用 size 结构作为包含在模块启动后的偏移量。

说明

当你定义你的 LSM 时,你使用DEFINE_LSM宏,后面跟着各种信息,包括一个指向struct lsm_blobs_sizes.

在它自己的点火期间,LSM 框架(主要在 中实现security/security.c)在一些操作中操纵你的结构。

  • 它在自己的结构实例(在此处声明)中存储所有 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 的 blob 部分所在的偏移量。

  • 然后框架调用它们的 init 函数。

  • 稍后,当任何具有安全 blob(task_struct例如 a)的结构被分配时,框架将为所有安全模块的 blob 分配一个具有足够空间的 blob,然后使用它们中的偏移量在这个更大的 blob 中找到它们的位置。拥有lsm_blobs_sizes.

安全 blob 的总大小实际上是要使用init_debug,控制的。

所以这意味着所有 LSM 都可以定义安全 blob 大小。框架负责它们的分配(和释放),不同 LSM 的 blob 可以愉快地在内存中并存。

于 2020-08-22T22:43:08.283 回答