summaryrefslogtreecommitdiffstats
path: root/crypto/morus640.c
diff options
context:
space:
mode:
authorEric Biggers <ebiggers@google.com>2018-06-18 10:22:38 -0700
committerHerbert Xu <herbert@gondor.apana.org.au>2018-07-01 21:00:42 +0800
commitbb29648102335586e9a66289a1d98a0cb392b6e5 (patch)
tree774c44127cdf8b60de47878351fcbf1c7a8c4de5 /crypto/morus640.c
parent73bf20ef3df262026c3470241ae4ac8196943ffa (diff)
downloadlinux-bb29648102335586e9a66289a1d98a0cb392b6e5.tar.gz
linux-bb29648102335586e9a66289a1d98a0cb392b6e5.tar.bz2
linux-bb29648102335586e9a66289a1d98a0cb392b6e5.zip
crypto: vmac - separate tfm and request context
syzbot reported a crash in vmac_final() when multiple threads concurrently use the same "vmac(aes)" transform through AF_ALG. The bug is pretty fundamental: the VMAC template doesn't separate per-request state from per-tfm (per-key) state like the other hash algorithms do, but rather stores it all in the tfm context. That's wrong. Also, vmac_final() incorrectly zeroes most of the state including the derived keys and cached pseudorandom pad. Therefore, only the first VMAC invocation with a given key calculates the correct digest. Fix these bugs by splitting the per-tfm state from the per-request state and using the proper init/update/final sequencing for requests. Reproducer for the crash: #include <linux/if_alg.h> #include <sys/socket.h> #include <unistd.h> int main() { int fd; struct sockaddr_alg addr = { .salg_type = "hash", .salg_name = "vmac(aes)", }; char buf[256] = { 0 }; fd = socket(AF_ALG, SOCK_SEQPACKET, 0); bind(fd, (void *)&addr, sizeof(addr)); setsockopt(fd, SOL_ALG, ALG_SET_KEY, buf, 16); fork(); fd = accept(fd, NULL, NULL); for (;;) write(fd, buf, 256); } The immediate cause of the crash is that vmac_ctx_t.partial_size exceeds VMAC_NHBYTES, causing vmac_final() to memset() a negative length. Reported-by: syzbot+264bca3a6e8d645550d3@syzkaller.appspotmail.com Fixes: f1939f7c5645 ("crypto: vmac - New hash algorithm for intel_txt support") Cc: <stable@vger.kernel.org> # v2.6.32+ Signed-off-by: Eric Biggers <ebiggers@google.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto/morus640.c')
0 files changed, 0 insertions, 0 deletions