diff --git a/pngcheck-2.4.0-unchecked-chunk-size.patch b/pngcheck-2.4.0-unchecked-chunk-size.patch new file mode 100644 index 0000000..57cf8c6 --- /dev/null +++ b/pngcheck-2.4.0-unchecked-chunk-size.patch @@ -0,0 +1,747 @@ +In some cases, the chunk length from the file data (sz) is used to index into +the read buffer without sufficient bounds-checking, leading to a buffer +overrun. + +This patch bails out on a PPLT or hIST chunk larger than the 32000-byte read +block, calling it an invalid size—similar to the existing handling for the iCCP +and sPLT. It was not obvious to me whether this could be formally valid but it +certainly seems pathological at best. + +It also bails out on an sCAL, FRAM, SAVE, nEED, PAST, DISC, DROP, DBYK, ORDR +chunk larger than the 32000-byte read block, but does not claim such a chunk is +invalid. I have added FIXME comments here because these could validly be larger +in practice (some more so than others), so an an input-reading loop is probably +needed, which is fussier to get right and which I have not attempted. + +For the SEEK chunk, it truncates long chunks before printing, similar to the +existing code for the sCAL chunk. This can be misleading, I guess. Maybe there +should be a warning when this happens? + +A base64-encoded corrupt MNG file test case follows, which demonstrates the +problem for the MNG PAST chunk when the -f flag is given. + +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 + +diff -Naur pngcheck-2.4.0-original/pngcheck.c pngcheck-2.4.0/pngcheck.c +--- pngcheck-2.4.0-original/pngcheck.c 2020-11-26 10:23:37.079694656 -0500 ++++ pngcheck-2.4.0/pngcheck.c 2020-11-26 10:26:48.733907440 -0500 +@@ -2293,7 +2293,11 @@ + printf(" hIST chunk"); + printf(": %ld histogram entr%s\n", sz / 2, sz/2 == 1? "y":"ies"); + } +- if (printpal && no_err(kMinorError)) { ++ if (sz > BS) { ++ printf("%s invalid %slength\n", /* or input buffer too small */ ++ verbose? ":":fname, verbose? "":"hIST "); ++ set_err(kMinorError); ++ } else if (printpal && no_err(kMinorError)) { + char *spc; + + if (sz < 10) +@@ -2727,6 +2731,11 @@ + printf("%s invalid %slength\n", + verbose? ":":fname, verbose? "":"sCAL "); + set_err(kMinorError); ++ } else if (sz > BS) { ++ /* FIXME: large sCAL chunks are unusual, but should be supported */ ++ printf("%s checking large %schunk not currently supported\n", ++ verbose? ":":fname, verbose? "":"sCAL "); ++ set_err(kMinorError); + } else if (unittype < 1 || unittype > 2) { + printf("%s invalid %sunit specifier (%d)\n", + verbose? ":":fname, verbose? "":"sCAL ", unittype); +@@ -3348,6 +3357,11 @@ + set_err(kMinorError); + } else if (sz == 0 && verbose) { + printf(": empty\n"); ++ } else if (sz > BS) { ++ /* FIXME: large FRAM chunks are unusual, but should be supported */ ++ printf("%s checking large %schunk not currently supported\n", ++ verbose? ":":fname, verbose? "":"FRAM "); ++ set_err(kMinorError); + } else if (verbose) { + uch fmode = buffer[0]; + +@@ -3459,6 +3473,15 @@ + } else if (have_SAVE) { + printf("%s multiple SAVE not allowed\n", verbose? ":":fname); + set_err(kMinorError); ++ } else if (sz > BS) { ++ printf("%s invalid %slength\n", /* or input buffer too small */ ++ verbose? ":":fname, verbose? "":"FRAM "); ++ set_err(kMinorError); ++ } else if (sz > BS) { ++ /* FIXME: large SAVE chunks should be supported */ ++ printf("%s checking large %schunk not currently supported\n", ++ verbose? ":":fname, verbose? "":"SAVE "); ++ set_err(kMinorError); + } else if (sz > 0 && verbose) { + uch offsize = buffer[0]; + +@@ -3551,6 +3574,9 @@ + } else if (verbose) { + printf("\n"); + if (sz > 0) { ++ if (sz >= BS) ++ sz = BS-1; ++ buffer[sz] = '\0'; + init_printbuf_state(&prbuf_state); + print_buffer(&prbuf_state, buffer, sz, 1); + report_printbuf(&prbuf_state, fname, chunkid); +@@ -3567,6 +3593,9 @@ + printf("%s nEED not defined in %cNG\n", verbose? ":":fname, + png? 'P':'J'); + set_err(kMinorError); ++ } else if (sz > BS && verbose) { ++ /* FIXME: large nEED chunks are unusual, but should be supported */ ++ printf(": printing large chunk not currently supported\n"); + } else if (sz > 0 && verbose) { + uch *p = buffer; + uch *lastbreak = buffer; +@@ -4035,7 +4064,7 @@ + printf("%s PPLT not defined in %cNG\n", verbose? ":":fname, + png? 'P':'J'); + set_err(kMinorError); +- } else if (sz < 4) { ++ } else if (sz < 4 || sz > BS) { + printf("%s invalid %slength\n", + verbose? ":":fname, verbose? "":"PPLT "); + set_err(kMinorError); +@@ -4114,12 +4143,17 @@ + printf("%s invalid %slength\n", + verbose? ":":fname, verbose? "":"PAST "); + set_err(kMajorError); ++ } else if (sz > BS) { ++ /* FIXME: large PAST chunks should be supported */ ++ printf("%s checking large %schunk not currently supported\n", ++ verbose? ":":fname, verbose? "":"PAST "); ++ set_err(kMinorError); + } else if (buffer[2] > 2) { + printf("%s invalid %starget delta type (%u)\n", + verbose? ":":fname, verbose? "":"PAST ", buffer[2]); + set_err(kMinorError); + } +- if (no_err(kMinorError)) { ++ if (no_err(kMinorError) && sz <= BS) { + ush dest_id = SH(buffer); + uch target_dtype = buffer[2]; + long x = LG(buffer+3); +@@ -4247,8 +4281,13 @@ + printf("%s invalid %slength\n", + verbose? ":":fname, verbose? "":"DISC "); + set_err(kMajorError); ++ } else if (sz > BS) { ++ /* FIXME: large DISC chunks should be supported */ ++ printf("%s checking large %schunk not currently supported\n", ++ verbose? ":":fname, verbose? "":"DISC "); ++ set_err(kMinorError); + } +- if (verbose && no_err(kMinorError)) { ++ if (verbose && no_err(kMinorError) && sz <= BS) { + if (sz == 0) { + printf("\n discard all nonzero objects%s\n", + have_SAVE? " except those before SAVE":""); +@@ -4322,8 +4361,13 @@ + printf("%s invalid %slength\n", + verbose? ":":fname, verbose? "":"DROP "); + set_err(kMajorError); ++ } else if (sz > BS) { ++ /* FIXME: large DROP chunks should be supported */ ++ printf("%s checking large %schunk not currently supported\n", ++ verbose? ":":fname, verbose? "":"DROP "); ++ set_err(kMinorError); + } +- if (no_err(kMinorError)) { ++ if (no_err(kMinorError) && sz <= BS) { + uch *buf = buffer; + int bytes_left = sz; + int num_names = 0; +@@ -4372,7 +4416,12 @@ + verbose? ":":fname); + set_err(kMinorError); + } +- if (no_err(kMinorError)) { ++ if (sz > BS) { ++ /* FIXME: large DBYK chunks should be supported */ ++ printf("%s checking large %schunk not currently supported\n", ++ verbose? ":":fname, verbose? "":"DBYK "); ++ set_err(kMinorError); ++ } else if (no_err(kMinorError)) { + uch *buf = buffer + 5; + int bytes_left = sz - 5; + int first = 1; +@@ -4432,7 +4481,12 @@ + verbose? ":":fname, verbose? "":"ORDR "); + set_err(kMajorError); + } +- if (no_err(kMinorError)) { ++ if (sz > BS) { ++ /* FIXME: large ORDR chunks should be supported */ ++ printf("%s checking large %schunk not currently supported\n", ++ verbose? ":":fname, verbose? "":"ORDR "); ++ set_err(kMinorError); ++ } else if (no_err(kMinorError)) { + uch *buf = buffer; + int bytes_left = sz; + diff --git a/pngcheck.spec b/pngcheck.spec index 891a90c..d3b85fa 100644 --- a/pngcheck.spec +++ b/pngcheck.spec @@ -21,11 +21,22 @@ Patch0: %{name}-2.4.0-overflow-bz1897485.patch # Patch sent upstream by email to Greg Roelofs 2020-11-28. Patch1: %{name}-2.4.0-null-dereference-sCAL-no-height.patch # Bounds-check all accesses into enumerated-value name arrays; a malformed file -# could have caused a buffer overrun in several of these cases. -Patch2: pngcheck-2.4.0-bounds-check-enumerated-names.patch +# could have caused a buffer overrun in several of these cases. See: +# https://bugzilla.redhat.com/show_bug.cgi?id=1902810 +# Patch sent upstream by email to Greg Roelofs 2020-11-28. +Patch2: %{name}-2.4.0-bounds-check-enumerated-names.patch # Fix buffer overrun when print_buffer() is passed a nonpositive size, which -# can occur in practice for certain malformed inputs. -Patch3: pngcheck-2.4.0-print_buffer-overrun-nonpositive-size.patch +# can occur in practice for certain malformed inputs. See: +# https://bugzilla.redhat.com/show_bug.cgi?id=1902810 +# Patch sent upstream by email to Greg Roelofs 2020-11-28. +Patch3: %{name}-2.4.0-print_buffer-overrun-nonpositive-size.patch +# In some cases, the chunk length from the file data (sz) is used to index into +# the read buffer without sufficient bounds-checking, leading to a buffer +# overrun. Fix this for PPLT, hIST, sCAL, FRAM, SAVE, nEED, PAST, DISC, DROP, +# DBYK, ORDR, and SEEK chunks. See: +# https://bugzilla.redhat.com/show_bug.cgi?id=1902810 +# Patch sent upstream by email to Greg Roelofs 2020-11-28. +Patch4: %{name}-2.4.0-unchecked-chunk-size.patch BuildRequires: gcc BuildRequires: pkgconfig(zlib)