Почему этот kernel_write вызывает cra sh? - PullRequest
0 голосов
/ 09 июля 2020

Всякий раз, когда я пытаюсь записать в файл внутри модуля безопасности 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

1 Ответ

2 голосов
/ 09 июля 2020

Кажется, вы регистрируете свою функцию как ловушку для file_permissions проверки, которая выполняется внутри функции security_file_permission .

Но эта функция также выполняется, когда вы вызываете kernel_write:

Итак, у вас есть рекурсия , которая просто исчерпывает стек.

Для прерывания рекурсии вам нужно каким-то образом определить, что ваш хук вызван для /var/bnp/access.log файл , открытый вами , и больше не открывать (и не записывать) этот файл.

...