android_kernel_samsung_msm8976/crypto
Eric Biggers 247888cfca crypto: authenc - fix parsing key with misaligned rta_len
commit 8f9c469348487844328e162db57112f7d347c49f upstream.

Keys for "authenc" AEADs are formatted as an rtattr containing a 4-byte
'enckeylen', followed by an authentication key and an encryption key.
crypto_authenc_extractkeys() parses the key to find the inner keys.

However, it fails to consider the case where the rtattr's payload is
longer than 4 bytes but not 4-byte aligned, and where the key ends
before the next 4-byte aligned boundary.  In this case, 'keylen -=
RTA_ALIGN(rta->rta_len);' underflows to a value near UINT_MAX.  This
causes a buffer overread and crash during crypto_ahash_setkey().

Fix it by restricting the rtattr payload to the expected size.

Reproducer using AF_ALG:

	#include <linux/if_alg.h>
	#include <linux/rtnetlink.h>
	#include <sys/socket.h>

	int main()
	{
		int fd;
		struct sockaddr_alg addr = {
			.salg_type = "aead",
			.salg_name = "authenc(hmac(sha256),cbc(aes))",
		};
		struct {
			struct rtattr attr;
			__be32 enckeylen;
			char keys[1];
		} __attribute__((packed)) key = {
			.attr.rta_len = sizeof(key),
			.attr.rta_type = 1 /* CRYPTO_AUTHENC_KEYA_PARAM */,
		};

		fd = socket(AF_ALG, SOCK_SEQPACKET, 0);
		bind(fd, (void *)&addr, sizeof(addr));
		setsockopt(fd, SOL_ALG, ALG_SET_KEY, &key, sizeof(key));
	}

