linux/crypto
Eric Biggers 2f5c85c4fa crypto: hash - prevent using keyed hashes without setting key
commit 9fa68f6200 upstream.

Currently, almost none of the keyed hash algorithms check whether a key
has been set before proceeding.  Some algorithms are okay with this and
will effectively just use a key of all 0's or some other bogus default.
However, others will severely break, as demonstrated using
"hmac(sha3-512-generic)", the unkeyed use of which causes a kernel crash
via a (potentially exploitable) stack buffer overflow.

A while ago, this problem was solved for AF_ALG by pairing each hash
transform with a 'has_key' bool.  However, there are still other places
in the kernel where userspace can specify an arbitrary hash algorithm by
name, and the kernel uses it as unkeyed hash without checking whether it
is really unkeyed.  Examples of this include:

    - KEYCTL_DH_COMPUTE, via the KDF extension
    - dm-verity
    - dm-crypt, via the ESSIV support
    - dm-integrity, via the "internal hash" mode with no key given
    - drbd (Distributed Replicated Block Device)

This bug is especially bad for KEYCTL_DH_COMPUTE as that requires no
privileges to call.

Fix the bug for all users by adding a flag CRYPTO_TFM_NEED_KEY to the
->crt_flags of each hash transform that indicates whether the transform
still needs to be keyed or not.  Then, make the hash init, import, and
digest functions return -ENOKEY if the key is still needed.

The new flag also replaces the 'has_key' bool which algif_hash was
previously using, thereby simplifying the algif_hash implementation.

Reported-by: syzbot <syzkaller@googlegroups.com>
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
[bwh: Backported to 3.16:
 - In hash_accept_parent_nokey(), update initialisation of ds to use tfm
 - Adjust context]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
