Всякий раз, когда я пытаюсь записать в файл внутри модуля безопасности 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);
}
Подробный cra sh журнал:
BUG: stack guard page was hit at 0000000011758623 (stack is 00000000132ba182..0000000012b2f5a4)
Uname:
Linux bnp 4.19.0-9-amd64 #12 SMP Debian 4.19.118-2 (2020-04-29) x86_64 GNU/Linux