All of lore.kernel.org
 help / color / mirror / Atom feed
From: Barry Song <21cnbao@gmail.com>
To: Chengming Zhou <zhouchengming@bytedance.com>
Cc: Nhat Pham <nphamcs@gmail.com>, Chris Li <chrisl@kernel.org>,
	 syzbot <syzbot+3eff5e51bf1db122a16e@syzkaller.appspotmail.com>,
	 akpm@linux-foundation.org, davem@davemloft.net,
	herbert@gondor.apana.org.au,  linux-crypto@vger.kernel.org,
	linux-kernel@vger.kernel.org,  syzkaller-bugs@googlegroups.com,
	yosryahmed@google.com
Subject: Re: [syzbot] [crypto?] general protection fault in scatterwalk_copychunks (5)
Date: Wed, 27 Dec 2023 19:25:07 +1300	[thread overview]
Message-ID: <CAGsJ_4x31mT8TXt4c7ejJoDW1yJhyNqDmJmLZrf2LxMt7Zwg2A@mail.gmail.com> (raw)
In-Reply-To: <f27efd2e-ac65-4f6a-b1b5-c9fb0753d871@bytedance.com>

On Wed, Dec 27, 2023 at 4:51 PM Chengming Zhou
<zhouchengming@bytedance.com> wrote:
>
> On 2023/12/27 08:23, Nhat Pham wrote:
> > On Tue, Dec 26, 2023 at 3:30 PM Chris Li <chrisl@kernel.org> wrote:
> >>
> >> Again, sorry I was looking at the decompression side rather than the
> >> compression side. The compression side does not even offer a safe
> >> version of the compression function.
> >> That seems to be dangerous. It seems for now we should make the zswap
> >> roll back to 2 page buffer until we have a safe way to do compression
> >> without overwriting the output buffers.
> >
> > Unfortunately, I think this is the way - at least until we rework the
> > crypto/compression API (if that's even possible?).
> > I still think the 2 page buffer is dumb, but it is what it is :(
>
> Hi,
>
> I think it's a bug in `scomp_acomp_comp_decomp()`, which doesn't use
> the caller passed "src" and "dst" scatterlist. Instead, it uses its own
> per-cpu "scomp_scratch", which have 128KB src and dst.
>
> When compression done, it uses the output req->dlen to copy scomp_scratch->dst
> to our dstmem, which has only one page now, so this problem happened.
>
> I still don't know why the alg->compress(src, slen, dst, &dlen) doesn't
> check the dlen? It seems an obvious bug, right?
>
> As for this problem in `scomp_acomp_comp_decomp()`, this patch below
> should fix it. I will set up a few tests to check later.
>
> Thanks!
>
> diff --git a/crypto/scompress.c b/crypto/scompress.c
> index 442a82c9de7d..e654a120ae5a 100644
> --- a/crypto/scompress.c
> +++ b/crypto/scompress.c
> @@ -117,6 +117,7 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir)
>         struct crypto_scomp *scomp = *tfm_ctx;
>         void **ctx = acomp_request_ctx(req);
>         struct scomp_scratch *scratch;
> +       unsigned int dlen;
>         int ret;
>
>         if (!req->src || !req->slen || req->slen > SCOMP_SCRATCH_SIZE)
> @@ -128,6 +129,8 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir)
>         if (!req->dlen || req->dlen > SCOMP_SCRATCH_SIZE)
>                 req->dlen = SCOMP_SCRATCH_SIZE;
>
> +       dlen = req->dlen;
> +
>         scratch = raw_cpu_ptr(&scomp_scratch);
>         spin_lock(&scratch->lock);
>
> @@ -145,6 +148,9 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir)
>                                 ret = -ENOMEM;
>                                 goto out;
>                         }
> +               } else if (req->dlen > dlen) {
> +                       ret = -ENOMEM;
> +                       goto out;
>                 }

This can't fix the problem as crypto_scomp_compress() has written overflow data.

BTW, in many cases, hardware-accelerators drivers/crypto can do compression and
decompression by off-loading CPU;
we won't have a chance to let hardware check the dst buffer size. so
giving the dst buffer
with enough length to the hardware's dma engine is the right way. I
mean, we shouldn't
change dst from 2pages to 1page.

>                 scatterwalk_map_and_copy(scratch->dst, req->dst, 0, req->dlen,
>                                          1);


Thanks
Barry

  reply	other threads:[~2023-12-27  6:25 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-26 15:28 [syzbot] [crypto?] general protection fault in scatterwalk_copychunks (5) syzbot
2023-12-26 21:08 ` Nhat Pham
2023-12-26 22:32   ` Chris Li
2023-12-26 23:11     ` Nhat Pham
2023-12-26 23:29       ` Chris Li
2023-12-27  0:23         ` Nhat Pham
2023-12-27  3:51           ` Chengming Zhou
2023-12-27  6:25             ` Barry Song [this message]
2023-12-27  6:38               ` Chengming Zhou
2023-12-27  7:01                 ` Barry Song
2023-12-27  9:15                   ` Chengming Zhou
2023-12-27 11:10                     ` Barry Song
2023-12-27 23:26                       ` Nhat Pham
2023-12-28  1:43                         ` Barry Song
2023-12-28  1:47                           ` Barry Song
2023-12-28 19:18                             ` Nhat Pham
2023-12-27  7:13                 ` Barry Song
2024-01-03  5:31                 ` [PATCH RFC] crypto: scompress: remove memcpy if sg_nents is 1 Barry Song
2024-01-03  6:53                 ` [syzbot] [crypto?] general protection fault in scatterwalk_copychunks (5) Barry Song
2024-01-03  8:41                   ` Chengming Zhou
2023-12-27  2:27 ` [syzbot] [perf?] WARNING in perf_event_open Edward Adam Davis
2023-12-27  2:42   ` [syzbot] [crypto?] general protection fault in scatterwalk_copychunks (5) syzbot
2023-12-27  6:50 ` [PATCH] crypto: scompress - fix req->dst buffer overflow chengming.zhou
2023-12-27  9:26   ` Herbert Xu
2023-12-27  9:28     ` Chengming Zhou
2023-12-27  9:30       ` Herbert Xu
2023-12-27  9:35 ` [PATCH v2] " chengming.zhou
2023-12-27 11:05   ` Barry Song
2023-12-29  3:30   ` Herbert Xu
2023-12-28  2:28 ` [syzbot] [crypto?] general protection fault in scatterwalk_copychunks (5) Chengming Zhou
2023-12-28  3:58   ` syzbot

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=CAGsJ_4x31mT8TXt4c7ejJoDW1yJhyNqDmJmLZrf2LxMt7Zwg2A@mail.gmail.com \
    --to=21cnbao@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=chrisl@kernel.org \
    --cc=davem@davemloft.net \
    --cc=herbert@gondor.apana.org.au \
    --cc=linux-crypto@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nphamcs@gmail.com \
    --cc=syzbot+3eff5e51bf1db122a16e@syzkaller.appspotmail.com \
    --cc=syzkaller-bugs@googlegroups.com \
    --cc=yosryahmed@google.com \
    --cc=zhouchengming@bytedance.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.