我正在学习有关访问控制的知识。并尝试用 LSM api 实现自己的钩子函数。但我发现我必须在内核版本 3.1.4 的内核源代码中编写代码。那么,我该如何开始呢?
有人可以举个例子吗?非常感谢。
PS:我找到了一些示例,但在内核版本 2.6.20 中。由于 LSM 已被修改,这些示例无法工作。
我正在学习有关访问控制的知识。并尝试用 LSM api 实现自己的钩子函数。但我发现我必须在内核版本 3.1.4 的内核源代码中编写代码。那么,我该如何开始呢?
有人可以举个例子吗?非常感谢。
PS:我找到了一些示例,但在内核版本 2.6.20 中。由于 LSM 已被修改,这些示例无法工作。
自 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。它实现了有趣的私有符号解析方法,无需反汇编(详见源代码)。