如何编写Linux安全模块以拒绝内核6.x的删除(UNLINK)?

问题描述 投票:0回答:1
我想学习如何编写Linux安全模块以拒绝删除文件。 trom文档

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
c linux linux-security-module
1个回答
0
投票

void __init security_add_hooks(struct security_hook_list *hooks, int count, const struct lsm_id *lsmid)

注意,

__init
表示在启动过程中内核的早期初始化阶段中使用
security_add_hooks

。之后,[此类函数]的内存将被列为重述

,并制作了相应的函数。
,可以使用
loadable
模块可以使用此类功能。希望使用此类函数的模块内置在核心内核中。 当您尝试构建[可加载]模块时,构建系统就会识别出来,并使其无法链接。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.