1

我想将 LSM 框架与内核 ubuntu 2.6.36 一起使用。

当我编译内核模块时,它写道:

警告:“register_security”未定义!

经过大量的谷歌搜索,我发现原因是该register_security()符号不再在 2.6 内核中导出。

所以我EXPORT_SYMBOL(register_security)在 ../security/security.c 文件中添加,并重新编译内核。

用新内核启动后,我添加extern int register_security(struct security_operations *ops)了我的内核模块文件,并再次编译了模块。但是,警告信息仍然存在。如果我继续学习insmode该模块,则dmesg告诉我

未知符号 register_security

我应该怎么办?如何注册 Linux 安全模块?

4

3 回答 3

0

在现代内核中, register_security 符号不会导出。这意味着您不能将 LSM 模块注册为模块。但是,如果您真的希望这样做,您可以这样做 :) 查看导出的 LSM 符号,例如security_sb_copy_data. 它们是security_ops->some_lsm_method. 因此,您可以使用他们的代码来确定security_ops指针值。虽然它需要反汇编程序。

于 2012-02-04T12:17:59.277 回答
0
Unknown symbol register_security

发生在您取消注册 LSM 的那一行。所以在 security.c 中添加 unregister_security() 并导出它:

 /**
 *  unregister_security - allows security modules to be moved
 * @ops : a pointer to the struct security_options that had been registered before.
 */
 int unregister_security(struct security_operations *ops)
{
        if (ops != security_ops) 
      {
                printk (KERN_INFO "%s: trying to unregister "
                        "a security_opts structure that is not "
                         "registered, failing.\n", __FUNCTION__);
                return -EINVAL;
         }
     security_ops = &dummy_security_ops;
      return 0;
}
 EXPORT_SYMBOL(unregister_security);

并重新编译内核。

于 2012-07-20T05:11:38.293 回答
0
  1. 确保新加载的内核是您编译的内核。
  2. 检查您的模块的许可证(参考: http: //lists.jammed.com/linux-security-module/2004/08/0053.html
于 2010-11-15T04:42:26.010 回答