2021-01-07 09:30:44

by Tianjia Zhang

[permalink] [raw]
Subject: [PATCH] X.509: Fix crash caused by NULL pointer

On the following call path, `sig->pkey_algo` is not assigned
in asymmetric_key_verify_signature(), which causes runtime
crash in public_key_verify_signature().

keyctl_pkey_verify
asymmetric_key_verify_signature
verify_signature
public_key_verify_signature

This patch simply check this situation and fixes the crash
caused by NULL pointer.

Fixes: 215525639631 ("X.509: support OSCCA SM2-with-SM3 certificate verification")
Cc: [email protected] # v5.10+
Reported-by: Tobias Markus <[email protected]>
Signed-off-by: Tianjia Zhang <[email protected]>
---
crypto/asymmetric_keys/public_key.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/crypto/asymmetric_keys/public_key.c b/crypto/asymmetric_keys/public_key.c
index 8892908ad58c..788a4ba1e2e7 100644
--- a/crypto/asymmetric_keys/public_key.c
+++ b/crypto/asymmetric_keys/public_key.c
@@ -356,7 +356,8 @@ int public_key_verify_signature(const struct public_key *pkey,
if (ret)
goto error_free_key;

- if (strcmp(sig->pkey_algo, "sm2") == 0 && sig->data_size) {
+ if (sig->pkey_algo && strcmp(sig->pkey_algo, "sm2") == 0 &&
+ sig->data_size) {
ret = cert_sig_digest_update(sig, tfm);
if (ret)
goto error_free_key;
--
2.19.1.3.ge56e4f7


2021-01-07 11:00:49

by David Howells

[permalink] [raw]
Subject: Re: [PATCH] X.509: Fix crash caused by NULL pointer

Tianjia Zhang <[email protected]> wrote:

> On the following call path, `sig->pkey_algo` is not assigned
> in asymmetric_key_verify_signature(), which causes runtime
> crash in public_key_verify_signature().
>
> keyctl_pkey_verify
> asymmetric_key_verify_signature
> verify_signature
> public_key_verify_signature
>
> This patch simply check this situation and fixes the crash
> caused by NULL pointer.
>
> Fixes: 215525639631 ("X.509: support OSCCA SM2-with-SM3 certificate verification")
> Cc: [email protected] # v5.10+
> Reported-by: Tobias Markus <[email protected]>
> Signed-off-by: Tianjia Zhang <[email protected]>

Looks reasonable:

Acked-by: David Howells <[email protected]>

I wonder, though, if cert_sig_digest_update() should be obtained by some sort
of function pointer. It doesn't really seem to belong in this file. But this
is a separate issue.

David

2021-01-13 03:44:32

by Tianjia Zhang

[permalink] [raw]
Subject: Re: [PATCH] X.509: Fix crash caused by NULL pointer



On 1/7/21 6:58 PM, David Howells wrote:
> Tianjia Zhang <[email protected]> wrote:
>
>> On the following call path, `sig->pkey_algo` is not assigned
>> in asymmetric_key_verify_signature(), which causes runtime
>> crash in public_key_verify_signature().
>>
>> keyctl_pkey_verify
>> asymmetric_key_verify_signature
>> verify_signature
>> public_key_verify_signature
>>
>> This patch simply check this situation and fixes the crash
>> caused by NULL pointer.
>>
>> Fixes: 215525639631 ("X.509: support OSCCA SM2-with-SM3 certificate verification")
>> Cc: [email protected] # v5.10+
>> Reported-by: Tobias Markus <[email protected]>
>> Signed-off-by: Tianjia Zhang <[email protected]>
>
> Looks reasonable:
>
> Acked-by: David Howells <[email protected]>
>
> I wonder, though, if cert_sig_digest_update() should be obtained by some sort
> of function pointer. It doesn't really seem to belong in this file. But this
> is a separate issue.
>
> David
>

Yes, this is indeed the logic of the SM2 module. I have tried to
dynamically load and obtain the pointer of this function through
`request_module` before, but this method still does not seem very
suitable. Here are some unfinished codes I tried before:

https://github.com/uudiin/linux/commit/55bca48c6282415d94c53a7692622d544da99342

It would be great if you have some good experience to share with me, I
will continue to try to optimize this code.

Best regards,
Tianjia