e016790fe1
- Security fixes and hardenings for boothole 3 / boothole 2022 (bsc#1198581) * 0001-video-Remove-trailing-whitespaces.patch * 0002-loader-efi-chainloader-Simplify-the-loader-state.patch * 0003-commands-boot-Add-API-to-pass-context-to-loader.patch - Fix CVE-2022-28736 (bsc#1198496) * 0004-loader-efi-chainloader-Use-grub_loader_set_ex.patch - Fix CVE-2022-28735 (bsc#1198495) * 0005-kern-efi-sb-Reject-non-kernel-files-in-the-shim_lock.patch * 0006-kern-file-Do-not-leak-device_name-on-error-in-grub_f.patch * 0007-video-readers-png-Abort-sooner-if-a-read-operation-f.patch * 0008-video-readers-png-Refuse-to-handle-multiple-image-he.patch - Fix CVE-2021-3695 (bsc#1191184) * 0009-video-readers-png-Drop-greyscale-support-to-fix-heap.patch - Fix CVE-2021-3696 (bsc#1191185) * 0010-video-readers-png-Avoid-heap-OOB-R-W-inserting-huff-.patch * 0011-video-readers-png-Sanity-check-some-huffman-codes.patch * 0012-video-readers-jpeg-Abort-sooner-if-a-read-operation-.patch * 0013-video-readers-jpeg-Do-not-reallocate-a-given-huff-ta.patch * 0014-video-readers-jpeg-Refuse-to-handle-multiple-start-o.patch - Fix CVE-2021-3697 (bsc#1191186) * 0015-video-readers-jpeg-Block-int-underflow-wild-pointer-.patch * 0016-normal-charset-Fix-array-out-of-bounds-formatting-un.patch - Fix CVE-2022-28733 (bsc#1198460) * 0017-net-ip-Do-IP-fragment-maths-safely.patch * 0018-net-netbuff-Block-overly-large-netbuff-allocs.patch * 0019-net-dns-Fix-double-free-addresses-on-corrupt-DNS-res.patch * 0020-net-dns-Don-t-read-past-the-end-of-the-string-we-re-.patch * 0021-net-tftp-Prevent-a-UAF-and-double-free-from-a-failed.patch * 0022-net-tftp-Avoid-a-trivial-UAF.patch * 0023-net-http-Do-not-tear-down-socket-if-it-s-already-bee.patch OBS-URL: https://build.opensuse.org/request/show/981228 OBS-URL: https://build.opensuse.org/package/show/Base:System/grub2?expand=0&rev=416
135 lines
4.3 KiB
Diff
135 lines
4.3 KiB
Diff
From 5ac885d02a9e91a5d6760090f90fa2bb4e7a5dd6 Mon Sep 17 00:00:00 2001
|
|
From: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
|
|
Date: Wed, 6 Apr 2022 18:49:09 +0530
|
|
Subject: [PATCH 27/32] fs/f2fs: Do not read past the end of nat bitmap
|
|
|
|
A corrupt f2fs filesystem could have a block offset or a bitmap
|
|
offset that would cause us to read beyond the bounds of the nat
|
|
bitmap.
|
|
|
|
Introduce the nat_bitmap_size member in grub_f2fs_data which holds
|
|
the size of nat bitmap.
|
|
|
|
Set the size when loading the nat bitmap in nat_bitmap_ptr(), and
|
|
catch when an invalid offset would create a pointer past the end of
|
|
the allocated space.
|
|
|
|
Check against the bitmap size in grub_f2fs_test_bit() test bit to avoid
|
|
reading past the end of the nat bitmap.
|
|
|
|
Signed-off-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
|
|
Signed-off-by: Daniel Axtens <dja@axtens.net>
|
|
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
|
---
|
|
grub-core/fs/f2fs.c | 33 +++++++++++++++++++++++++++------
|
|
1 file changed, 27 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/grub-core/fs/f2fs.c b/grub-core/fs/f2fs.c
|
|
index 63702214b0..8898b235e0 100644
|
|
--- a/grub-core/fs/f2fs.c
|
|
+++ b/grub-core/fs/f2fs.c
|
|
@@ -122,6 +122,7 @@ GRUB_MOD_LICENSE ("GPLv3+");
|
|
#define F2FS_INLINE_DOTS 0x10 /* File having implicit dot dentries. */
|
|
|
|
#define MAX_VOLUME_NAME 512
|
|
+#define MAX_NAT_BITMAP_SIZE 3900
|
|
|
|
enum FILE_TYPE
|
|
{
|
|
@@ -183,7 +184,7 @@ struct grub_f2fs_checkpoint
|
|
grub_uint32_t checksum_offset;
|
|
grub_uint64_t elapsed_time;
|
|
grub_uint8_t alloc_type[MAX_ACTIVE_LOGS];
|
|
- grub_uint8_t sit_nat_version_bitmap[3900];
|
|
+ grub_uint8_t sit_nat_version_bitmap[MAX_NAT_BITMAP_SIZE];
|
|
grub_uint32_t checksum;
|
|
} GRUB_PACKED;
|
|
|
|
@@ -302,6 +303,7 @@ struct grub_f2fs_data
|
|
|
|
struct grub_f2fs_nat_journal nat_j;
|
|
char *nat_bitmap;
|
|
+ grub_uint32_t nat_bitmap_size;
|
|
|
|
grub_disk_t disk;
|
|
struct grub_f2fs_node *inode;
|
|
@@ -377,15 +379,20 @@ sum_blk_addr (struct grub_f2fs_data *data, int base, int type)
|
|
}
|
|
|
|
static void *
|
|
-nat_bitmap_ptr (struct grub_f2fs_data *data)
|
|
+nat_bitmap_ptr (struct grub_f2fs_data *data, grub_uint32_t *nat_bitmap_size)
|
|
{
|
|
struct grub_f2fs_checkpoint *ckpt = &data->ckpt;
|
|
grub_uint32_t offset;
|
|
+ *nat_bitmap_size = MAX_NAT_BITMAP_SIZE;
|
|
|
|
if (grub_le_to_cpu32 (data->sblock.cp_payload) > 0)
|
|
return ckpt->sit_nat_version_bitmap;
|
|
|
|
offset = grub_le_to_cpu32 (ckpt->sit_ver_bitmap_bytesize);
|
|
+ if (offset >= MAX_NAT_BITMAP_SIZE)
|
|
+ return NULL;
|
|
+
|
|
+ *nat_bitmap_size = *nat_bitmap_size - offset;
|
|
|
|
return ckpt->sit_nat_version_bitmap + offset;
|
|
}
|
|
@@ -438,11 +445,15 @@ grub_f2fs_crc_valid (grub_uint32_t blk_crc, void *buf, const grub_uint32_t len)
|
|
}
|
|
|
|
static int
|
|
-grub_f2fs_test_bit (grub_uint32_t nr, const char *p)
|
|
+grub_f2fs_test_bit (grub_uint32_t nr, const char *p, grub_uint32_t len)
|
|
{
|
|
int mask;
|
|
+ grub_uint32_t shifted_nr = (nr >> 3);
|
|
+
|
|
+ if (shifted_nr >= len)
|
|
+ return -1;
|
|
|
|
- p += (nr >> 3);
|
|
+ p += shifted_nr;
|
|
mask = 1 << (7 - (nr & 0x07));
|
|
|
|
return mask & *p;
|
|
@@ -662,6 +673,7 @@ get_node_blkaddr (struct grub_f2fs_data *data, grub_uint32_t nid)
|
|
grub_uint32_t seg_off, block_off, entry_off, block_addr;
|
|
grub_uint32_t blkaddr = 0;
|
|
grub_err_t err;
|
|
+ int result_bit;
|
|
|
|
err = get_blkaddr_from_nat_journal (data, nid, &blkaddr);
|
|
if (err != GRUB_ERR_NONE)
|
|
@@ -682,8 +694,15 @@ get_node_blkaddr (struct grub_f2fs_data *data, grub_uint32_t nid)
|
|
((seg_off * data->blocks_per_seg) << 1) +
|
|
(block_off & (data->blocks_per_seg - 1));
|
|
|
|
- if (grub_f2fs_test_bit (block_off, data->nat_bitmap))
|
|
+ result_bit = grub_f2fs_test_bit (block_off, data->nat_bitmap,
|
|
+ data->nat_bitmap_size);
|
|
+ if (result_bit > 0)
|
|
block_addr += data->blocks_per_seg;
|
|
+ else if (result_bit == -1)
|
|
+ {
|
|
+ grub_free (nat_block);
|
|
+ return 0;
|
|
+ }
|
|
|
|
err = grub_f2fs_block_read (data, block_addr, nat_block);
|
|
if (err)
|
|
@@ -833,7 +852,9 @@ grub_f2fs_mount (grub_disk_t disk)
|
|
if (err)
|
|
goto fail;
|
|
|
|
- data->nat_bitmap = nat_bitmap_ptr (data);
|
|
+ data->nat_bitmap = nat_bitmap_ptr (data, &data->nat_bitmap_size);
|
|
+ if (data->nat_bitmap == NULL)
|
|
+ goto fail;
|
|
|
|
err = get_nat_journal (data);
|
|
if (err)
|
|
--
|
|
2.34.1
|
|
|