Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1607891

[PATCH] crypto: xts,lrw - fix out-of-bounds write after kmalloc failure

From Eric Biggers <ebiggers3@gmail.com>
Newsgroups linux.kernel
Subject [PATCH] crypto: xts,lrw - fix out-of-bounds write after kmalloc failure
Date 2017-03-23 21:50 +0100
Message-ID <tohQd-7EA-1@gated-at.bofh.it> (permalink)
References <to8Df-14F-21@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


From: Eric Biggers <ebiggers@google.com>

In the generic XTS and LRW algorithms, for input data > 128 bytes, a
temporary buffer is allocated to hold the values to be XOR'ed with the
data before and after encryption or decryption.  If the allocation
fails, the fixed-size buffer embedded in the request buffer is meant to
be used as a fallback --- resulting in more calls to the ECB algorithm,
but still producing the correct result.  However, we weren't correctly
limiting subreq->cryptlen in this case, resulting in pre_crypt()
overrunning the embedded buffer.  Fix this by setting subreq->cryptlen
correctly.

Fixes: f1c131b45410 ("crypto: xts - Convert to skcipher")
Fixes: 700cb3f5fe75 ("crypto: lrw - Convert to skcipher")
Cc: stable@vger.kernel.org # v4.10+
Reported-by: Dmitry Vyukov <dvyukov@google.com>
Signed-off-by: Eric Biggers <ebiggers@google.com>
---
 crypto/lrw.c | 7 +++++--
 crypto/xts.c | 7 +++++--
 2 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/crypto/lrw.c b/crypto/lrw.c
index ecd8474018e3..3ea095adafd9 100644
--- a/crypto/lrw.c
+++ b/crypto/lrw.c
@@ -286,8 +286,11 @@ static int init_crypt(struct skcipher_request *req, crypto_completion_t done)
 
 	subreq->cryptlen = LRW_BUFFER_SIZE;
 	if (req->cryptlen > LRW_BUFFER_SIZE) {
-		subreq->cryptlen = min(req->cryptlen, (unsigned)PAGE_SIZE);
-		rctx->ext = kmalloc(subreq->cryptlen, gfp);
+		unsigned int n = min(req->cryptlen, (unsigned int)PAGE_SIZE);
+
+		rctx->ext = kmalloc(n, gfp);
+		if (rctx->ext)
+			subreq->cryptlen = n;
 	}
 
 	rctx->src = req->src;
diff --git a/crypto/xts.c b/crypto/xts.c
index baeb34dd8582..c976bfac29da 100644
--- a/crypto/xts.c
+++ b/crypto/xts.c
@@ -230,8 +230,11 @@ static int init_crypt(struct skcipher_request *req, crypto_completion_t done)
 
 	subreq->cryptlen = XTS_BUFFER_SIZE;
 	if (req->cryptlen > XTS_BUFFER_SIZE) {
-		subreq->cryptlen = min(req->cryptlen, (unsigned)PAGE_SIZE);
-		rctx->ext = kmalloc(subreq->cryptlen, gfp);
+		unsigned int n = min(req->cryptlen, (unsigned int)PAGE_SIZE);
+
+		rctx->ext = kmalloc(n, gfp);
+		if (rctx->ext)
+			subreq->cryptlen = n;
 	}
 
 	rctx->src = req->src;
-- 
2.12.1.500.gab5fba24ee-goog

Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

crypto: out-of-bounds write in pre_crypt Dmitry Vyukov <dvyukov@google.com> - 2017-03-23 12:00 +0100
  Re: crypto: out-of-bounds write in pre_crypt Eric Biggers <ebiggers3@gmail.com> - 2017-03-23 21:40 +0100
  [PATCH] crypto: xts,lrw - fix out-of-bounds write after kmalloc failure Eric Biggers <ebiggers3@gmail.com> - 2017-03-23 21:50 +0100
    Re: [PATCH] crypto: xts,lrw - fix out-of-bounds write after  kmalloc failure David Miller <davem@davemloft.net> - 2017-03-23 22:10 +0100
    Re: [PATCH] crypto: xts,lrw - fix out-of-bounds write after kmalloc  failure Herbert Xu <herbert@gondor.apana.org.au> - 2017-03-24 15:20 +0100

csiph-web