* [PATCH v4 0/1] Fix buffer over-read in cca_cipher2protkey
@ 2026-07-29 11:40 Harald Freudenberger
2026-07-29 11:40 ` [PATCH v4 1/1] s390/zcrypt: " Harald Freudenberger
0 siblings, 1 reply; 4+ messages in thread
From: Harald Freudenberger @ 2026-07-29 11:40 UTC (permalink / raw)
To: Heiko Carstens, Vasily Gorbik, Alexander Gordeev
Cc: freude, linux-s390, ifranzki
Add validation of both the actual key buffer size and token length
fields in all the cca_check_sec*token() functions. Additionally check
in cca_gencipherkey() for possible underflow with returned key size.
The CCA token structures contain user-controlled len fields that
were used in operations without proper validation against both the
actual buffer size and minimum token structure size. An attacker
could set this field larger than the actual buffer size, leading to
reading beyond buffer boundaries. This may result in a kernel crash or
exposure of memory via sending this as part of a request down to the
crypto card. Also an attacker could have used a very small len value
and thus enforce a buffer under-run which may produce similar effects
as a over-read.
So now a key must
- key buf length must be at least sizeof the token struct
- the key len field inside the token must fit into the range of
sizeof key token struct ... key buf length
Changelog:
v1 - initial version
v2 - extend the length check to all cca_check_sec*token() functions,
also check for min given buffer length and token length field.
v3 - there was still a possibility to under-run the length checks in
function cca_gencipherkey(). Fixed as suggested by Ingo.
v4 - Reviewd-by from Ingo added.
Harald Freudenberger (1):
s390/zcrypt: Fix buffer over-read in cca_cipher2protkey
drivers/s390/crypto/pkey_cca.c | 15 +++----
drivers/s390/crypto/zcrypt_ccamisc.c | 64 +++++++++++++++++++++++-----
drivers/s390/crypto/zcrypt_ccamisc.h | 6 +--
3 files changed, 62 insertions(+), 23 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v4 1/1] s390/zcrypt: Fix buffer over-read in cca_cipher2protkey
2026-07-29 11:40 [PATCH v4 0/1] Fix buffer over-read in cca_cipher2protkey Harald Freudenberger
@ 2026-07-29 11:40 ` Harald Freudenberger
2026-07-29 12:06 ` sashiko-bot
0 siblings, 1 reply; 4+ messages in thread
From: Harald Freudenberger @ 2026-07-29 11:40 UTC (permalink / raw)
To: Heiko Carstens, Vasily Gorbik, Alexander Gordeev
Cc: freude, linux-s390, ifranzki
Add validation of both the actual key buffer size and token length
fields in all the cca_check_sec*token() functions. Additionally check
in cca_gencipherkey() for possible underflow with returned key size.
The CCA token structures contain user-controlled len fields that
were used in operations without proper validation against both the
actual buffer size and minimum token structure size. An attacker
could set this field larger than the actual buffer size, leading to
reading beyond buffer boundaries. This may result in a kernel crash or
exposure of memory via sending this as part of a request down to the
crypto card. Also an attacker could have used a very small len value
and thus enforce a buffer under-run which may produce similar effects
as a over-read.
So now a key must
- key buf length must be at least sizeof the token struct
- the key len field inside the token must fit into the range of
sizeof key token struct ... key buf length
Signed-off-by: Harald Freudenberger <freude@linux.ibm.com>
Reviewed-by: Ingo Franzki <ifranzki@linux.ibm.com>
Cc: stable@vger.kernel.org
---
drivers/s390/crypto/pkey_cca.c | 15 +++----
drivers/s390/crypto/zcrypt_ccamisc.c | 64 +++++++++++++++++++++++-----
drivers/s390/crypto/zcrypt_ccamisc.h | 6 +--
3 files changed, 62 insertions(+), 23 deletions(-)
diff --git a/drivers/s390/crypto/pkey_cca.c b/drivers/s390/crypto/pkey_cca.c
index 4bc47952324e..e8dc2f77c137 100644
--- a/drivers/s390/crypto/pkey_cca.c
+++ b/drivers/s390/crypto/pkey_cca.c
@@ -236,22 +236,16 @@ static int cca_key2protkey(const struct pkey_apqn *apqns, size_t nr_apqns,
if (hdr->type == TOKTYPE_CCA_INTERNAL &&
hdr->version == TOKVER_CCA_AES) {
/* CCA AES data key */
- if (keylen < sizeof(struct secaeskeytoken))
- return -EINVAL;
- if (cca_check_secaeskeytoken(pkey_dbf_info, 3, key, 0))
+ if (cca_check_secaeskeytoken(pkey_dbf_info, 3, key, keylen, 0))
return -EINVAL;
} else if (hdr->type == TOKTYPE_CCA_INTERNAL &&
hdr->version == TOKVER_CCA_VLSC) {
/* CCA AES cipher key */
- if (keylen < hdr->len)
- return -EINVAL;
if (cca_check_secaescipherkey(pkey_dbf_info,
- 3, key, 0, 1))
+ 3, key, keylen, 0, 1))
return -EINVAL;
} else if (hdr->type == TOKTYPE_CCA_INTERNAL_PKA) {
/* CCA ECC (private) key */
- if (keylen < sizeof(struct eccprivkeytoken))
- return -EINVAL;
if (cca_check_sececckeytoken(pkey_dbf_info, 3, key, keylen, 1))
return -EINVAL;
} else {
@@ -484,7 +478,7 @@ static int cca_verifykey(const u8 *key, u32 keylen,
hdr->version == TOKVER_CCA_AES) {
struct secaeskeytoken *t = (struct secaeskeytoken *)key;
- rc = cca_check_secaeskeytoken(pkey_dbf_info, 3, key, 0);
+ rc = cca_check_secaeskeytoken(pkey_dbf_info, 3, key, keylen, 0);
if (rc)
goto out;
*keytype = PKEY_TYPE_CCA_DATA;
@@ -512,7 +506,8 @@ static int cca_verifykey(const u8 *key, u32 keylen,
hdr->version == TOKVER_CCA_VLSC) {
struct cipherkeytoken *t = (struct cipherkeytoken *)key;
- rc = cca_check_secaescipherkey(pkey_dbf_info, 3, key, 0, 1);
+ rc = cca_check_secaescipherkey(pkey_dbf_info, 3,
+ key, keylen, 0, 1);
if (rc)
goto out;
*keytype = PKEY_TYPE_CCA_CIPHER;
diff --git a/drivers/s390/crypto/zcrypt_ccamisc.c b/drivers/s390/crypto/zcrypt_ccamisc.c
index 322677a8d320..f797786107b9 100644
--- a/drivers/s390/crypto/zcrypt_ccamisc.c
+++ b/drivers/s390/crypto/zcrypt_ccamisc.c
@@ -62,12 +62,18 @@ static DEFINE_MUTEX(dev_status_mem_mutex);
* also checked. Returns 0 on success or errno value on failure.
*/
int cca_check_secaeskeytoken(debug_info_t *dbg, int dbflvl,
- const u8 *token, int keybitsize)
+ const u8 *token, u32 keysize, int keybitsize)
{
struct secaeskeytoken *t = (struct secaeskeytoken *)token;
#define DBF(...) debug_sprintf_event(dbg, dbflvl, ##__VA_ARGS__)
+ if (keysize < sizeof(*t)) {
+ if (dbg)
+ DBF("%s keysize %u < min token size %zu\n",
+ __func__, keysize, sizeof(*t));
+ return -EINVAL;
+ }
if (t->type != TOKTYPE_CCA_INTERNAL) {
if (dbg)
DBF("%s token check failed, type 0x%02x != 0x%02x\n",
@@ -101,14 +107,20 @@ EXPORT_SYMBOL(cca_check_secaeskeytoken);
* Returns 0 on success or errno value on failure.
*/
int cca_check_secaescipherkey(debug_info_t *dbg, int dbflvl,
- const u8 *token, int keybitsize,
- int checkcpacfexport)
+ const u8 *token, u32 keysize,
+ int keybitsize, int checkcpacfexport)
{
struct cipherkeytoken *t = (struct cipherkeytoken *)token;
bool keybitsizeok = true;
#define DBF(...) debug_sprintf_event(dbg, dbflvl, ##__VA_ARGS__)
+ if (keysize < sizeof(*t)) {
+ if (dbg)
+ DBF("%s keysize %u < min token size %zu\n",
+ __func__, keysize, sizeof(*t));
+ return -EINVAL;
+ }
if (t->type != TOKTYPE_CCA_INTERNAL) {
if (dbg)
DBF("%s token check failed, type 0x%02x != 0x%02x\n",
@@ -121,6 +133,18 @@ int cca_check_secaescipherkey(debug_info_t *dbg, int dbflvl,
__func__, (int)t->version, TOKVER_CCA_VLSC);
return -EINVAL;
}
+ if (t->len > keysize) {
+ if (dbg)
+ DBF("%s token check failed, len %d > keysize %u\n",
+ __func__, (int)t->len, keysize);
+ return -EINVAL;
+ }
+ if (t->len < sizeof(*t)) {
+ if (dbg)
+ DBF("%s token check failed, len %d < min token size %zu\n",
+ __func__, (int)t->len, sizeof(*t));
+ return -EINVAL;
+ }
if (t->algtype != 0x02) {
if (dbg)
DBF("%s token check failed, algtype 0x%02x != 0x02\n",
@@ -195,6 +219,12 @@ int cca_check_sececckeytoken(debug_info_t *dbg, int dbflvl,
#define DBF(...) debug_sprintf_event(dbg, dbflvl, ##__VA_ARGS__)
+ if (keysize < sizeof(*t)) {
+ if (dbg)
+ DBF("%s keysize %u < min token size %zu\n",
+ __func__, keysize, sizeof(*t));
+ return -EINVAL;
+ }
if (t->type != TOKTYPE_CCA_INTERNAL_PKA) {
if (dbg)
DBF("%s token check failed, type 0x%02x != 0x%02x\n",
@@ -207,6 +237,12 @@ int cca_check_sececckeytoken(debug_info_t *dbg, int dbflvl,
__func__, (int)t->len, keysize);
return -EINVAL;
}
+ if (t->len < sizeof(*t)) {
+ if (dbg)
+ DBF("%s token check failed, len %d < min token size %zu\n",
+ __func__, (int)t->len, sizeof(*t));
+ return -EINVAL;
+ }
if (t->secid != 0x20) {
if (dbg)
DBF("%s token check failed, secid 0x%02x != 0x20\n",
@@ -443,7 +479,8 @@ int cca_genseckey(u16 cardnr, u16 domain,
/* check secure key token */
rc = cca_check_secaeskeytoken(zcrypt_dbf_info, DBF_ERR,
- prepparm->lv3.keyblock.tok, 8 * keysize);
+ prepparm->lv3.keyblock.tok,
+ seckeysize, 8 * keysize);
if (rc) {
rc = -EIO;
goto out;
@@ -582,7 +619,8 @@ int cca_clr2seckey(u16 cardnr, u16 domain, u32 keybitsize,
/* check secure key token */
rc = cca_check_secaeskeytoken(zcrypt_dbf_info, DBF_ERR,
- prepparm->lv3.keyblock.tok, 8 * keysize);
+ prepparm->lv3.keyblock.tok,
+ seckeysize, 8 * keysize);
if (rc) {
rc = -EIO;
goto out;
@@ -842,6 +880,7 @@ int cca_gencipherkey(u16 cardnr, u16 domain, u32 keybitsize, u32 keygenflags,
} kb;
} __packed * prepparm;
struct cipherkeytoken *t;
+ u32 keybuflen;
/* get already prepared memory for 2 cprbs with param block each */
rc = alloc_and_prep_cprbmem(PARMBSIZE, &mem,
@@ -936,23 +975,28 @@ int cca_gencipherkey(u16 cardnr, u16 domain, u32 keybitsize, u32 keygenflags,
}
/* and some checks on the generated key */
+ t = (struct cipherkeytoken *)prepparm->kb.tlv1.gen_key;
+ if (prepparm->kb.tlv1.len < 2 * sizeof(uint16_t) + sizeof(*t)) {
+ rc = -EIO;
+ goto out;
+ }
+ keybuflen = prepparm->kb.tlv1.len - 2 * sizeof(uint16_t);
rc = cca_check_secaescipherkey(zcrypt_dbf_info, DBF_ERR,
prepparm->kb.tlv1.gen_key,
- keybitsize, 1);
+ keybuflen, keybitsize, 1);
if (rc) {
rc = -EIO;
goto out;
}
/* copy the generated vlsc key token */
- t = (struct cipherkeytoken *)prepparm->kb.tlv1.gen_key;
if (keybuf) {
- if (*keybufsize >= t->len)
- memcpy(keybuf, t, t->len);
+ if (*keybufsize >= keybuflen)
+ memcpy(keybuf, t, keybuflen);
else
rc = -EINVAL;
}
- *keybufsize = t->len;
+ *keybufsize = keybuflen;
out:
free_cprbmem(mem, PARMBSIZE, false, xflags);
diff --git a/drivers/s390/crypto/zcrypt_ccamisc.h b/drivers/s390/crypto/zcrypt_ccamisc.h
index 07bbb1c20022..a4534f8b2f1d 100644
--- a/drivers/s390/crypto/zcrypt_ccamisc.h
+++ b/drivers/s390/crypto/zcrypt_ccamisc.h
@@ -136,7 +136,7 @@ struct eccprivkeytoken {
* also checked. Returns 0 on success or errno value on failure.
*/
int cca_check_secaeskeytoken(debug_info_t *dbg, int dbflvl,
- const u8 *token, int keybitsize);
+ const u8 *token, u32 keysize, int keybitsize);
/*
* Simple check if the token is a valid CCA secure AES cipher key
@@ -146,8 +146,8 @@ int cca_check_secaeskeytoken(debug_info_t *dbg, int dbflvl,
* Returns 0 on success or errno value on failure.
*/
int cca_check_secaescipherkey(debug_info_t *dbg, int dbflvl,
- const u8 *token, int keybitsize,
- int checkcpacfexport);
+ const u8 *token, u32 keysize,
+ int keybitsize, int checkcpacfexport);
/*
* Simple check if the token is a valid CCA secure ECC private
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v4 1/1] s390/zcrypt: Fix buffer over-read in cca_cipher2protkey
2026-07-29 11:40 ` [PATCH v4 1/1] s390/zcrypt: " Harald Freudenberger
@ 2026-07-29 12:06 ` sashiko-bot
2026-07-29 13:49 ` Harald Freudenberger
0 siblings, 1 reply; 4+ messages in thread
From: sashiko-bot @ 2026-07-29 12:06 UTC (permalink / raw)
To: Harald Freudenberger
Cc: Alexander Gordeev, Vasily Gorbik, linux-s390, Heiko Carstens
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
Pre-existing issues:
- [Critical] Unbounded token length allows heap buffer overflow in `cca_cipher2protkey` and `cca_ecc2protkey` when building CPRB requests.
- [High] Unvalidated firmware-provided length in `cca_gencipherkey` can lead to a massive out-of-bounds read and memory leak to user-space.
- [High] Unbounded `t->len` in `_ip_cprb_helper` can cause a heap buffer overflow when copying a response from the crypto card.
--
--- Patch [1]: [PATCH v4 1/1] s390/zcrypt: Fix buffer over-read in cca_cipher2protkey ---
commit df110319f8dcc4a61962c0699f5ad1038f1b9085
Author: Harald Freudenberger <freude@linux.ibm.com>
s390/zcrypt: Fix buffer over-read in cca_cipher2protkey
This commit adds validation of the actual key buffer size and token length
fields in the cca_check_sec*token functions. It prevents buffer over-reads
and under-runs that could lead to kernel crashes or memory exposure.
> diff --git a/drivers/s390/crypto/zcrypt_ccamisc.c b/drivers/s390/crypto/zcrypt_ccamisc.c
> --- a/drivers/s390/crypto/zcrypt_ccamisc.c
> +++ b/drivers/s390/crypto/zcrypt_ccamisc.c
[ ... ]
> @@ -936,23 +975,28 @@ int cca_gencipherkey(u16 cardnr, u16 domain, u32 keybitsize, u32 keygenflags,
> }
>
> /* and some checks on the generated key */
> + t = (struct cipherkeytoken *)prepparm->kb.tlv1.gen_key;
> + if (prepparm->kb.tlv1.len < 2 * sizeof(uint16_t) + sizeof(*t)) {
> + rc = -EIO;
> + goto out;
> + }
> + keybuflen = prepparm->kb.tlv1.len - 2 * sizeof(uint16_t);
> rc = cca_check_secaescipherkey(zcrypt_dbf_info, DBF_ERR,
> prepparm->kb.tlv1.gen_key,
> - keybitsize, 1);
> + keybuflen, keybitsize, 1);
> if (rc) {
> rc = -EIO;
> goto out;
> }
>
> /* copy the generated vlsc key token */
> - t = (struct cipherkeytoken *)prepparm->kb.tlv1.gen_key;
> if (keybuf) {
> - if (*keybufsize >= t->len)
> - memcpy(keybuf, t, t->len);
> + if (*keybufsize >= keybuflen)
> + memcpy(keybuf, t, keybuflen);
[Severity: High]
This isn't a bug introduced by this patch, but can an unvalidated firmware
response lead to an out-of-bounds read here?
The hardware returns a response containing a tlv1.len field which is
used to calculate keybuflen. If a compromised or buggy crypto card firmware
sets an abnormally large tlv1.len, does this memcpy read past the 512-byte
parameter block into adjacent kernel heap memory and leak it to userspace?
Could we add a bounds check against the 512-byte allocation limit before
performing the memcpy?
> else
> rc = -EINVAL;
> }
> - *keybufsize = t->len;
> + *keybufsize = keybuflen;
>
> out:
[Severity: Critical]
This is a pre-existing issue, but I noticed a potential regression involving
buffer overflows in cca_cipher2protkey and cca_ecc2protkey when building
request blocks.
In cca_cipher2protkey, if a user issues an ioctl providing a malicious token
with a large len field, does this overwrite the 512-byte buffer?
drivers/s390/crypto/zcrypt_ccamisc.c:cca_cipher2protkey() {
...
preqparm->kb.len = keytoklen + 3 * sizeof(uint16_t);
preqparm->kb.cca_key_token_len = keytoklen + 2 * sizeof(uint16_t);
memcpy(preqparm->kb.cca_key_token, ckey, keytoklen);
...
}
The cca_check_secaescipherkey function ensures t->len is less than or equal
to keysize, where keysize is the user-provided size that can be up to
8192 bytes. If keytoklen is larger than the 512-byte limit, could this memcpy
overwrite the allocation?
A similar pattern exists in cca_ecc2protkey:
drivers/s390/crypto/zcrypt_ccamisc.c:cca_ecc2protkey() {
...
preqparm->kb.len = keylen + 3 * sizeof(uint16_t);
preqparm->kb.cca_key_token_len = keylen + 2 * sizeof(uint16_t);
memcpy(preqparm->kb.cca_key_token, key, keylen);
...
}
[Severity: High]
This is also a pre-existing issue, but I observed a similar unbounded length
usage in _ip_cprb_helper that might cause an out-of-bounds read and write.
When copying a response from the crypto card, the t->len field is trusted
directly from the hardware:
drivers/s390/crypto/zcrypt_ccamisc.c:_ip_cprb_helper() {
...
t = (struct cipherkeytoken *)prepparm->kb.tlv1.key_token;
memcpy(key_token, t, t->len);
*key_token_size = t->len;
...
}
If the hardware provides a malformed response with a large t->len, does this
memcpy read out-of-bounds from the 512-byte parameter block?
Additionally, if this corrupted length is returned to cca_clr2cipherkey,
could it be used to write back into a new 512-byte request block and cause
another overflow?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260729114009.187946-2-freude@linux.ibm.com?part=1
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v4 1/1] s390/zcrypt: Fix buffer over-read in cca_cipher2protkey
2026-07-29 12:06 ` sashiko-bot
@ 2026-07-29 13:49 ` Harald Freudenberger
0 siblings, 0 replies; 4+ messages in thread
From: Harald Freudenberger @ 2026-07-29 13:49 UTC (permalink / raw)
To: sashiko-reviews
Cc: Alexander Gordeev, Vasily Gorbik, linux-s390, Heiko Carstens
On 2026-07-29 14:06, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 3 potential
> issue(s) to consider:
>
> Pre-existing issues:
> - [Critical] Unbounded token length allows heap buffer overflow in
> `cca_cipher2protkey` and `cca_ecc2protkey` when building CPRB
> requests.
> - [High] Unvalidated firmware-provided length in `cca_gencipherkey`
> can lead to a massive out-of-bounds read and memory leak to
> user-space.
> - [High] Unbounded `t->len` in `_ip_cprb_helper` can cause a heap
> buffer overflow when copying a response from the crypto card.
> --
>
> --- Patch [1]: [PATCH v4 1/1] s390/zcrypt: Fix buffer over-read in
> cca_cipher2protkey ---
> commit df110319f8dcc4a61962c0699f5ad1038f1b9085
> Author: Harald Freudenberger <freude@linux.ibm.com>
>
> s390/zcrypt: Fix buffer over-read in cca_cipher2protkey
>
> This commit adds validation of the actual key buffer size and token
> length
> fields in the cca_check_sec*token functions. It prevents buffer
> over-reads
> and under-runs that could lead to kernel crashes or memory exposure.
>
>> diff --git a/drivers/s390/crypto/zcrypt_ccamisc.c
>> b/drivers/s390/crypto/zcrypt_ccamisc.c
>> --- a/drivers/s390/crypto/zcrypt_ccamisc.c
>> +++ b/drivers/s390/crypto/zcrypt_ccamisc.c
> [ ... ]
>> @@ -936,23 +975,28 @@ int cca_gencipherkey(u16 cardnr, u16 domain, u32
>> keybitsize, u32 keygenflags,
>> }
>>
>> /* and some checks on the generated key */
>> + t = (struct cipherkeytoken *)prepparm->kb.tlv1.gen_key;
>> + if (prepparm->kb.tlv1.len < 2 * sizeof(uint16_t) + sizeof(*t)) {
>> + rc = -EIO;
>> + goto out;
>> + }
>> + keybuflen = prepparm->kb.tlv1.len - 2 * sizeof(uint16_t);
>> rc = cca_check_secaescipherkey(zcrypt_dbf_info, DBF_ERR,
>> prepparm->kb.tlv1.gen_key,
>> - keybitsize, 1);
>> + keybuflen, keybitsize, 1);
>> if (rc) {
>> rc = -EIO;
>> goto out;
>> }
>>
>> /* copy the generated vlsc key token */
>> - t = (struct cipherkeytoken *)prepparm->kb.tlv1.gen_key;
>> if (keybuf) {
>> - if (*keybufsize >= t->len)
>> - memcpy(keybuf, t, t->len);
>> + if (*keybufsize >= keybuflen)
>> + memcpy(keybuf, t, keybuflen);
>
> [Severity: High]
> This isn't a bug introduced by this patch, but can an unvalidated
> firmware
> response lead to an out-of-bounds read here?
>
> The hardware returns a response containing a tlv1.len field which is
> used to calculate keybuflen. If a compromised or buggy crypto card
> firmware
> sets an abnormally large tlv1.len, does this memcpy read past the
> 512-byte
> parameter block into adjacent kernel heap memory and leak it to
> userspace?
>
> Could we add a bounds check against the 512-byte allocation limit
> before
> performing the memcpy?
>
>> else
>> rc = -EINVAL;
>> }
>> - *keybufsize = t->len;
>> + *keybufsize = keybuflen;
>>
>> out:
>
> [Severity: Critical]
> This is a pre-existing issue, but I noticed a potential regression
> involving
> buffer overflows in cca_cipher2protkey and cca_ecc2protkey when
> building
> request blocks.
>
> In cca_cipher2protkey, if a user issues an ioctl providing a malicious
> token
> with a large len field, does this overwrite the 512-byte buffer?
>
> drivers/s390/crypto/zcrypt_ccamisc.c:cca_cipher2protkey() {
> ...
> preqparm->kb.len = keytoklen + 3 * sizeof(uint16_t);
> preqparm->kb.cca_key_token_len = keytoklen + 2 * sizeof(uint16_t);
> memcpy(preqparm->kb.cca_key_token, ckey, keytoklen);
> ...
> }
>
> The cca_check_secaescipherkey function ensures t->len is less than or
> equal
> to keysize, where keysize is the user-provided size that can be up to
> 8192 bytes. If keytoklen is larger than the 512-byte limit, could this
> memcpy
> overwrite the allocation?
>
> A similar pattern exists in cca_ecc2protkey:
>
> drivers/s390/crypto/zcrypt_ccamisc.c:cca_ecc2protkey() {
> ...
> preqparm->kb.len = keylen + 3 * sizeof(uint16_t);
> preqparm->kb.cca_key_token_len = keylen + 2 * sizeof(uint16_t);
> memcpy(preqparm->kb.cca_key_token, key, keylen);
> ...
> }
>
> [Severity: High]
> This is also a pre-existing issue, but I observed a similar unbounded
> length
> usage in _ip_cprb_helper that might cause an out-of-bounds read and
> write.
>
> When copying a response from the crypto card, the t->len field is
> trusted
> directly from the hardware:
>
> drivers/s390/crypto/zcrypt_ccamisc.c:_ip_cprb_helper() {
> ...
> t = (struct cipherkeytoken *)prepparm->kb.tlv1.key_token;
> memcpy(key_token, t, t->len);
> *key_token_size = t->len;
> ...
> }
>
> If the hardware provides a malformed response with a large t->len, does
> this
> memcpy read out-of-bounds from the 512-byte parameter block?
>
> Additionally, if this corrupted length is returned to
> cca_clr2cipherkey,
> could it be used to write back into a new 512-byte request block and
> cause
> another overflow?
These issues are valid but are already addressed with another patch
series.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-07-29 13:49 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-29 11:40 [PATCH v4 0/1] Fix buffer over-read in cca_cipher2protkey Harald Freudenberger
2026-07-29 11:40 ` [PATCH v4 1/1] s390/zcrypt: " Harald Freudenberger
2026-07-29 12:06 ` sashiko-bot
2026-07-29 13:49 ` Harald Freudenberger
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.