Невозможно использовать пользовательский тип программы eBPF (Landlock LSM)
В настоящее время я тестирую LSM без блокировки, среду, позволяющую выгружать код eBPF из контейнера, чтобы безопасно применять ограничения к себе.
Эта структура вносит некоторые изменения, чтобы расширить поведение bpf (например, в usr/include/linux/bph.h мы видим, что последнее поле было добавлено)
enum bpf_prog_type {
BPF_PROG_TYPE_UNSPEC,
BPF_PROG_TYPE_SOCKET_FILTER,
BPF_PROG_TYPE_KPROBE,
BPF_PROG_TYPE_SCHED_CLS,
BPF_PROG_TYPE_SCHED_ACT,
BPF_PROG_TYPE_TRACEPOINT,
BPF_PROG_TYPE_XDP,
BPF_PROG_TYPE_PERF_EVENT,
BPF_PROG_TYPE_CGROUP_SKB,
BPF_PROG_TYPE_CGROUP_SOCK,
BPF_PROG_TYPE_LWT_IN,
BPF_PROG_TYPE_LWT_OUT,
BPF_PROG_TYPE_LWT_XMIT,
BPF_PROG_TYPE_SOCK_OPS,
BPF_PROG_TYPE_SK_SKB,
BPF_PROG_TYPE_CGROUP_DEVICE,
BPF_PROG_TYPE_LANDLOCK_HOOK,
};
Но после компиляции ядра и некоторых попыток, когда я запускаю самотестирование, те, кто вызывает этот новый тип, терпят неудачу, например:
sudo strace -ebpf ./test_verifier 590 590
bpf(BPF_PROG_LOAD, {prog_type=0x10 /* BPF_PROG_TYPE_??? */, insn_cnt=2, insns=0x5574b7e6af88, license="GPL", log_level=1, log_size=32768, log_buf=0x5574b7e6f3a0, kern_version=0, prog_flags=0, ...}, 88) = -1 EINVAL (Invalid argument)
#590/p landlock/fs_pick: always accept FAIL
Failed to load prog 'Invalid argument'!
Summary: 0 PASSED, 0 SKIPPED, 1 FAILED
+++ exited with 1 +++
Самотест код был:
{
"landlock/fs_pick: always accept",
.insns = {
BPF_MOV32_IMM(BPF_REG_0, 0),
BPF_EXIT_INSN(),
},
.result = ACCEPT,
.prog_type = BPF_PROG_TYPE_LANDLOCK_HOOK,
.has_prog_subtype = true,
.prog_subtype = {
.landlock_hook = {
.type = LANDLOCK_HOOK_FS_PICK,
.triggers = LANDLOCK_TRIGGER_FS_PICK_READ,
}
},
}
Другие самопроверки проходят нормально.
Как будто я пытаюсь запустить программу, которая нуждается в расширенной версии ebpf на обычной... Но, поскольку я перекомпилировал использовать новое определение eBPF, я думаю, что все должно быть в порядке.
Нужно ли делать что-то еще, чтобы установить версию eBPF для лендлока? Или это проблема, связанная с разрешением?
Некоторые заметки, чтобы предвидеть вопросы
Я перекомпилировал свое ядро с правильными настройками и поддержкой eBPF
> cat .config | grep BPF
CONFIG_CGROUP_BPF=y
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_JIT_ALWAYS_ON=y
CONFIG_NETFILTER_XT_MATCH_BPF=m
CONFIG_NET_CLS_BPF=m
CONFIG_NET_ACT_BPF=m
CONFIG_BPF_JIT=y
CONFIG_BPF_STREAM_PARSER=y
CONFIG_LWTUNNEL_BPF=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_BPF_EVENTS=y
# CONFIG_BPF_KPROBE_OVERRIDE is not set
Я запускаю скомпилированное ядро.
> uname -r
4.16.0-rc1Landlock-74517-g509c99a04631
Редактировать: я работаю с последней версией Landlock (v8) оттуда
Также, когда я пытаюсь запустить утилиту landlock1, я сталкиваюсь с той же ошибкой. Кроме того, в статье говорится, что я должен иметь возможность запускать эту утилиту без прав администратора, но когда я запускаю инструмент landlock1 в режиме пользователя, я получаю эту ошибку: sh: 1: cannot create /sys/kernel/debug/tracing/kprobe_events: Permission denied
, В настоящее время я просто избавился от этого, запустив его как root.
Спасибо за вашу помощь