0

每当我尝试写入正在处理的 Linux 安全模块中的文件时,内核都会崩溃并显示以下错误消息。

我尝试使用vfs_write而不是kernel_write,尝试使用普通字符数组而不是我现在使用的缓冲区,但它总是崩溃并出现类似的错误消息。

错误消息的原因是什么,我该如何解决?

我知道在内核中写入文件是不好的,但我需要持久存储信息。

下面是我正在使用的代码的简化版本,它在 LSM_HOOK 中执行。

static int bnp_file_permission(struct file *file, int mask)
{
     loff_t offset = 0;
     struct file *filp = NULL;
     char *buffer = NULL;

     filp = filp_open("/var/bnp/access.log", O_WRONLY | O_APPEND, 0);
     if (IS_ERR(filp)) {
        printk(KERN_INFO "BNP: filp_open failed\n");
        return 0;
     }

     buffer = kmalloc(20, GFP_KERNEL);
     memset(buffer, 0x65, 20);

     kernel_write(filp, buffer, sizeof(buffer), &offset); // <-- this lines causes the crash

     filp_close(filp, NULL);
     kfree(buffer);
}

详细的崩溃日志:

BUG: stack guard page was hit at 0000000011758623 (stack is 00000000132ba182..0000000012b2f5a4)

姓名:

Linux bnp 4.19.0-9-amd64 #12 SMP Debian 4.19.118-2 (2020-04-29) x86_64 GNU/Linux
4

1 回答 1

2

似乎您将函数注册为file_permissions检查钩子,这是在security_file_permission函数中执行的。

但是当您调用时也会执行此函数kernel_write

所以你有一个简单地耗尽堆栈的递归。

为了中断递归,您需要以某种方式检测您的钩子是为您打开的/var/bnp/access.log文件调用的,并且不要再次打开(并写入)该文件。

于 2020-07-09T20:50:48.400 回答