Patch "crypto: chacha20poly1305 - validate the digest size" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
crypto: chacha20poly1305 - validate the digest size
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
crypto-chacha20poly1305-validate-the-digest-size.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
e57121d08c38dabec15cf3e1e2ad46721af30caeMon Sep 17 00:00:00 2001
From: Eric Biggers <[email protected]>
Date: Mon, 11 Dec 2017 12:15:17 -0800
Subject: crypto: chacha20poly1305 - validate the digest size
From: Eric Biggers <[email protected]>
commit e57121d08c38dabec15cf3e1e2ad46721af30cae upstream.
If the rfc7539 template was instantiated with a hash algorithm with digest size larger than 16 bytes (POLY1305_DIGEST_SIZE), then the digest overran the 'tag' buffer in 'struct chachapoly_req_ctx', corrupting the subsequent memory, including 'cryptlen'. This caused a crash during crypto_skcipher_decrypt().
Fix it by, when instantiating the template, requiring that the underlying hash algorithm has the digest size expected for Poly1305.
Reproducer:
#include <linux/if_alg.h>
#include <sys/socket.h>
#include <unistd.h>
int main()
{
int algfd, reqfd;
struct sockaddr_alg addr = {
.salg_type = "aead",
.salg_name = "rfc7539(chacha20,sha256)",
};
unsigned char buf[32] = { 0 };
algfd = socket(AF_ALG, SOCK_SEQPACKET, 0);
bind(algfd, (void *)&addr, sizeof(addr));
setsockopt(algfd, SOL_ALG, ALG_SET_KEY, buf, sizeof(buf));
reqfd = accept(algfd, 0, 0);
write(reqfd, buf, 16);
read(reqfd, buf, 16);
}--- crypto/chacha20poly1305.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
crypto/chacha20poly1305.c +5 -1
@@ -610,6 +610,11 @@ static int chachapoly_create(struct cryp algt->mask));if (IS_ERR (poly))return PTR_ERR (poly); + poly_hash =__crypto_hash_alg_common (poly); + + err = -EINVAL ; +if (poly_hash->digestsize !=POLY1305_DIGEST_SIZE ) + goto out_put_poly; err = -ENOMEM ; inst =kzalloc (sizeof (*inst) +sizeof (*ctx),GFP_KERNEL );
@@ -618,7 +623,6 @@ static int chachapoly_create(struct cryp ctx =aead_instance_ctx (inst); ctx->saltlen =CHACHAPOLY_IV_SIZE - ivsize; - poly_hash =__crypto_hash_alg_common (poly); err =crypto_init_ahash_spawn (&ctx->poly, poly_hash,aead_crypto_instance (inst));if (err)
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/crypto-chacha20poly1305-validate-the-digest-size.patch queue-4.9/crypto-pcrypt-fix-freeing-pcrypt-instances.patch