[PATCH bpf-next 05/11] selftests/bpf: Add a test for the sealed bpf keyring
Daniel Borkmann <[email protected]>
| Newsgroups | org.kernel.vger.bpf |
|---|---|
| Message-ID | <[email protected]> |
bpf_keyring_sealed checks that a load naming the bpf keyring fails with -ENOKEY while the keyring has not been provisioned. It uses a junk signature as the size check and the keyring lookup both happen before any crypto, so the error under test is reached without a real signature and the ordering is what gets verified: # LDLIBS=-static PKG_CONFIG='pkg-config --static' ./vmtest.sh -- ./test_progs -t signed_loader [...] #424/9 signed_loader/signed_module_kfunc_rejected:OK #424/10 signed_loader/signature_failure_logs:OK #424/11 signed_loader/signature_too_large:OK #424/12 signed_loader/signature_zero_size:OK #424/13 signed_loader/signature_bad_keyring:OK #424/14 signed_loader/bpf_keyring_sealed:OK #424/15 signed_loader/metadata_ctx_max_entries_ignored:OK #424/16 signed_loader/metadata_ctx_initial_value_ignored:OK #424/17 signed_loader/signature_authenticates_insns:OK #424/18 signed_loader/signature_authenticates_metadata:OK #424/19 signed_loader/hash_requires_frozen:OK [...] #424 signed_loader:OK Summary: 1/30 PASSED, 0 SKIPPED, 0/0 FAILED Signed-off-by: Daniel Borkmann <[email protected]> --- .../selftests/bpf/prog_tests/signed_loader.c | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tools/testing/selftests/bpf/prog_tests/signed_loader.c b/tools/testing/selftests/bpf/prog_tests/signed_loader.c index 0c5294738d6c..94b57e7cdab3 100644 --- a/tools/testing/selftests/bpf/prog_tests/signed_loader.c +++ b/tools/testing/selftests/bpf/prog_tests/signed_loader.c @@ -32,8 +32,11 @@ enum { BPF_SIG_KEYRING_SECONDARY, BPF_SIG_KEYRING_PLATFORM, BPF_SIG_KEYRING_USER, + BPF_SIG_KEYRING_BPF, }; +#define BPF_KEYRING_BPF 3 + static int load_loader(const void *insns, __u32 insns_sz, int map_fd, const void *sig, __u32 sig_sz, __s32 keyring_id, __u32 fd_array_cnt) @@ -627,6 +630,28 @@ static void signature_bad_keyring(void) gen_loader_fixture_fini(&f); } +static void bpf_keyring_sealed(void) +{ + static const __u8 junk[64] = {}; + struct gen_loader_fixture f; + int fd; + + if (gen_loader_fixture_init(&f) == 0) { + /* + * Without bpf.keyring_unsealed=1 on the command line the bpf + * keyring is sealed empty during boot, so it is never handed + * out and a load naming it fails with -ENOKEY before the + * signature bytes are examined. + */ + fd = load_loader(f.gopts.insns, f.gopts.insns_sz, -1, junk, + sizeof(junk), BPF_KEYRING_BPF, 0); + ASSERT_EQ(fd, -ENOKEY, "sealed bpf keyring rejected"); + if (fd >= 0) + close(fd); + } + gen_loader_fixture_fini(&f); +} + /* * A signed loader must ignore ctx-supplied map dimensions: the host cannot * resize a signed program's maps via the loader ctx. Drive a one-map program @@ -1806,6 +1831,8 @@ void test_signed_loader(void) signature_zero_size(); if (test__start_subtest("signature_bad_keyring")) signature_bad_keyring(); + if (test__start_subtest("bpf_keyring_sealed")) + bpf_keyring_sealed(); if (test__start_subtest("metadata_ctx_max_entries_ignored")) metadata_ctx_max_entries_ignored(); if (test__start_subtest("metadata_ctx_initial_value_ignored")) -- 2.43.0