Re: [PATCH v9 4/5] s390/zcrypt: Improve EP11 CPRB domain handling with ASN.1 parsing

Harald Freudenberger <[email protected]> Thu, 30 Jul 2026 13:55:38 +0200
Newsgroups dev.linux.lists.sashiko-reviews,org.kernel.vger.linux-s390
Message-ID <[email protected]>
On 2026-07-29 18:46, [email protected] wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential
> issue(s) to consider:
> - [Critical] Missing bounds checking before reading `pld[offs++]`
> causes an integer underflow in `pld_len - offs`, bypassing bounds
> checks and enabling an Out-Of-Bounds (OOB) read and write.
> --
> 
> --- Patch [4]: [PATCH v9 4/5] s390/zcrypt: Improve EP11 CPRB domain
> handling with ASN.1 parsing ---
> commit 750aceaeb85ad5fa9ff8e2614110f89a4c147522
> Author: Harald Freudenberger <[email protected]>
> 
> s390/zcrypt: Improve EP11 CPRB domain handling with ASN.1 parsing
> 
> This commit replaces struct overlays with explicit ASN.1 parsing for 
> EP11
> CPRB domain handling. It introduces bounds checking at each parsing 
> step
> and adds a helper function to safely write integer values.
> 
>> diff --git a/drivers/s390/crypto/zcrypt_msgtype6.c 
>> b/drivers/s390/crypto/zcrypt_msgtype6.c
>> --- a/drivers/s390/crypto/zcrypt_msgtype6.c
>> +++ b/drivers/s390/crypto/zcrypt_msgtype6.c
> 
> [ ... ]
> 
>> @@ -1235,51 +1258,90 @@ static long 
>> zcrypt_msgtype6_send_ep11_cprb(bool userspace, struct zcrypt_queue *
>>  					   struct ap_message *ap_msg)
>>  {
> 
> [ ... ]
> 
>> +		/* payload length field */
>> +		i = asn1_length_decode(pld + offs, pld_len - offs, &u);
>> +		if (i < 0)
>> +			return -EINVAL;
>> +		offs += i;
>> +		if (u > pld_len - offs)
>> +			return -EINVAL;
>> +		/* function tag */
>> +		if (pld[offs++] != 0x04)
> 
> [Severity: Critical]
> If the ASN.1 payload tag and length encoding completely consume the 
> payload
> buffer, couldn't offs become equal to pld_len here?
> 
> If offs equals pld_len, does this array access read out of bounds and
> increment offs past pld_len?
> 
> If offs exceeds pld_len, it appears the subsequent pld_len - offs
> calculations will underflow to SIZE_MAX. Would this bypass the 
> remaining
> bounds checks, such as pld_len - offs >= 3, and potentially allow
> asn1_int_encode() to write out of bounds?
> 
> Additionally, it looks like a similar pattern exists in
> xcrb_msg_to_type6_ep11cprb_msgx() where pld[offs++] is checked for the
> function tag without a prior bounds check.
> 

I'll add checks about exceeding the payload for these both functions
into the next version of this patch series.

>> +			return -EINVAL;
>> +		/* function length */
>> +		i = asn1_length_decode(pld + offs, pld_len - offs, &u);
>> +		if (i < 0)
>> +			return -EINVAL;
>> +		offs += i;
>> +		if (u > pld_len - offs)
>> +			return -EINVAL;
> 
> [ ... ]