最新Linux内核中能否编写可动态加载卸载的Linux Security Module?
Linux 6.0+ 下编写可加载LSM模块的问题
我是Linux内核编程领域的新手,正在学习Linux Security Module(LSM)。目前查阅的资料(包括相关视频)都是将编写的模块编译进内核,再把完整编译后的内核安装到Ubuntu等机器上测试,但我希望编写一个可按需加载、卸载的模块,以便便捷测试功能正确性。
按照视频里的方法,我用security_add_hooks将自定义函数绑定到安全子系统,同时用到了依赖security_hook_heads结构体的LSM_HOOK_INIT,但生成.ko文件时出现以下错误:
ERROR: modpost: "security_add_hooks" [security/my_test.ko] undefined! ERROR: modpost: "security_hook_heads" [security/my_test.ko] undefined!
我明白security_add_hooks是未向模块导出的函数,于是尝试添加EXPORT_SYMBOL(security_add_hooks)让.ko文件可调用它,但又遇到security_hook_heads和security_hook_list两个结构体的导出问题。我尝试在lsm_hooks.h中结构体定义后添加导出语句:
struct security_hook_heads { #define LSM_HOOK(RET, DEFAULT, NAME, ...) struct hlist_head NAME; #include "lsm_hook_defs.h" #undef LSM_HOOK } __randomize_layout; EXPORT_SYMBOL(security_hook_heads);
却得到错误:
./include/linux/lsm_hooks.h:1601:15: error: ‘security_hook_heads’ undeclared here (not in a function) 1601 | EXPORT_SYMBOL(security_hook_heads);
我推测该错误是因无法从头文件导出符号,但无法解决此问题。
另外,我查阅的一些旧资料里使用register_security和unregister_security函数实现可加载LSM,但这些函数在Linux 6.0.0及以上的最新内核中已不存在。
请问是否有其他简便方法实现可加载、卸载的LSM模块?
内容的提问来源于stack exchange,提问作者Abhishek Ghosh
相关产品推荐
相关产品推荐

