| From a06863d9fd8dc6e8b33a15d5eb129789675956a4 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 13 Oct 2025 13:40:10 +0200 |
| Subject: crypto: asymmetric_keys - prevent overflow in |
| asymmetric_key_generate_id |
| |
| From: Thorsten Blum <thorsten.blum@linux.dev> |
| |
| [ Upstream commit df0845cf447ae1556c3440b8b155de0926cbaa56 ] |
| |
| Use check_add_overflow() to guard against potential integer overflows |
| when adding the binary blob lengths and the size of an asymmetric_key_id |
| structure and return ERR_PTR(-EOVERFLOW) accordingly. This prevents a |
| possible buffer overflow when copying data from potentially malicious |
| X.509 certificate fields that can be arbitrarily large, such as ASN.1 |
| INTEGER serial numbers, issuer names, etc. |
| |
| Fixes: 7901c1a8effb ("KEYS: Implement binary asymmetric key ID handling") |
| Signed-off-by: Thorsten Blum <thorsten.blum@linux.dev> |
| Reviewed-by: Lukas Wunner <lukas@wunner.de> |
| Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| crypto/asymmetric_keys/asymmetric_type.c | 14 ++++++++++---- |
| 1 file changed, 10 insertions(+), 4 deletions(-) |
| |
| diff --git a/crypto/asymmetric_keys/asymmetric_type.c b/crypto/asymmetric_keys/asymmetric_type.c |
| index 3e4f5a361612d..9d144142e88e2 100644 |
| --- a/crypto/asymmetric_keys/asymmetric_type.c |
| +++ b/crypto/asymmetric_keys/asymmetric_type.c |
| @@ -11,6 +11,7 @@ |
| #include <crypto/public_key.h> |
| #include <linux/seq_file.h> |
| #include <linux/module.h> |
| +#include <linux/overflow.h> |
| #include <linux/slab.h> |
| #include <linux/ctype.h> |
| #include <keys/system_keyring.h> |
| @@ -152,12 +153,17 @@ struct asymmetric_key_id *asymmetric_key_generate_id(const void *val_1, |
| size_t len_2) |
| { |
| struct asymmetric_key_id *kid; |
| - |
| - kid = kmalloc(sizeof(struct asymmetric_key_id) + len_1 + len_2, |
| - GFP_KERNEL); |
| + size_t kid_sz; |
| + size_t len; |
| + |
| + if (check_add_overflow(len_1, len_2, &len)) |
| + return ERR_PTR(-EOVERFLOW); |
| + if (check_add_overflow(sizeof(struct asymmetric_key_id), len, &kid_sz)) |
| + return ERR_PTR(-EOVERFLOW); |
| + kid = kmalloc(kid_sz, GFP_KERNEL); |
| if (!kid) |
| return ERR_PTR(-ENOMEM); |
| - kid->len = len_1 + len_2; |
| + kid->len = len; |
| memcpy(kid->data, val_1, len_1); |
| memcpy(kid->data + len_1, val_2, len_2); |
| return kid; |
| -- |
| 2.51.0 |
| |