Hi gzip maintainers,
An out-of-bounds / uninitialised read occurs in unzip.c:check_zipfile()
when the PKZIP local header is shorter than 30 bytes (CWE-457, CWE-125).
Reproduction (on 1.14, Linux x86-64, gcc 13.3):
printf '%s' \
504B0304 1400 0000 0000 0000 0000 00000000 \
01000000 01000000 | xxd -r -p > poc.zip
valgrind --track-origins=yes ./gzip -tv poc.zip
# conditional jump depends on uninitialised value(s) in check_zipfile()
Minimal fix:
--- a/unzip.c
+++ b/unzip.c
@@
uch *h = inbuf + inptr;
+ if (insize - inptr < LOCHDR) /* need full header */
+ goto bad_zip;
inptr += LOCHDR + SH(h + LOCFIL) + SH(h + LOCEXT);
Best regards,
Mohamed Maatallah