History 2018-06-16 22:21:52 +01:00
..
asymmetric_keys X.509: reject invalid BIT STRING for subjectPublicKey 2018-03-03 15:51:49 +00:00
async_tx async_pq_val: fix DMA memory leak 2017-02-23 03:54:09 +00:00
842.c crypto: prefix module autoloading with "crypto-" 2015-02-04 10:57:48 +00:00
ablk_helper.c crypto: ablk_helper - Replace memcpy with struct assignment 2013-10-07 14:16:57 +08:00
ablkcipher.c crypto: {blk,giv}cipher: Set has_setkey 2016-03-08 12:15:18 +00:00
aead.c crypto: user - fix info leaks in report API 2013-02-19 20:27:03 +08:00
aes_generic.c crypto: add missing crypto module aliases 2015-02-04 10:57:50 +00:00
af_alg.c crypto: af_alg - whitelist mask and type 2018-06-16 22:21:51 +01:00
ahash.c crypto: hash - prevent using keyed hashes without setting key 2018-06-16 22:21:52 +01:00
algapi.c crypto: algapi - fix NULL dereference in crypto_remove_spawns() 2018-03-03 15:52:13 +00:00
algboss.c crypto: algboss - Hold ref count on larval 2013-06-25 19:15:17 +08:00
algif_hash.c crypto: hash - prevent using keyed hashes without setting key 2018-06-16 22:21:52 +01:00
algif_skcipher.c crypto: algif_skcipher - Fix race condition in skcipher_check_key 2016-02-24 14:41:18 +00:00
ansi_cprng.c crypto: add missing crypto module aliases 2015-02-04 10:57:50 +00:00
anubis.c crypto: prefix module autoloading with "crypto-" 2015-02-04 10:57:48 +00:00
api.c crypto: api - Only abort operations on fatal signal 2015-11-16 11:27:09 +00:00
arc4.c crypto: prefix module autoloading with "crypto-" 2015-02-04 10:57:48 +00:00
authenc.c crypto: include crypto- module prefix in template 2015-02-04 10:57:49 +00:00
authencesn.c crypto: include crypto- module prefix in template 2015-02-04 10:57:49 +00:00
blkcipher.c crypto: skcipher - Fix blkcipher walk OOM crash 2016-11-20 01:17:26 +00:00
blowfish_common.c crypto: blowfish - split generic and common c code 2011-09-22 21:25:25 +10:00
blowfish_generic.c crypto: add missing crypto module aliases 2015-02-04 10:57:50 +00:00
camellia_generic.c crypto: add missing crypto module aliases 2015-02-04 10:57:50 +00:00
cast5_generic.c crypto: add missing crypto module aliases 2015-02-04 10:57:50 +00:00
cast6_generic.c crypto: add missing crypto module aliases 2015-02-04 10:57:50 +00:00
cast_common.c crypto: make tables used from assembler __visible 2013-08-14 20:42:03 +10:00
cbc.c crypto: include crypto- module prefix in template 2015-02-04 10:57:49 +00:00
ccm.c crypto: include crypto- module prefix in template 2015-02-04 10:57:49 +00:00
chainiv.c crypto: include crypto- module prefix in template 2015-02-04 10:57:49 +00:00
cipher.c crypto: cipher - Fix checkpatch errors 2010-02-16 20:31:37 +08:00
cmac.c crypto: include crypto- module prefix in template 2015-02-04 10:57:49 +00:00
compress.c crypto: compress - Fix checkpatch errors 2010-02-16 20:31:04 +08:00
crc32.c crypto: hash - annotate algorithms taking optional key 2018-06-16 22:21:51 +01:00
crc32c_generic.c crypto: hash - annotate algorithms taking optional key 2018-06-16 22:21:51 +01:00
crct10dif_common.c crypto: crct10dif - Add fallback for broken initrds 2013-09-12 15:31:34 +10:00
crct10dif_generic.c crypto: add missing crypto module aliases 2015-02-04 10:57:50 +00:00
cryptd.c crypto: hash - annotate algorithms taking optional key 2018-06-16 22:21:51 +01:00
crypto_null.c crypto: prefix module autoloading with "crypto-" 2015-02-04 10:57:48 +00:00
crypto_user.c crypto: user - lock crypto_alg_list on alg dump 2016-02-25 10:34:46 +00:00
crypto_wq.c crypto: crypto_wq - Fix late crypto work queue initialization 2014-03-21 21:54:28 +08:00
ctr.c crypto: include crypto- module prefix in template 2015-02-04 10:57:49 +00:00
cts.c crypto: include crypto- module prefix in template 2015-02-04 10:57:49 +00:00
deflate.c crypto: prefix module autoloading with "crypto-" 2015-02-04 10:57:48 +00:00
des_generic.c crypto: add missing crypto module aliases 2015-02-04 10:57:50 +00:00
ecb.c crypto: include crypto- module prefix in template 2015-02-04 10:57:49 +00:00
eseqiv.c crypto: include crypto- module prefix in template 2015-02-04 10:57:49 +00:00
fcrypt.c crypto: prefix module autoloading with "crypto-" 2015-02-04 10:57:48 +00:00
fips.c crypto: api - Add fips_enable flag 2008-08-29 15:50:02 +10:00
gcm.c crypto: gcm - wait for crypto op not signal safe 2017-09-15 18:29:48 +01:00
gf128mul.c crypto: gf128mul - fix call to memset() 2011-07-08 17:21:21 +08:00
ghash-generic.c crypto: add missing crypto module aliases 2015-02-04 10:57:50 +00:00
hash_info.c crypto: provide single place for hash algo information 2013-10-25 17:14:03 -04:00
hmac.c crypto: hmac - require that the underlying hash algorithm is unkeyed 2018-01-01 20:52:12 +00:00
internal.h crypto: algboss - Hold ref count on larval 2013-06-25 19:15:17 +08:00
Kconfig crypto: sha - SHA1 transform x86_64 AVX2 2014-03-21 21:54:30 +08:00
khazad.c crypto: prefix module autoloading with "crypto-" 2015-02-04 10:57:48 +00:00
krng.c crypto: add missing crypto module aliases 2015-02-04 10:57:50 +00:00
lrw.c crypto: include crypto- module prefix in template 2015-02-04 10:57:49 +00:00
lz4.c crypto: prefix module autoloading with "crypto-" 2015-02-04 10:57:48 +00:00
lz4hc.c crypto: prefix module autoloading with "crypto-" 2015-02-04 10:57:48 +00:00
lzo.c crypto: prefix module autoloading with "crypto-" 2015-02-04 10:57:48 +00:00
Makefile crypto: improve gcc optimization flags for serpent and wp512 2017-04-04 22:21:55 +01:00
md4.c crypto: prefix module autoloading with "crypto-" 2015-02-04 10:57:48 +00:00
md5.c crypto: prefix module autoloading with "crypto-" 2015-02-04 10:57:48 +00:00
memneq.c crypto: memneq - fix for archs without efficient unaligned access 2013-12-09 20:09:12 +08:00
michael_mic.c crypto: prefix module autoloading with "crypto-" 2015-02-04 10:57:48 +00:00
pcbc.c crypto: include crypto- module prefix in template 2015-02-04 10:57:49 +00:00
pcompress.c crypto: user - fix info leaks in report API 2013-02-19 20:27:03 +08:00
pcrypt.c crypto: include crypto- module prefix in template 2015-02-04 10:57:49 +00:00
proc.c crypto: add module.h to those files that are explicitly using it 2011-10-31 19:31:11 -04:00
ripemd.h [CRYPTO] ripemd: Put all common RIPEMD values in header file 2008-07-10 20:35:12 +08:00
rmd128.c crypto: prefix module autoloading with "crypto-" 2015-02-04 10:57:48 +00:00
rmd160.c crypto: prefix module autoloading with "crypto-" 2015-02-04 10:57:48 +00:00
rmd256.c crypto: prefix module autoloading with "crypto-" 2015-02-04 10:57:48 +00:00
rmd320.c crypto: prefix module autoloading with "crypto-" 2015-02-04 10:57:48 +00:00
rng.c crypto: user - fix info leaks in report API 2013-02-19 20:27:03 +08:00
salsa20_generic.c crypto: salsa20 - fix blkcipher_walk API usage 2018-01-01 20:52:11 +00:00
scatterwalk.c crypto: scatterwalk - Fix test in scatterwalk_done 2016-11-20 01:16:53 +00:00
seed.c crypto: prefix module autoloading with "crypto-" 2015-02-04 10:57:48 +00:00
seqiv.c crypto: include crypto- module prefix in template 2015-02-04 10:57:49 +00:00
serpent_generic.c crypto: add missing crypto module aliases 2015-02-04 10:57:50 +00:00
sha1_generic.c crypto: add missing crypto module aliases 2015-02-04 10:57:50 +00:00
sha256_generic.c crypto: add missing crypto module aliases 2015-02-04 10:57:50 +00:00
sha512_generic.c crypto: add missing crypto module aliases 2015-02-04 10:57:50 +00:00
shash.c crypto: hash - prevent using keyed hashes without setting key 2018-06-16 22:21:52 +01:00
tcrypt.c crypto: testmgr - add aead cbc des, des3_ede tests 2014-05-22 21:03:18 +08:00
tcrypt.h crypto: tcrypt - Added speed tests for AEAD crypto alogrithms in tcrypt test suite 2013-12-20 20:06:25 +08:00
tea.c crypto: add missing crypto module aliases 2015-02-04 10:57:50 +00:00
testmgr.c crypto: testmgr - add aead cbc des, des3_ede tests 2014-05-22 21:03:18 +08:00
testmgr.h crypto: testmgr - add aead cbc des, des3_ede tests 2014-05-22 21:03:18 +08:00
tgr192.c crypto: add missing crypto module aliases 2015-02-04 10:57:50 +00:00
twofish_common.c crypto: twofish-x86_64-3way - add lrw support 2011-11-09 11:53:32 +08:00
twofish_generic.c crypto: add missing crypto module aliases 2015-02-04 10:57:50 +00:00
vmac.c crypto: include crypto- module prefix in template 2015-02-04 10:57:49 +00:00
wp512.c crypto: add missing crypto module aliases 2015-02-04 10:57:50 +00:00
xcbc.c crypto: include crypto- module prefix in template 2015-02-04 10:57:49 +00:00
xor.c add further __init annotations to crypto/xor.c 2012-10-11 13:42:32 +11:00
xts.c crypto: include crypto- module prefix in template 2015-02-04 10:57:49 +00:00
zlib.c crypto: prefix module autoloading with "crypto-" 2015-02-04 10:57:48 +00:00