【问题标题】:Can non-exclusive (stackable) Linux Security Modules use security blobs?非独占(可堆叠)Linux 安全模块可以使用安全 blob 吗?
【发布时间】:2020-12-10 00:34:36
【问题描述】:

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

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

我知道有两种 LSM。

  • SELinux / AppArmor 等专有 LSM,在其 LSM 定义中设置了 LSM_FLAG_EXCLUSIVE 标志。
  • Yama、功能或锁定等非专有 LSM。

浏览所有这些 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 和我的结构不会重叠吗?

【问题讨论】:

    标签: linux kernel linux-security-module


    【解决方案1】:

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

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

    解释

    定义 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 的 blob 部分所在的偏移量。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-03-20
      • 2010-10-11
      • 2013-01-06
      • 2016-04-28
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多