Https://www.kernel.org/doc/html/v5.4/security/security/lsm-development.html,我可以看到有2个函数:
path_unlink
和inode_unlink
似乎与非链接有关。因此,我选择了其中一个,并试图将其挂钩以查看如何以及是否有效。
LSM_HELLO.C
#include <linux/module.h>
#include <linux/init.h>
#include <linux/security.h>
#include <linux/lsm_hooks.h>
static int hello_lsm_inode_unlink(struct inode *dir, struct dentry *dentry) {
pr_info("LSM Hello World: Preventing unlink for file: %s\n", dentry->d_name.name);
return -EPERM; // Prevent the file from being deleted
}
static struct security_hook_list hello_hooks[] = {
LSM_HOOK_INIT(inode_unlink, hello_lsm_inode_unlink),
};
static int __init hello_lsm_init(void) {
pr_info("LSM Hello World: Initializing\n");
security_add_hooks(hello_hooks, ARRAY_SIZE(hello_hooks), "lsm_hello");
return 0;
}
static void __exit hello_lsm_exit(void) {
pr_info("LSM Hello World: Exiting\n");
}
module_init(hello_lsm_init);
module_exit(hello_lsm_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("You");
MODULE_DESCRIPTION("Minimal LSM with inode_unlink hook");
和makefile:
EXTRA_CFLAGS += -DCONFIG_SECURITY_WRITABLE_HOOKS
obj-m := lsm_hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
但是,当我编译时,我会得到这些错误,并且不会生成.ko文件:
make[1]: Entering directory '/usr/src/linux-headers-6.1.0-31-amd64'
CC [M] /root/lsm_hello/lsm_hello.o
MODPOST /root/lsm_hello/Module.symvers
ERROR: modpost: "security_add_hooks" [/root/lsm_hello/lsm_hello.ko] undefined!
ERROR: modpost: "security_hook_heads" [/root/lsm_hello/lsm_hello.ko] undefined!
make[2]: *** [/usr/src/linux-headers-6.1.0-31-common/scripts/Makefile.modpost:127: /root/lsm_hello/Module.symvers] Error 1
make[1]: *** [/usr/src/linux-headers-6.1.0-31-common/Makefile:1986: modpost] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-6.1.0-31-amd64'
make: *** [Makefile:6: all] Error 2
在经历和错误时,我发现问题来自这一行:
security_add_hooks(hello_hooks, ARRAY_SIZE(hello_hooks), "lsm_hello");
如果我评论出来,则可以很好地编译,我可以验证它有效:
root@debian:~/lsm_hello# insmod lsm_hello.ko
root@debian:~/lsm_hello# rmmod lsm_hello
root@debian:~/lsm_hello# journalctl --since "1 hour ago" | grep kernel.
Mar 16 15:21:33 debian kernel: LSM Hello World: Initializing
Mar 16 15:21:46 debian kernel: LSM Hello World: Exiting
正确编写此书的正确方法是什么,因为正确的方式与版本之间的正确方法不同?
在
security/security.c
void __init security_add_hooks(struct security_hook_list *hooks, int count,
const struct lsm_id *lsmid)
__init
表示在启动过程中内核的早期初始化阶段中使用
security_add_hooks
。之后,[此类函数]的内存将被列为重述
,并制作了相应的函数。,可以使用
loadable模块可以使用此类功能。希望使用此类函数的模块内置在核心内核中。 当您尝试构建[可加载]模块时,构建系统就会识别出来,并使其无法链接。