]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
bpf, ktls: Fix data corruption when using bpf_msg_pop_data() in ktls
authorJiayuan Chen <jiayuan.chen@linux.dev>
Mon, 9 Jun 2025 02:08:52 +0000 (10:08 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 15 Aug 2025 10:08:44 +0000 (12:08 +0200)
[ Upstream commit 178f6a5c8cb3b6be1602de0964cd440243f493c9 ]

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
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/tls/tls_sw.c

index 4a9a3aed5d6d4141a3a45f34fe10373132e5d1a4..4905a81c4ac194e033dab45b5ac10ad4e5c7f7ca 100644 (file)
@@ -872,6 +872,19 @@ more_data:
                delta = msg->sg.size;
                psock->eval = sk_psock_msg_verdict(sk, psock, msg);
                delta -= msg->sg.size;
+
+               if ((s32)delta > 0) {
+                       /* It indicates that we executed bpf_msg_pop_data(),
+                        * causing the plaintext data size to decrease.
+                        * Therefore the encrypted data size also needs to
+                        * correspondingly decrease. We only need to subtract
+                        * delta to calculate the new ciphertext length since
+                        * ktls does not support block encryption.
+                        */
+                       struct sk_msg *enc = &ctx->open_rec->msg_encrypted;
+
+                       sk_msg_trim(sk, enc, enc->sg.size - delta);
+               }
        }
        if (msg->cork_bytes && msg->cork_bytes > msg->sg.size &&
            !enospc && !full_record) {