From: Jakub Kicinski <kuba@kernel.org>
To: Ziyang Xuan <william.xuanziyang@huawei.com>
Cc: <borisp@nvidia.com>, <john.fastabend@gmail.com>,
<daniel@iogearbox.net>, <davem@davemloft.net>,
<pabeni@redhat.com>, <netdev@vger.kernel.org>,
<vakul.garg@nxp.com>, <davejwatson@fb.com>,
<linux-kernel@vger.kernel.org>,
Vadim Fedorenko <vfedorenko@novek.ru>
Subject: Re: [PATCH net] net/tls: fix slab-out-of-bounds bug in decrypt_internal
Date: Wed, 30 Mar 2022 09:39:25 -0700 [thread overview]
Message-ID: <20220330093925.2d8ee6ca@kernel.org> (raw)
In-Reply-To: <20220330085009.1011614-1-william.xuanziyang@huawei.com>
On Wed, 30 Mar 2022 16:50:09 +0800 Ziyang Xuan wrote:
> The memory size of tls_ctx->rx.iv for AES128-CCM is 12 setting in
> tls_set_sw_offload(). The return value of crypto_aead_ivsize()
> for "ccm(aes)" is 16. So memcpy() require 16 bytes from 12 bytes
> memory space will trigger slab-out-of-bounds bug as following:
>
> ==================================================================
> BUG: KASAN: slab-out-of-bounds in decrypt_internal+0x385/0xc40 [tls]
> Read of size 16 at addr ffff888114e84e60 by task tls/10911
>
> Call Trace:
> <TASK>
> dump_stack_lvl+0x34/0x44
> print_report.cold+0x5e/0x5db
> ? decrypt_internal+0x385/0xc40 [tls]
> kasan_report+0xab/0x120
> ? decrypt_internal+0x385/0xc40 [tls]
> kasan_check_range+0xf9/0x1e0
> memcpy+0x20/0x60
> decrypt_internal+0x385/0xc40 [tls]
> ? tls_get_rec+0x2e0/0x2e0 [tls]
> ? process_rx_list+0x1a5/0x420 [tls]
> ? tls_setup_from_iter.constprop.0+0x2e0/0x2e0 [tls]
> decrypt_skb_update+0x9d/0x400 [tls]
> tls_sw_recvmsg+0x3c8/0xb50 [tls]
>
> Allocated by task 10911:
> kasan_save_stack+0x1e/0x40
> __kasan_kmalloc+0x81/0xa0
> tls_set_sw_offload+0x2eb/0xa20 [tls]
> tls_setsockopt+0x68c/0x700 [tls]
> __sys_setsockopt+0xfe/0x1b0
Interesting, are you running on non-x86 platform or with some crypto
accelerator? I wonder why we're not hitting it with KASAN and the
selftest we have.
> Reserve MAX_IV_SIZE memory space for iv to be compatible with all
> ciphers. And do iv and salt copy like done in tls_do_encryption().
>
> Fixes: f295b3ae9f59 ("net/tls: Add support of AES128-CCM based ciphers")
> Signed-off-by: Ziyang Xuan <william.xuanziyang@huawei.com>
> ---
> net/tls/tls_sw.c | 10 +++-------
> 1 file changed, 3 insertions(+), 7 deletions(-)
>
> diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c
> index 0024a692f0f8..6b858f995b23 100644
> --- a/net/tls/tls_sw.c
> +++ b/net/tls/tls_sw.c
> @@ -1456,7 +1456,7 @@ static int decrypt_internal(struct sock *sk, struct sk_buff *skb,
> aead_size = sizeof(*aead_req) + crypto_aead_reqsize(ctx->aead_recv);
> mem_size = aead_size + (nsg * sizeof(struct scatterlist));
> mem_size = mem_size + prot->aad_size;
> - mem_size = mem_size + crypto_aead_ivsize(ctx->aead_recv);
> + mem_size = mem_size + MAX_IV_SIZE;
This change is not strictly required for the patch, right?
Can we drop it, and perhaps send as an optimization separately later?
> /* Allocate a single block of memory which contains
> * aead_req || sgin[] || sgout[] || aad || iv.
> @@ -1493,12 +1493,8 @@ static int decrypt_internal(struct sock *sk, struct sk_buff *skb,
> kfree(mem);
> return err;
> }
> - if (prot->version == TLS_1_3_VERSION ||
> - prot->cipher_type == TLS_CIPHER_CHACHA20_POLY1305)
> - memcpy(iv + iv_offset, tls_ctx->rx.iv,
> - crypto_aead_ivsize(ctx->aead_recv));
> - else
> - memcpy(iv + iv_offset, tls_ctx->rx.iv, prot->salt_size);
> + memcpy(iv + iv_offset, tls_ctx->rx.iv,
> + prot->iv_size + prot->salt_size);
If the IV really is 16B then we're passing 4 bytes of uninitialized
data at the end of the buffer, right?
> xor_iv_with_seq(prot, iv + iv_offset, tls_ctx->rx.rec_seq);
>
next prev parent reply other threads:[~2022-03-30 16:39 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-30 8:50 [PATCH net] net/tls: fix slab-out-of-bounds bug in decrypt_internal Ziyang Xuan
2022-03-30 16:39 ` Jakub Kicinski [this message]
2022-03-30 20:24 ` Jakub Kicinski
2022-03-30 21:43 ` Jakub Kicinski
2022-03-30 21:44 ` Ard Biesheuvel
2022-03-31 2:35 ` Ziyang Xuan (William)
2022-03-31 2:52 ` Jakub Kicinski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220330093925.2d8ee6ca@kernel.org \
--to=kuba@kernel.org \
--cc=borisp@nvidia.com \
--cc=daniel@iogearbox.net \
--cc=davejwatson@fb.com \
--cc=davem@davemloft.net \
--cc=john.fastabend@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=vakul.garg@nxp.com \
--cc=vfedorenko@novek.ru \
--cc=william.xuanziyang@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.