It caused:

	BUG: unable to handle kernel paging request at ffff88007ffdc000
	PGD 2e01067 P4D 2e01067 PUD 2e04067 PMD 2e05067 PTE 0
	Oops: 0000 [#1] SMP
	CPU: 0 PID: 883 Comm: authenc Not tainted 4.20.0-rc1-00108-g00c9fe37a7f27 #13
	Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-20181126_142135-anatol 04/01/2014
	RIP: 0010:sha256_ni_transform+0xb3/0x330 arch/x86/crypto/sha256_ni_asm.S:155
	[...]
	Call Trace:
	 sha256_ni_finup+0x10/0x20 arch/x86/crypto/sha256_ssse3_glue.c:321
	 crypto_shash_finup+0x1a/0x30 crypto/shash.c:178
	 shash_digest_unaligned+0x45/0x60 crypto/shash.c:186
	 crypto_shash_digest+0x24/0x40 crypto/shash.c:202
	 hmac_setkey+0x135/0x1e0 crypto/hmac.c:66
	 crypto_shash_setkey+0x2b/0xb0 crypto/shash.c:66
	 shash_async_setkey+0x10/0x20 crypto/shash.c:223
	 crypto_ahash_setkey+0x2d/0xa0 crypto/ahash.c:202
	 crypto_authenc_setkey+0x68/0x100 crypto/authenc.c:96
	 crypto_aead_setkey+0x2a/0xc0 crypto/aead.c:62
	 aead_setkey+0xc/0x10 crypto/algif_aead.c:526
	 alg_setkey crypto/af_alg.c:223 [inline]
	 alg_setsockopt+0xfe/0x130 crypto/af_alg.c:256
	 __sys_setsockopt+0x6d/0xd0 net/socket.c:1902
	 __do_sys_setsockopt net/socket.c:1913 [inline]
	 __se_sys_setsockopt net/socket.c:1910 [inline]
	 __x64_sys_setsockopt+0x1f/0x30 net/socket.c:1910
	 do_syscall_64+0x4a/0x180 arch/x86/entry/common.c:290
	 entry_SYSCALL_64_after_hwframe+0x49/0xbe

Fixes: e236d4a89a ("[CRYPTO] authenc: Move enckeylen into key itself")
Cc: <stable@vger.kernel.org> # v2.6.25+
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2019-07-27 21:53:36 +02:00
..
asymmetric_keys crypto: crypto_memneq - add equality testing of memory regions w/o timing leaks 2019-07-27 21:42:52 +02:00
async_tx
842.c
ablk_helper.c
ablkcipher.c crypto: ablkcipher - fix crash flushing dcache in error path 2019-07-27 21:51:08 +02:00
aead.c
aes_generic.c
af_alg.c crypto: af_alg - fix possible uninit-value in alg_bind() 2019-07-27 21:52:04 +02:00
ahash.c crypto: ahash - Fix early termination in hash walk 2019-07-27 21:52:01 +02:00
algapi.c crypto: algapi - fix NULL dereference in crypto_remove_spawns() 2019-07-27 21:46:25 +02:00
algboss.c
algif_hash.c crypto: hash - prevent using keyed hashes without setting key 2019-07-27 21:49:17 +02:00
algif_skcipher.c crypto: AF_ALG - remove SGL terminator indicator when chaining 2019-07-27 21:44:42 +02:00
ansi_cprng.c
anubis.c
api.c
arc4.c
authenc.c crypto: authenc - fix parsing key with misaligned rta_len 2019-07-27 21:53:36 +02:00
authencesn.c crypto: crypto_memneq - add equality testing of memory regions w/o timing leaks 2019-07-27 21:42:52 +02:00
blkcipher.c crypto: blkcipher - fix crash flushing dcache in error path 2019-07-27 21:51:08 +02:00
blowfish_common.c
blowfish_generic.c
camellia_generic.c
cast5_generic.c
cast6_generic.c
cast_common.c
cbc.c
ccm.c crypto: crypto_memneq - add equality testing of memory regions w/o timing leaks 2019-07-27 21:42:52 +02:00
chainiv.c
cipher.c
cmac.c
compress.c
crc32.c crypto: hash - annotate algorithms taking optional key 2019-07-27 21:49:17 +02:00
crc32c.c crypto: hash - annotate algorithms taking optional key 2019-07-27 21:49:17 +02:00
cryptd.c crypto: hash - annotate algorithms taking optional key 2019-07-27 21:49:17 +02:00
crypto_null.c
crypto_user.c
crypto_wq.c
ctr.c
cts.c crypto: cts - fix crash on short inputs 2019-07-27 21:53:35 +02:00
deflate.c
des_generic.c
ecb.c
eseqiv.c
fcrypt.c
fips.c
gcm.c crypto: gcm - wait for crypto op not signal safe 2019-07-27 21:44:48 +02:00
gf128mul.c
ghash-generic.c
hmac.c crypto: hmac - require that the underlying hash algorithm is unkeyed 2019-07-27 21:45:46 +02:00
internal.h
Kconfig
khazad.c
krng.c
lrw.c
lzo.c
Makefile crypto: more robust crypto_memneq 2019-07-27 21:46:39 +02:00
md4.c
md5.c
memneq.c crypto: memneq - fix for archs without efficient unaligned access 2019-07-27 21:46:40 +02:00
michael_mic.c
pcbc.c
pcompress.c
pcrypt.c
proc.c
ripemd.h
rmd128.c
rmd160.c
rmd256.c
rmd320.c
rng.c
salsa20_generic.c crypto: salsa20 - fix blkcipher_walk API usage 2019-07-27 21:45:46 +02:00
scatterwalk.c
seed.c
seqiv.c
serpent_generic.c
sha1_generic.c crypto: memzero_explicit - make sure to clear out sensitive data 2019-07-27 21:51:07 +02:00
sha256_generic.c crypto: memzero_explicit - make sure to clear out sensitive data 2019-07-27 21:51:07 +02:00
sha512_generic.c crypto: memzero_explicit - make sure to clear out sensitive data 2019-07-27 21:51:07 +02:00
shash.c crypto: hash - prevent using keyed hashes without setting key 2019-07-27 21:49:17 +02:00
tcrypt.c
tcrypt.h
tea.c
testmgr.c
testmgr.h
tgr192.c crypto: memzero_explicit - make sure to clear out sensitive data 2019-07-27 21:51:07 +02:00
twofish_common.c
twofish_generic.c
vmac.c crypto: vmac - separate tfm and request context 2019-07-27 21:51:07 +02:00
wp512.c crypto: memzero_explicit - make sure to clear out sensitive data 2019-07-27 21:51:07 +02:00
xcbc.c
xor.c
xts.c
zlib.c