Невозможно использовать пользовательский тип программы 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.

Спасибо за вашу помощь

0 ответов

Другие вопросы по тегам