Skip to content

Commit f9bb6ff

Browse files
borkmannAlexei Starovoitov
authored andcommitted
bpf: Fix out-of-bounds dynptr write in bpf_crypto_crypt
Stanislav reported that in bpf_crypto_crypt() the destination dynptr's size is not validated to be at least as large as the source dynptr's size before calling into the crypto backend with 'len = src_len'. This can result in an OOB write when the destination is smaller than the source. Concretely, in mentioned function, psrc and pdst are both linear buffers fetched from each dynptr: psrc = __bpf_dynptr_data(src, src_len); [...] pdst = __bpf_dynptr_data_rw(dst, dst_len); [...] err = decrypt ? ctx->type->decrypt(ctx->tfm, psrc, pdst, src_len, piv) : ctx->type->encrypt(ctx->tfm, psrc, pdst, src_len, piv); The crypto backend expects pdst to be large enough with a src_len length that can be written. Add an additional src_len > dst_len check and bail out if it's the case. Note that these kfuncs are accessible under root privileges only. Fixes: 3e1c6f3 ("bpf: make common crypto API for TC/XDP programs") Reported-by: Stanislav Fort <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]> Cc: Vadim Fedorenko <[email protected]> Reviewed-by: Vadim Fedorenko <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alexei Starovoitov <[email protected]>
1 parent e4414b0 commit f9bb6ff

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

kernel/bpf/crypto.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ static int bpf_crypto_crypt(const struct bpf_crypto_ctx *ctx,
278278
siv_len = siv ? __bpf_dynptr_size(siv) : 0;
279279
src_len = __bpf_dynptr_size(src);
280280
dst_len = __bpf_dynptr_size(dst);
281-
if (!src_len || !dst_len)
281+
if (!src_len || !dst_len || src_len > dst_len)
282282
return -EINVAL;
283283

284284
if (siv_len != ctx->siv_len)

0 commit comments

Comments
 (0)