Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bpf, ktls: Fix data corruption when using bpf_msg_pop_data() in ktls

When sending plaintext data, we initially calculated the corresponding
ciphertext length. However, if we later reduced the plaintext data length
via socket policy, we failed to recalculate the ciphertext length.

This results in transmitting buffers containing uninitialized data during
ciphertext transmission.

This causes uninitialized bytes to be appended after a complete
"Application Data" packet, leading to errors on the receiving end when
parsing TLS record.

Fixes: d3b18ad31f93 ("tls: add bpf support to sk_msg handling")
Reported-by: Cong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: Jiayuan Chen <jiayuan.chen@linux.dev>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Reviewed-by: John Fastabend <john.fastabend@gmail.com>
Acked-by: Jakub Kicinski <kuba@kernel.org>
Link: https://lore.kernel.org/bpf/20250609020910.397930-2-jiayuan.chen@linux.dev

authored by

Jiayuan Chen and committed by
Daniel Borkmann
178f6a5c 76be5fae

+13
+13
net/tls/tls_sw.c
··· 872 872 delta = msg->sg.size; 873 873 psock->eval = sk_psock_msg_verdict(sk, psock, msg); 874 874 delta -= msg->sg.size; 875 + 876 + if ((s32)delta > 0) { 877 + /* It indicates that we executed bpf_msg_pop_data(), 878 + * causing the plaintext data size to decrease. 879 + * Therefore the encrypted data size also needs to 880 + * correspondingly decrease. We only need to subtract 881 + * delta to calculate the new ciphertext length since 882 + * ktls does not support block encryption. 883 + */ 884 + struct sk_msg *enc = &ctx->open_rec->msg_encrypted; 885 + 886 + sk_msg_trim(sk, enc, enc->sg.size - delta); 887 + } 875 888 } 876 889 if (msg->cork_bytes && msg->cork_bytes > msg->sg.size && 877 890 !enospc && !full_record) {