Как остановить открытие файла с помощью Ebpf?

Я хочу использовать EBPF и поместить зонд в открытый системный вызов, поэтому, когда пользователь хочет открыть определенный файл, я проверяю его имя, и если это целевое имя, я останавливаю его открытие. Единственное, я не знаю, как на самом деле достичь этой цели.

Кроме того, я был бы признателен, если бы вы могли указать, работает ли определенное решение с uprobe или root probe. Большое спасибо.


person Liroshka    schedule 09.02.2020    source источник
comment
Что произойдет, если пользователь сделает символическую ссылку на файл и попытается его открыть? Или жесткая ссылка?   -  person bk2204    schedule 09.02.2020


Ответы (1)


TL;DR. В настоящее время это невозможно сделать с помощью BPF.


В настоящее время в ядре Linux нет опции для применения политик к системным вызовам с использованием eBPF. Это может измениться с введением LSM (модулей безопасности Linux) на основе eBPF (см. Инструментарий безопасности ядра во время выполнения, KRSI — другой модуль безопасности BPF и KRSI и проприетарные программы BPF).

Однако вы можете применять политики для системных вызовов с помощью seccomp-bpf, но он использует cBPF, старый байт-код BPF, вместо eBPF. Тем не менее невозможно проверить аргументы системного вызова, передаваемые указателями с помощью seccomp-bpf, для соображения безопасности; поэтому вы не сможете проверить имя открываемого файла.

person pchaigno    schedule 10.02.2020
comment
Знаете ли вы другой способ остановить пользователя, когда он открывает файл? - person Liroshka; 10.02.2020
comment
Я бы проверил AppArmor и SELinux (это другие LSM). - person pchaigno; 10.02.2020
comment
Технически, используя seccomp-bpf, можно условно активировать SIGSYS, который будет синхронно отправлен именно тому потоку, который вызвал подозрительный системный вызов. Затем обработчик SIGSYS пользовательского пространства может каким-то образом обрабатывать аргументы из ucontext, переданные обработчику, и условно передавать их или около того. Лично я использую трюк с передачей некоторого известного маркера int в качестве самого высокого (в настоящее время 6-го) аргумента системного вызова в качестве знака прохождения. Однако это не работает с mmap и другими системными вызовами с 6 аргументами. Это предполагает, что программы не будут специально препятствовать предварительной загрузке или около того. - person Anatoly Trosinenko; 10.02.2020
comment
Да, есть несколько вариантов отложить принятие решений в пользовательское пространство, включая SECCOMP_RET_USER_NOTIF и SECCOMP_RET_TRACE. Я не включил их в ответ, потому что @Liroshka специально просил решение на основе BPF. Я бы сказал, что для их варианта использования SELinux/Apparmor в любом случае являются более простыми решениями :-) - person pchaigno; 10.02.2020