diff mbox series

libkmod: error out on unknown hash algorithm

Message ID 20230206143259.585180-1-emil.l.velikov@gmail.com (mailing list archive)
State New, archived
Headers show
Series libkmod: error out on unknown hash algorithm | expand

Commit Message

Emil Velikov Feb. 6, 2023, 2:32 p.m. UTC
From: Emil Velikov <emil.velikov@collabora.com>

Currently if we see unknown algorithm, we'll do an OOB read in
pkey_hash_algo. This can happen for example if OPENSSL_NO_SM3 is set and
the kernel module uses a SM3 hash.

Cc: Mikhail Novosyolov <m.novosyolov@rosalinux.ru>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
---
Should probably wire some sanitizers and/or valgrind to the tests.
Although I'm not sure if I'll get the time to do so.
---
 libkmod/libkmod-signature.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

Comments

Lucas De Marchi Feb. 9, 2023, 8:09 p.m. UTC | #1
On Mon, 06 Feb 2023 14:32:59 +0000, Emil Velikov wrote:
> Currently if we see unknown algorithm, we'll do an OOB read in
> pkey_hash_algo. This can happen for example if OPENSSL_NO_SM3 is set and
> the kernel module uses a SM3 hash.
> 
> 

Applied, thanks!

[1/1] libkmod: error out on unknown hash algorithm
      commit: b9605c63b859adfffc0b4b9420d720aa323b90e9

Best regards,
diff mbox series

Patch

diff --git a/libkmod/libkmod-signature.c b/libkmod/libkmod-signature.c
index 092f396..b749a81 100644
--- a/libkmod/libkmod-signature.c
+++ b/libkmod/libkmod-signature.c
@@ -219,6 +219,7 @@  static bool fill_pkcs7(const char *mem, off_t size,
 	unsigned char *key_id_str;
 	struct pkcs7_private *pvt;
 	const char *issuer_str;
+	int hash_algo;
 
 	size -= sig_len;
 	pkcs7_raw = mem + size;
@@ -277,7 +278,10 @@  static bool fill_pkcs7(const char *mem, off_t size,
 
 	X509_ALGOR_get0(&o, NULL, NULL, dig_alg);
 
-	sig_info->hash_algo = pkey_hash_algo[obj_to_hash_algo(o)];
+	hash_algo = obj_to_hash_algo(o);
+	if (hash_algo < 0)
+		goto err3;
+	sig_info->hash_algo = pkey_hash_algo[hash_algo];
 	// hash algo has not been recognized
 	if (sig_info->hash_algo == NULL)
 		goto err3;