mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 20:54:03 +02:00
bpftool: Cover loader metadata with the program signature
bpftool_prog_sign() signed only the loader instructions. The metadata blob the loader installs was left to an in-loader hash check, which the kernel now performs at load time over insns || metadata. Sign that same concatenation: pass the metadata blob (gen_loader_opts data) through to bpftool_prog_sign() and feed insns || metadata to CMS_final(). The excl_prog_hash stays a digest of the instructions alone; it binds the metadata map to the loader and is matched against prog->digest by the verifier, independent of what the signature covers. The signed artifact is now plain data: both bytes the signature covers are embedded verbatim in the generated skeleton, so signing and verifying an lskel is an ordinary CMS operation that a signer or auditor can perform (or reproduce) offline, without analyzing loader bytecode to establish what the signature actually attests to. Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Reviewed-by: Quentin Monnet <qmo@kernel.org> Link: https://lore.kernel.org/bpf/20260708075343.358712-6-daniel@iogearbox.net Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
This commit is contained in:
parent
576bcaa1f5
commit
92c7717981
|
|
@ -793,6 +793,8 @@ static int gen_trace(struct bpf_object *obj, const char *obj_name, const char *h
|
|||
if (sign_progs) {
|
||||
sopts.insns = opts.insns;
|
||||
sopts.insns_sz = opts.insns_sz;
|
||||
sopts.data = opts.data;
|
||||
sopts.data_sz = opts.data_sz;
|
||||
sopts.excl_prog_hash = prog_sha;
|
||||
sopts.excl_prog_hash_sz = sizeof(prog_sha);
|
||||
sopts.signature = sig_buf;
|
||||
|
|
|
|||
|
|
@ -135,9 +135,21 @@ int bpftool_prog_sign(struct bpf_load_and_run_opts *opts)
|
|||
CMS_ContentInfo *cms = NULL;
|
||||
long actual_sig_len = 0;
|
||||
X509 *x509 = NULL;
|
||||
void *data = NULL;
|
||||
size_t data_sz;
|
||||
int err = 0;
|
||||
|
||||
bd_in = BIO_new_mem_buf(opts->insns, opts->insns_sz);
|
||||
data_sz = (size_t)opts->insns_sz + opts->data_sz;
|
||||
data = malloc(data_sz);
|
||||
if (!data) {
|
||||
err = -ENOMEM;
|
||||
goto cleanup;
|
||||
}
|
||||
memcpy(data, opts->insns, opts->insns_sz);
|
||||
if (opts->data_sz)
|
||||
memcpy((char *)data + opts->insns_sz, opts->data, opts->data_sz);
|
||||
|
||||
bd_in = BIO_new_mem_buf(data, data_sz);
|
||||
if (!bd_in) {
|
||||
err = -ENOMEM;
|
||||
goto cleanup;
|
||||
|
|
@ -181,7 +193,7 @@ int bpftool_prog_sign(struct bpf_load_and_run_opts *opts)
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
bd_out = BIO_new(BIO_s_mem());
|
||||
bd_out = BIO_new(BIO_s_mem());
|
||||
if (!bd_out) {
|
||||
err = -ENOMEM;
|
||||
goto cleanup;
|
||||
|
|
@ -215,6 +227,7 @@ int bpftool_prog_sign(struct bpf_load_and_run_opts *opts)
|
|||
X509_free(x509);
|
||||
EVP_PKEY_free(private_key);
|
||||
BIO_free(bd_in);
|
||||
free(data);
|
||||
DISPLAY_OSSL_ERR(err < 0);
|
||||
return err;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user