]> git.proxmox.com Git - grub2.git/commitdiff
net/http: Fix OOB write for split http headers
authorDaniel Axtens <dja@axtens.net>
Tue, 8 Mar 2022 07:17:03 +0000 (18:17 +1100)
committerJulian Andres Klode <julian.klode@canonical.com>
Wed, 8 Jun 2022 10:41:03 +0000 (12:41 +0200)
GRUB has special code for handling an http header that is split
across two packets.

The code tracks the end of line by looking for a "\n" byte. The
code for split headers has always advanced the pointer just past the
end of the line, whereas the code that handles unsplit headers does
not advance the pointer. This extra advance causes the length to be
one greater, which breaks an assumption in parse_line(), leading to
it writing a NUL byte one byte past the end of the buffer where we
reconstruct the line from the two packets.

It's conceivable that an attacker controlled set of packets could
cause this to zero out the first byte of the "next" pointer of the
grub_mm_region structure following the current_line buffer.

Do not advance the pointer in the split header case.

Fixes: CVE-2022-28734
Signed-off-by: Daniel Axtens <dja@axtens.net>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
grub-core/net/http.c

index ef6eaff0d91b27a0a5919e26cbcd4d28f30b378f..9f45ad4e8b17b740125a91da29339714fa9f50f4 100644 (file)
@@ -190,9 +190,7 @@ http_receive (grub_net_tcp_socket_t sock __attribute__ ((unused)),
          int have_line = 1;
          char *t;
          ptr = grub_memchr (nb->data, '\n', nb->tail - nb->data);
-         if (ptr)
-           ptr++;
-         else
+         if (ptr == NULL)
            {
              have_line = 0;
              ptr = (char *) nb->tail;