forked from Minki/linux
crypto: lrw - don't access already-freed walk.iv
If the user-provided IV needs to be aligned to the algorithm's
alignmask, then skcipher_walk_virt() copies the IV into a new aligned
buffer walk.iv. But skcipher_walk_virt() can fail afterwards, and then
if the caller unconditionally accesses walk.iv, it's a use-after-free.
Fix this in the LRW template by checking the return value of
skcipher_walk_virt().
This bug was detected by my patches that improve testmgr to fuzz
algorithms against their generic implementation. When the extra
self-tests were run on a KASAN-enabled kernel, a KASAN use-after-free
splat occured during lrw(aes) testing.
Fixes: c778f96bf3
("crypto: lrw - Optimize tweak computation")
Cc: <stable@vger.kernel.org> # v4.20+
Cc: Ondrej Mosnacek <omosnace@redhat.com>
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
11fe71f146
commit
aec286cd36
@ -162,8 +162,10 @@ static int xor_tweak(struct skcipher_request *req, bool second_pass)
|
|||||||
}
|
}
|
||||||
|
|
||||||
err = skcipher_walk_virt(&w, req, false);
|
err = skcipher_walk_virt(&w, req, false);
|
||||||
iv = (__be32 *)w.iv;
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
iv = (__be32 *)w.iv;
|
||||||
counter[0] = be32_to_cpu(iv[3]);
|
counter[0] = be32_to_cpu(iv[3]);
|
||||||
counter[1] = be32_to_cpu(iv[2]);
|
counter[1] = be32_to_cpu(iv[2]);
|
||||||
counter[2] = be32_to_cpu(iv[1]);
|
counter[2] = be32_to_cpu(iv[1]);
|
||||||
|
Loading…
Reference in New Issue
Block a user