【问题标题】:Why does this kernel_write-call crash?为什么这个 kernel_write-call 会崩溃?
【发布时间】:2020-10-30 10:38:12
【问题描述】:

每当我尝试写入正在处理的 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

【问题讨论】:

  • 您的“详细崩溃日志”一点也不详细。 BUG: ... 行后面应该有更多信息,包括堆栈跟踪和寄存器内容的转储。请包括它。

标签: linux file-io linux-kernel linux-security-module


【解决方案1】:

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

但是这个函数在你调用kernel_write的时候也会执行:

所以你有一个递归,它只会耗尽堆栈。

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

【讨论】:

  • 旁注:sizeof(buffer) 也是错误的,应该是20
  • @MarcoBonelli:但是将 20 替换为 sizeof(buffer) 不会导致错误:由于 sizeof(buffer) sizeof(buffer) 不会溢出缓冲区并且完全允许。
  • 是的,我只是指出这一点,这是一个不相关的错误。
猜你喜欢
  • 1970-01-01
  • 2022-01-13
  • 2017-04-01
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多