如何用LSM实现自己的钩子函数?

时间:2012-05-03 09:04:06

标签: linux-kernel

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

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

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

1 个答案:

答案 0 :(得分:0)

自2.6.35起,您无法加载LSM模块(请参阅c1e992b99603a84d7debb188542b64f2d9232c07 commit)。因此,将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)。