【问题标题】:How can I implement my own hook function with LSM?如何使用 LSM 实现自己的钩子函数?
【发布时间】:2012-05-12 18:44:49
【问题描述】:

我正在学习有关访问控制的知识。 并尝试用 LSM api 实现自己的钩子函数。 但我发现我必须在内核版本 3.1.4 的内核源代码中编写代码。 那么,我该如何开始呢?

有人可以举个例子吗? 非常感谢。

PS:我找到了一些示例,但在内核版本 2.6.20 中。由于 LSM 已被修改,这些示例无法工作。

【问题讨论】:

    标签: linux-kernel


    【解决方案1】:

    自 2.6.35 起,您无法加载 LSM 模块(请参阅 c1e992b99603a84d7debb188542b64f2d9232c07 提交)。因此,将 LSM 置于内核之外并不是一项有效的任务。但是你总是可以尝试在运行时反汇编内核并找到所有私有符号,例如security_ops指针。

    例如,看看导出的security_sb_copy_data 符号:

    int security_sb_copy_data(char *orig, char *copy)
    {
            return security_ops->sb_copy_data(orig, copy);
    }
    EXPORT_SYMBOL(security_sb_copy_data);
    

    它的转储可能看起来像这样 (x86_64):

    (gdb) x/7i security_sb_copy_data 
       0xffffffff811f61b0:  push   %rbp
       0xffffffff811f61b1:  mov    %rsp,%rbp
       0xffffffff811f61b4:  data32 data32 data32 xchg %ax,%ax
       0xffffffff811f61b9:  mov    0x881690(%rip),%rax        # 0xffffffff81a77850
       0xffffffff811f61c0:  callq  *0x98(%rax)
       0xffffffff811f61c6:  pop    %rbp
       0xffffffff811f61c7:  retq
    

    所以,0xffffffff81a77850 地址是准确的security_ops 指针。让我们来看看:

    (gdb) x/s* 0xffffffff81a77850
    0xffffffff81850fa0:  "default"
    

    好的,现在我们有了有效的security_ops 指针,可以在内核外使用 LSM 做任何事情。

    P.S. 有一个很棒的 Linux 内核安全项目 - AKARI。它实现了有趣的私有符号解析方法,无需反汇编(详见sources)。

    【讨论】:

    • 非常感谢~我发现AKARI是基于Tomoyo的?好的,我试试看。
    猜你喜欢
    • 2017-09-08
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2019-08-24
    • 2019-04-23
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    相关资源
    最近更新 更多