On 28/02/2025 22:17, Vladimir 'phcoder' Serbinenko wrote:
Why do you remove boundary check? Maybe it's better to add the second
boundary check from below
The issue stems from my original patches being rebased over `fs/ntfs:
Fix out-of-bounds read`, with both my patches and that commit fixing the
same fuzzed NTFS issue in the while-loop. I felt it was better to get it
to known good state as I verified my original patches against quite a
few NTFS volumes including several that caused the original OOB reads.
Keeping the mft_end checks doesn't hurt after adding the attr_cur check
back in, just not much point as at->end should always be the same value.
Le ven. 28 févr. 2025, 16:11, B Horn <b...@horn.uk <mailto:b...@horn.uk>> a
écrit :
On some NTFS volumes GRUB would enter an infinite loop when
next_attribute() returned NULL, which can happen in normal cases when
the end of the attribute list is reached.
This would trigger a NULL deref, but as the null page is mapped on the
majority of firmware, an infinite loop would occur as the while loop
didn't make any progress.
Fixing this by verifying the value of at->attr_cur on the next iteration
of the loop, after it has been set to the result of next_attribute().
Also removing the redundant check against mft_end as the
next_attribute() should handle that now.
A pointer to the end of the buffer is stored in at->end, which is
initialized the same way as mft_end was.
Fixes: https://savannah.gnu.org/bugs/index.php?66855 <https://
savannah.gnu.org/bugs/index.php?66855>
Reported-by: Andreas Klauer <andreas.kla...@metamorpher.de
<mailto:andreas.kla...@metamorpher.de>>
Signed-off-by: B Horn <b...@horn.uk <mailto:b...@horn.uk>>
---
grub-core/fs/ntfs.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/grub-core/fs/ntfs.c b/grub-core/fs/ntfs.c
index 960833a34..77531e627 100644
--- a/grub-core/fs/ntfs.c
+++ b/grub-core/fs/ntfs.c
@@ -311,8 +311,6 @@ free_attr (struct grub_ntfs_attr *at)
static grub_uint8_t *
find_attr (struct grub_ntfs_attr *at, grub_uint8_t attr)
{
- grub_uint8_t *mft_end;
-
if (at->flags & GRUB_NTFS_AF_ALST)
{
retry:
@@ -386,8 +384,7 @@ find_attr (struct grub_ntfs_attr *at,
grub_uint8_t attr)
return NULL;
}
at->attr_cur = at->attr_nxt;
- mft_end = at->mft->buf + (at->mft->data->mft_size <<
GRUB_NTFS_BLK_SHR);
- while (at->attr_cur < mft_end && *at->attr_cur != 0xFF)
+ while (at->attr_cur && *at->attr_cur != 0xFF)
{
at->attr_nxt = next_attribute (at->attr_cur, at->end);
if (*at->attr_cur == GRUB_NTFS_AT_ATTRIBUTE_LIST)
--
2.48.1
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org <mailto:Grub-devel@gnu.org>
https://lists.gnu.org/mailman/listinfo/grub-devel <https://
lists.gnu.org/mailman/listinfo/grub-devel>
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel