From: Eric Biggers <ebiggers@kernel.org>
To: Herbert Xu <herbert@gondor.apana.org.au>
Cc: syzbot <syzbot+fc0674cde00b66844470@syzkaller.appspotmail.com>,
davem@davemloft.net, linux-crypto@vger.kernel.org,
linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
syzkaller-bugs@googlegroups.com
Subject: Re: crypto: api - Fix use-after-free and race in crypto_spawn_alg
Date: Wed, 15 Apr 2020 19:17:03 -0700 [thread overview]
Message-ID: <20200416021703.GD816@sol.localdomain> (raw)
In-Reply-To: <20200410060942.GA4048@gondor.apana.org.au>
On Fri, Apr 10, 2020 at 04:09:42PM +1000, Herbert Xu wrote:
> There are two problems in crypto_spawn_alg. First of all it may
> return spawn->alg even if spawn->dead is set. This results in a
> double-free as detected by syzbot.
>
> Secondly the setting of the DYING flag is racy because we hold
> the read-lock instead of the write-lock. We should instead call
> crypto_shoot_alg in a safe manner by gaining a refcount, dropping
> the lock, and then releasing the refcount.
>
> This patch fixes both problems.
>
> Reported-by: syzbot+fc0674cde00b66844470@syzkaller.appspotmail.com
> Fixes: 4f87ee118d16 ("crypto: api - Do not zap spawn->alg")
> Fixes: 73669cc55646 ("crypto: api - Fix race condition in...")
> Cc: <stable@vger.kernel.org>
> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
>
> diff --git a/crypto/algapi.c b/crypto/algapi.c
> index 69605e21af92..f8b4dc161c02 100644
> --- a/crypto/algapi.c
> +++ b/crypto/algapi.c
> @@ -716,17 +716,27 @@ EXPORT_SYMBOL_GPL(crypto_drop_spawn);
>
> static struct crypto_alg *crypto_spawn_alg(struct crypto_spawn *spawn)
> {
> - struct crypto_alg *alg;
> + struct crypto_alg *alg = ERR_PTR(-EAGAIN);
> + struct crypto_alg *target;
> + bool shoot = false;
>
> down_read(&crypto_alg_sem);
> - alg = spawn->alg;
> - if (!spawn->dead && !crypto_mod_get(alg)) {
> - alg->cra_flags |= CRYPTO_ALG_DYING;
> - alg = NULL;
> + if (!spawn->dead) {
> + alg = spawn->alg;
> + if (!crypto_mod_get(alg)) {
> + target = crypto_alg_get(alg);
> + shoot = true;
> + alg = ERR_PTR(-EAGAIN);
> + }
> }
> up_read(&crypto_alg_sem);
>
> - return alg ?: ERR_PTR(-EAGAIN);
> + if (shoot) {
> + crypto_shoot_alg(target);
> + crypto_alg_put(target);
> + }
> +
> + return alg;
> }
Wouldn't it be a bit simpler to set 'target = NULL', remove 'shoot',
and use 'if (target)' instead of 'if (shoot)'?
- Eric
next prev parent reply other threads:[~2020-04-16 2:17 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-06 18:16 WARNING: refcount bug in crypto_destroy_tfm syzbot
2020-04-10 6:09 ` crypto: api - Fix use-after-free and race in crypto_spawn_alg Herbert Xu
2020-04-16 2:17 ` Eric Biggers [this message]
2020-04-16 2:25 ` Herbert Xu
2020-04-16 2:30 ` Eric Biggers
2020-04-16 2:42 ` Herbert Xu
2020-04-10 9:18 Markus Elfring
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=20200416021703.GD816@sol.localdomain \
--to=ebiggers@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=netdev@vger.kernel.org \
--cc=syzbot+fc0674cde00b66844470@syzkaller.appspotmail.com \
--cc=syzkaller-bugs@googlegroups.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).