From: Jarkko Sakkinen <jarkko@kernel.org>
To: Cen Zhang <cenzhang@linux.microsoft.com>
Cc: Mimi Zohar <zohar@linux.ibm.com>,
David Howells <dhowells@redhat.com>,
Paul Moore <paul@paul-moore.com>,
James Morris <jmorris@namei.org>,
"Serge E. Hallyn" <serge@hallyn.com>,
Roberto Sassu <roberto.sassu@polito.it>,
David Safford <safford@watson.ibm.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Kees Cook <kees@kernel.org>, Francis Perron <francis@akrites.dev>,
linux-integrity@vger.kernel.org, keyrings@vger.kernel.org,
linux-security-module@vger.kernel.org,
linux-kernel@vger.kernel.org, stable@vger.kernel.org,
Akrites SIRT <sirt@akrites.dev>,
AutonomousCodeSecurity@microsoft.com,
tgopinath@linux.microsoft.com, kys@microsoft.com
Subject: Re: [PATCH v3] KEYS: encrypted: fix integer overflow of datablob_len
Date: Thu, 10 Sep 2026 02:01:17 +0300 [thread overview]
Message-ID: <aqHlPTAVoiGeE_Hb@kernel.org> (raw)
In-Reply-To: <20260909153433.83117-1-cenzhang@linux.microsoft.com>
On Wed, Sep 09, 2026 at 11:34:33AM -0400, Cen Zhang wrote:
> encrypted_key_alloc() stores datablob_len in a u16. It is computed from
> multiple string and payload lengths. If the result exceeds U16_MAX, the
> assignment truncates the allocation size. KASAN reports a 32760-byte
> slab-out-of-bounds write when __ekey_init() copies the master key
> description into the undersized buffer.
>
> The total payload length stored in key->datalen is also a u16. Use
> check_add_overflow() to reject values that do not fit either destination,
> and use kzalloc_flex() for the flexible-array allocation.
>
> Fixes: 7e70cb497850 ("keys: add new key-type encrypted")
> Cc: stable@vger.kernel.org
> Link: https://lore.kernel.org/keyrings/20260826154456.85974-1-blbllhy@gmail.com/
> Assisted-by: GitHub-Copilot:claude-opus-4.6
> Signed-off-by: Cen Zhang <cenzhang@linux.microsoft.com>
> Signed-off-by: Francis Perron <francis@akrites.dev>
> ---
> Changes in v3:
> - Describe the bounds using u16 and U16_MAX and simplify the commit
> message.
> - Include the KASAN-reported write size.
> - Remove organization names from the author and sign-off identities.
> - Remove the unnecessary off-list discussion note.
> - Use cenzhang@linux.microsoft.com.
> - No code changes.
>
> security/keys/encrypted-keys/encrypted.c | 20 ++++++++++++++------
> 1 file changed, 14 insertions(+), 6 deletions(-)
>
> diff --git a/security/keys/encrypted-keys/encrypted.c b/security/keys/encrypted-keys/encrypted.c
> index 59cb77b237b3..e07092ea301a 100644
> --- a/security/keys/encrypted-keys/encrypted.c
> +++ b/security/keys/encrypted-keys/encrypted.c
> @@ -19,6 +19,7 @@
> #include <linux/parser.h>
> #include <linux/string.h>
> #include <linux/err.h>
> +#include <linux/overflow.h>
> #include <keys/user-type.h>
> #include <keys/trusted-type.h>
> #include <keys/encrypted-type.h>
> @@ -579,6 +580,7 @@ static struct encrypted_key_payload *encrypted_key_alloc(struct key *key,
> {
> struct encrypted_key_payload *epayload = NULL;
> unsigned short datablob_len;
> + unsigned short payload_totallen;
> unsigned short decrypted_datalen;
> unsigned short payload_datalen;
> unsigned int encrypted_datalen;
> @@ -632,16 +634,22 @@ static struct encrypted_key_payload *encrypted_key_alloc(struct key *key,
>
> encrypted_datalen = roundup(decrypted_datalen, blksize);
>
> - datablob_len = format_len + 1 + strlen(master_desc) + 1
> - + strlen(datalen) + 1 + ivsize + 1 + encrypted_datalen;
> + if (check_add_overflow(format_len + 1 + strlen(master_desc) + 1
> + + strlen(datalen) + 1 + ivsize + 1,
> + encrypted_datalen, &datablob_len))
> + return ERR_PTR(-EINVAL);
> +
> + if (check_add_overflow(datablob_len,
> + payload_datalen + HASH_SIZE + 1,
> + &payload_totallen))
> + return ERR_PTR(-EINVAL);
>
> - ret = key_payload_reserve(key, payload_datalen + datablob_len
> - + HASH_SIZE + 1);
> + ret = key_payload_reserve(key, payload_totallen);
> if (ret < 0)
> return ERR_PTR(ret);
>
> - epayload = kzalloc(sizeof(*epayload) + payload_datalen +
> - datablob_len + HASH_SIZE + 1, GFP_KERNEL);
> + epayload = kzalloc_flex(*epayload, payload_data, payload_totallen,
> + GFP_KERNEL);
> if (!epayload)
> return ERR_PTR(-ENOMEM);
>
>
> base-commit: 893e11787f78e43b534e252249ac3fff4d1333f8
> --
> 2.55.0
Thanks!
Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
BR, Jarkko
next prev parent reply other threads:[~2026-09-09 23:01 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-09 15:34 [PATCH v3] KEYS: encrypted: fix integer overflow of datablob_len Cen Zhang
2026-09-09 23:01 ` Jarkko Sakkinen [this message]
2026-09-10 4:44 ` R Nageswara Sastry
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aqHlPTAVoiGeE_Hb@kernel.org \
--to=jarkko@kernel.org \
--cc=AutonomousCodeSecurity@microsoft.com \
--cc=cenzhang@linux.microsoft.com \
--cc=dhowells@redhat.com \
--cc=francis@akrites.dev \
--cc=gregkh@linuxfoundation.org \
--cc=jmorris@namei.org \
--cc=kees@kernel.org \
--cc=keyrings@vger.kernel.org \
--cc=kys@microsoft.com \
--cc=linux-integrity@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-security-module@vger.kernel.org \
--cc=paul@paul-moore.com \
--cc=roberto.sassu@polito.it \
--cc=safford@watson.ibm.com \
--cc=serge@hallyn.com \
--cc=sirt@akrites.dev \
--cc=stable@vger.kernel.org \
--cc=tgopinath@linux.microsoft.com \
--cc=zohar@linux.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.