Ivan T. Ivanov fac52f
From: Eric Biggers <ebiggers@google.com>
Ivan T. Ivanov fac52f
Date: Tue, 9 Apr 2019 23:46:32 -0700
Ivan T. Ivanov fac52f
Subject: crypto: arm64/aes-neonbs - don't access already-freed walk.iv
Ivan T. Ivanov fac52f
Git-commit: 4a8108b70508df0b6c4ffa4a3974dab93dcbe851
Ivan T. Ivanov fac52f
Patch-mainline: v5.2-rc1
Ivan T. Ivanov fac52f
References: git-fixes
Ivan T. Ivanov fac52f
Ivan T. Ivanov fac52f
If the user-provided IV needs to be aligned to the algorithm's
Ivan T. Ivanov fac52f
alignmask, then skcipher_walk_virt() copies the IV into a new aligned
Ivan T. Ivanov fac52f
buffer walk.iv.  But skcipher_walk_virt() can fail afterwards, and then
Ivan T. Ivanov fac52f
if the caller unconditionally accesses walk.iv, it's a use-after-free.
Ivan T. Ivanov fac52f
Ivan T. Ivanov fac52f
xts-aes-neonbs doesn't set an alignmask, so currently it isn't affected
Ivan T. Ivanov fac52f
by this despite unconditionally accessing walk.iv.  However this is more
Ivan T. Ivanov fac52f
subtle than desired, and unconditionally accessing walk.iv has caused a
Ivan T. Ivanov fac52f
real problem in other algorithms.  Thus, update xts-aes-neonbs to start
Ivan T. Ivanov fac52f
checking the return value of skcipher_walk_virt().
Ivan T. Ivanov fac52f
Ivan T. Ivanov fac52f
Fixes: 1abee99eafab ("crypto: arm64/aes - reimplement bit-sliced ARM/NEON implementation for arm64")
Ivan T. Ivanov fac52f
Cc: <stable@vger.kernel.org> # v4.11+
Ivan T. Ivanov fac52f
Signed-off-by: Eric Biggers <ebiggers@google.com>
Ivan T. Ivanov fac52f
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Ivan T. Ivanov fac52f
Acked-by: Ivan T. Ivanov <iivanov@suse.de>
Ivan T. Ivanov fac52f
---
Ivan T. Ivanov fac52f
 arch/arm64/crypto/aes-neonbs-glue.c |    2 ++
Ivan T. Ivanov fac52f
 1 file changed, 2 insertions(+)
Ivan T. Ivanov fac52f
Ivan T. Ivanov fac52f
--- a/arch/arm64/crypto/aes-neonbs-glue.c
Ivan T. Ivanov fac52f
+++ b/arch/arm64/crypto/aes-neonbs-glue.c
Ivan T. Ivanov fac52f
@@ -307,6 +307,8 @@ static int __xts_crypt(struct skcipher_r
Ivan T. Ivanov fac52f
 	int err;
Ivan T. Ivanov fac52f
 
Ivan T. Ivanov fac52f
 	err = skcipher_walk_virt(&walk, req, true);
Ivan T. Ivanov fac52f
+	if (err)
Ivan T. Ivanov fac52f
+		return err;
Ivan T. Ivanov fac52f
 
Ivan T. Ivanov fac52f
 	kernel_neon_begin();
Ivan T. Ivanov fac52f