summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulius Werner <jwerner@chromium.org>2023-05-03 19:02:09 -0700
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2023-05-13 04:23:49 +0000
commite34cc1be6c526187fee9349246b811fb8018a3c7 (patch)
tree2c221ecd7b1d0bece8288f6ca9e223b2b709b663
parent4634d58ac99d495ecba149386a20c6be68e95157 (diff)
downloadvboot-e34cc1be6c526187fee9349246b811fb8018a3c7.tar.gz
Add checks for a few minor overflow risks
This patch fixes a few locations where specific maliciously crafted input could cause an arithmetic overflow to bypass a size check. In none of those instances is the data being parsed actually untrusted for our use case, so there was no real security risk here. This is just extra hardening. BUG=chromium:1441030,b:280378929 TEST=Booted CoachZ Signed-off-by: Julius Werner <jwerner@chromium.org> Change-Id: I65f2d483f1e67686b7a22f0f7eb3ce5c3eabfdfa Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/4505019 Reviewed-by: Yu-Ping Wu <yupingso@chromium.org>
-rw-r--r--firmware/2lib/2packed_key.c2
-rw-r--r--firmware/2lib/2rsa.c2
-rw-r--r--futility/misc.c8
3 files changed, 6 insertions, 6 deletions
diff --git a/firmware/2lib/2packed_key.c b/firmware/2lib/2packed_key.c
index c9e602a2..d6b50417 100644
--- a/firmware/2lib/2packed_key.c
+++ b/firmware/2lib/2packed_key.c
@@ -48,7 +48,7 @@ vb2_error_t vb2_unpack_key_buffer(struct vb2_public_key *key,
/* Validity check key array size */
key->arrsize = buf32[0];
- if (key->arrsize * sizeof(uint32_t) != vb2_rsa_sig_size(key->sig_alg))
+ if ((uint64_t)key->arrsize * sizeof(uint32_t) != vb2_rsa_sig_size(key->sig_alg))
return VB2_ERROR_UNPACK_KEY_ARRAY_SIZE;
key->n0inv = buf32[1];
diff --git a/firmware/2lib/2rsa.c b/firmware/2lib/2rsa.c
index 7d04dbc0..e360f1b1 100644
--- a/firmware/2lib/2rsa.c
+++ b/firmware/2lib/2rsa.c
@@ -356,7 +356,7 @@ vb2_error_t vb2_rsa_verify_digest(const struct vb2_public_key *key,
/* Signature length should be same as key length */
key_bytes = key->arrsize * sizeof(uint32_t);
- if (key_bytes != sig_size) {
+ if (key_bytes != sig_size || key->arrsize > key_bytes) {
VB2_DEBUG("Signature is of incorrect length!\n");
return VB2_ERROR_RSA_VERIFY_SIG_LEN;
}
diff --git a/futility/misc.c b/futility/misc.c
index 3f3fb656..d56928b5 100644
--- a/futility/misc.c
+++ b/futility/misc.c
@@ -109,7 +109,7 @@ int futil_valid_gbb_header(struct vb2_gbb_header *gbb, uint32_t len,
return 0;
if (gbb->hwid_offset < EXPECTED_VB2_GBB_HEADER_SIZE)
return 0;
- if (gbb->hwid_offset + gbb->hwid_size > len)
+ if ((uint64_t)gbb->hwid_offset + gbb->hwid_size > len)
return 0;
if (gbb->hwid_size) {
const char *s = (const char *)
@@ -119,16 +119,16 @@ int futil_valid_gbb_header(struct vb2_gbb_header *gbb, uint32_t len,
}
if (gbb->rootkey_offset < EXPECTED_VB2_GBB_HEADER_SIZE)
return 0;
- if (gbb->rootkey_offset + gbb->rootkey_size > len)
+ if ((uint64_t)gbb->rootkey_offset + gbb->rootkey_size > len)
return 0;
if (gbb->bmpfv_offset < EXPECTED_VB2_GBB_HEADER_SIZE)
return 0;
- if (gbb->bmpfv_offset + gbb->bmpfv_size > len)
+ if ((uint64_t)gbb->bmpfv_offset + gbb->bmpfv_size > len)
return 0;
if (gbb->recovery_key_offset < EXPECTED_VB2_GBB_HEADER_SIZE)
return 0;
- if (gbb->recovery_key_offset + gbb->recovery_key_size > len)
+ if ((uint64_t)gbb->recovery_key_offset + gbb->recovery_key_size > len)
return 0;
/* Seems legit... */