All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Stephan Müller" <smueller@chronox.de>
To: Stephan Mueller <smueller@chronox.de>
Cc: Herbert Xu <herbert@gondor.apana.org.au>,
	Eric Biggers <ebiggers3@gmail.com>,
	syzbot
	<bot+3401d9494b9380f7244bcc7fec49680878fccba6@syzkaller.appspotmail.com>,
	davem@davemloft.net, linux-crypto@vger.kernel.org,
	linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com
Subject: [PATCH] crypto: AF_ALG - wait for data at beginning of recvmsg
Date: Wed, 29 Nov 2017 11:17:26 +0100	[thread overview]
Message-ID: <1970731.rxTGvFCgCz@positron.chronox.de> (raw)
In-Reply-To: <2948680.ShXD61QQGe@tauon.chronox.de>

The wait for data is a non-atomic operation that can sleep and therefore
potentially release the socket lock. The release of the socket lock
allows another thread to modify the context data structure. The waiting
operation for new data therefore must be called at the beginning of
recvmsg. This prevents a race condition where checks of the members of
the context data structure are performed by recvmsg while there is a
potential for modification of these values.

For skcipher, ctx->used is used as an indicator whether to wait for new
data, because skcipher can operate on a subset of the overall data
to be processed.

In contrast, aead must check ctx->more which is a flag set by user space
indicating that all data has been sent. It is required for aead to wait
until all data intended to be send by the caller are received as
the authentication operation part of the aead cipher requires the
presence of the whole data.

Fixes: e870456d8e7c ("crypto: algif_skcipher - overhaul memory management")
Fixes: d887c52d6ae4 ("crypto: algif_aead - overhaul memory management")
Reported-by: syzbot <syzkaller@googlegroups.com>
Cc: <stable@vger.kernel.org> # v4.14+
Signed-off-by: Stephan Mueller <smueller@chronox.de>
---
 crypto/af_alg.c         | 6 ------
 crypto/algif_aead.c     | 6 ++++++
 crypto/algif_skcipher.c | 6 ++++++
 3 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/crypto/af_alg.c b/crypto/af_alg.c
index e720dfe962db..e75e188b145b 100644
--- a/crypto/af_alg.c
+++ b/crypto/af_alg.c
@@ -1138,12 +1138,6 @@ int af_alg_get_rsgl(struct sock *sk, struct msghdr *msg, int flags,
 		if (!af_alg_readable(sk))
 			break;
 
-		if (!ctx->used) {
-			err = af_alg_wait_for_data(sk, flags);
-			if (err)
-				return err;
-		}
-
 		seglen = min_t(size_t, (maxsize - len),
 			       msg_data_left(msg));
 
diff --git a/crypto/algif_aead.c b/crypto/algif_aead.c
index 7d2d162666e5..97243068af15 100644
--- a/crypto/algif_aead.c
+++ b/crypto/algif_aead.c
@@ -111,6 +111,12 @@ static int _aead_recvmsg(struct socket *sock, struct msghdr *msg,
 	size_t usedpages = 0;		/* [in]  RX bufs to be used from user */
 	size_t processed = 0;		/* [in]  TX bufs to be consumed */
 
+	if (ctx->more) {
+		err = af_alg_wait_for_data(sk, flags);
+		if (err)
+			return err;
+	}
+
 	/*
 	 * Data length provided by caller via sendmsg/sendpage that has not
 	 * yet been processed.
diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c
index 30cff827dd8f..6fb595cd63ac 100644
--- a/crypto/algif_skcipher.c
+++ b/crypto/algif_skcipher.c
@@ -72,6 +72,12 @@ static int _skcipher_recvmsg(struct socket *sock, struct msghdr *msg,
 	int err = 0;
 	size_t len = 0;
 
+	if (!ctx->used) {
+		err = af_alg_wait_for_data(sk, flags);
+		if (err)
+			return err;
+	}
+
 	/* Allocate cipher request for current operation. */
 	areq = af_alg_alloc_areq(sk, sizeof(struct af_alg_async_req) +
 				     crypto_skcipher_reqsize(tfm));
-- 
2.14.3

  reply	other threads:[~2017-11-29 10:17 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-27 18:56 general protection fault in blkcipher_walk_done syzbot
2017-11-27 18:56 ` syzbot
2017-11-28  5:37 ` Eric Biggers
2017-11-28  5:37   ` Eric Biggers
2017-11-28  7:53   ` Eric Biggers
2017-11-28  7:53     ` Eric Biggers
2017-11-28  8:31     ` Stephan Mueller
2017-11-28  8:31       ` Stephan Mueller
2017-11-28  9:03   ` Stephan Mueller
2017-11-28  9:03     ` Stephan Mueller
2017-11-28 21:33     ` [PATCH v2] crypto: AF_ALG - race-free access of encryption flag Stephan Müller
2017-11-28 21:33       ` Stephan Müller
2017-11-28 22:40       ` Eric Biggers
2017-11-28 22:40         ` Eric Biggers
2017-11-28 23:02       ` Herbert Xu
2017-11-28 23:02         ` Herbert Xu
2017-11-29  6:48         ` Stephan Mueller
2017-11-29  6:48           ` Stephan Mueller
2017-11-29  7:10           ` Herbert Xu
2017-11-29  7:10             ` Herbert Xu
2017-11-29  7:17             ` Stephan Mueller
2017-11-29  7:17               ` Stephan Mueller
2017-11-29 10:17               ` Stephan Müller [this message]
2017-11-29 10:17                 ` [PATCH] crypto: AF_ALG - wait for data at beginning of recvmsg Stephan Müller
2017-11-29 10:22                 ` Herbert Xu
2017-11-29 10:22                   ` Herbert Xu
2017-11-29 10:28                   ` Stephan Mueller
2017-11-29 10:28                     ` Stephan Mueller
2017-11-29 10:42                     ` Herbert Xu
2017-11-29 10:42                       ` Herbert Xu
2017-11-29 11:02                       ` [PATCH v2] " Stephan Müller
2017-11-29 11:02                         ` Stephan Müller
2017-12-11 11:45                         ` Herbert Xu
2017-12-11 11:45                           ` Herbert Xu
2017-11-29 11:05             ` [PATCH v2] crypto: AF_ALG - race-free access of encryption flag Stephan Müller
2017-11-29 11:05               ` Stephan Müller
2017-11-29 12:17               ` Herbert Xu
2017-11-29 12:17                 ` Herbert Xu
2017-12-11 19:10 ` general protection fault in blkcipher_walk_done Eric Biggers
2017-12-11 19:10   ` Eric Biggers

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=1970731.rxTGvFCgCz@positron.chronox.de \
    --to=smueller@chronox.de \
    --cc=bot+3401d9494b9380f7244bcc7fec49680878fccba6@syzkaller.appspotmail.com \
    --cc=davem@davemloft.net \
    --cc=ebiggers3@gmail.com \
    --cc=herbert@gondor.apana.org.au \
    --cc=linux-crypto@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --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 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.