我正在学习一些有关访问控制。 并试图实现与LSM API自己的钩子函数。 但我发现我不得不代码在内核版本3.1.4内核源代码。 那么,怎样才能开始?
可能有人给它一个例子吗? 非常感谢。
PS:我已经发现了一些例子,但在内核版本2.6.20。 随着LSM已被修改,这些例子不能工作。
我正在学习一些有关访问控制。 并试图实现与LSM API自己的钩子函数。 但我发现我不得不代码在内核版本3.1.4内核源代码。 那么,怎样才能开始?
可能有人给它一个例子吗? 非常感谢。
PS:我已经发现了一些例子,但在内核版本2.6.20。 随着LSM已被修改,这些例子不能工作。
你不能加载LSM模块自2.6.35(见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"
OK,现在我们已经有效security_ops
的指针,可以做的内核之外LSM什么。
PS
有一个伟大的Linux内核安全项目- AKARI。 它实现了无需拆卸的专用符号分辨率有趣的方法(见来源的详细信息)。