From 4853e522bddbec66022c0915b9a56255d0188bf9 Mon Sep 17 00:00:00 2001 From: Eric Soroos Date: Sat, 2 Jan 2021 16:07:36 +0100 Subject: [PATCH] Fix OOB read in SgiRleDecode.c * From Pillow 4.3.0->8.1.0 * CVE-2021-25293 --- ...5703f71a0f0094873a3e0e82c9f798161171b8.sgi | Bin 0 -> 13703 bytes ...834657ee604b8797bf99eac6a194c124a9a8ba.sgi | Bin 0 -> 12789 bytes ...4d9c7ec485ffb76a90eeaab191ef69a2a3a3cd.sgi | Bin 0 -> 549 bytes ...cf1c97b8fe42a6c68f1fb0b978530c98d57ced.sgi | Bin 0 -> 21017 bytes ...2e64d4f3f76d7465b6af535283029eda211259.sgi | Bin 0 -> 18364 bytes ...b2595b8b0b92cc5f38b6635e98e3a119ade807.sgi | Bin 0 -> 12748 bytes ...8bfa78b19721225425530c5946217720d7df4e.sgi | Bin 0 -> 12744 bytes Tests/test_sgi_crash.py | 7 ++ src/libImaging/SgiRleDecode.c | 91 +++++++++++++++--- 9 files changed, 84 insertions(+), 14 deletions(-) create mode 100644 Tests/images/crash-465703f71a0f0094873a3e0e82c9f798161171b8.sgi create mode 100644 Tests/images/crash-64834657ee604b8797bf99eac6a194c124a9a8ba.sgi create mode 100644 Tests/images/crash-754d9c7ec485ffb76a90eeaab191ef69a2a3a3cd.sgi create mode 100644 Tests/images/crash-abcf1c97b8fe42a6c68f1fb0b978530c98d57ced.sgi create mode 100644 Tests/images/crash-b82e64d4f3f76d7465b6af535283029eda211259.sgi create mode 100644 Tests/images/crash-c1b2595b8b0b92cc5f38b6635e98e3a119ade807.sgi create mode 100644 Tests/images/crash-db8bfa78b19721225425530c5946217720d7df4e.sgi diff --git a/Tests/images/crash-465703f71a0f0094873a3e0e82c9f798161171b8.sgi b/Tests/images/crash-465703f71a0f0094873a3e0e82c9f798161171b8.sgi new file mode 100644 index 0000000000000000000000000000000000000000..81ae1182391fcfe8adfab2bb029cb68e90d95342 GIT binary patch literal 13703 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 literal 0 HcmV?d00001 diff --git a/Tests/images/crash-754d9c7ec485ffb76a90eeaab191ef69a2a3a3cd.sgi b/Tests/images/crash-754d9c7ec485ffb76a90eeaab191ef69a2a3a3cd.sgi new file mode 100644 index 0000000000000000000000000000000000000000..8e093bdfd72c786e508ca80f703f6b35b4f01573 GIT binary patch literal 549 zcmZR)#mLCO%)khQ%nT6lA4=1Q+WCTsJ{Cc2VUl2AV3G!6IUpb8V=!h+2Ks*l1Kgn! J%)}VS005jE1;zjX literal 0 HcmV?d00001 diff --git a/Tests/images/crash-abcf1c97b8fe42a6c68f1fb0b978530c98d57ced.sgi b/Tests/images/crash-abcf1c97b8fe42a6c68f1fb0b978530c98d57ced.sgi new file mode 100644 index 0000000000000000000000000000000000000000..790cb37449eab15d127dedb85a7f67e4b74f0d74 GIT binary patch literal 21017 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 z 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 S^Q3AyOqwhX7k(xzRR0SwB${6U literal 0 HcmV?d00001 diff --git a/Tests/images/crash-db8bfa78b19721225425530c5946217720d7df4e.sgi b/Tests/images/crash-db8bfa78b19721225425530c5946217720d7df4e.sgi new file mode 100644 index 0000000000000000000000000000000000000000..b02aacea9c387eccca911b300cf836a46b11da89 GIT binary patch literal 12744 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 literal 0 HcmV?d00001 diff --git a/Tests/test_sgi_crash.py b/Tests/test_sgi_crash.py index ac304aab4..d4ddc12f9 100644 --- a/Tests/test_sgi_crash.py +++ b/Tests/test_sgi_crash.py @@ -11,6 +11,13 @@ from PIL import Image "Tests/images/sgi_crash.bin", "Tests/images/crash-6b7f2244da6d0ae297ee0754a424213444e92778.sgi", "Tests/images/ossfuzz-5730089102868480.sgi", + "Tests/images/crash-754d9c7ec485ffb76a90eeaab191ef69a2a3a3cd.sgi", + "Tests/images/crash-465703f71a0f0094873a3e0e82c9f798161171b8.sgi", + "Tests/images/crash-64834657ee604b8797bf99eac6a194c124a9a8ba.sgi", + "Tests/images/crash-abcf1c97b8fe42a6c68f1fb0b978530c98d57ced.sgi", + "Tests/images/crash-b82e64d4f3f76d7465b6af535283029eda211259.sgi", + "Tests/images/crash-c1b2595b8b0b92cc5f38b6635e98e3a119ade807.sgi", + "Tests/images/crash-db8bfa78b19721225425530c5946217720d7df4e.sgi", ], ) def test_crashes(test_file): diff --git a/src/libImaging/SgiRleDecode.c b/src/libImaging/SgiRleDecode.c index c19231e02..4eef44ba5 100644 --- a/src/libImaging/SgiRleDecode.c +++ b/src/libImaging/SgiRleDecode.c @@ -25,12 +25,58 @@ read4B(UINT32 *dest, UINT8 *buf) { *dest = (UINT32)((buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]); } +/* + SgiRleDecoding is done in a single channel row oriented set of RLE chunks. + + * The file is arranged as + - SGI Header + - Rle Offset Table + - Rle Length Table + - Scanline Data + + * Each RLE atom is c->bpc bytes wide (1 or 2) + + * Each RLE Chunk is [specifier atom] [ 1 or n data atoms ] + + * Copy Atoms are a byte with the high bit set, and the low 7 are + the number of bytes to copy from the source to the + destination. e.g. + + CBBBBBBBB or 0CHLHLHLHLHLHL (B=byte, H/L = Hi low bytes) + + * Run atoms do not have the high bit set, and the low 7 bits are + the number of copies of the next atom to copy to the + destination. e.g.: + + RB -> BBBBB or RHL -> HLHLHLHLHL + + The upshot of this is, there is no way to determine the required + length of the input buffer from reloffset and rlelength without + going through the data at that scan line. + + Furthermore, there's no requirement that individual scan lines + pointed to from the rleoffset table are in any sort of order or + used only once, or even disjoint. There's also no requirement that + all of the data in the scan line area of the image file be used + + */ static int -expandrow(UINT8 *dest, UINT8 *src, int n, int z, int xsize) { +expandrow(UINT8 *dest, UINT8 *src, int n, int z, int xsize, UINT8 *end_of_buffer) { + /* + * n here is the number of rlechunks + * z is the number of channels, for calculating the interleave + * offset to go to RGBA style pixels + * xsize is the row width + * end_of_buffer is the address of the end of the input buffer + */ + UINT8 pixel, count; int x = 0; for (; n > 0; n--) { + if (src > end_of_buffer) { + return -1; + } pixel = *src++; if (n == 1 && pixel != 0) { return n; @@ -44,12 +90,18 @@ expandrow(UINT8 *dest, UINT8 *src, int n, int z, int xsize) { } x += count; if (pixel & RLE_COPY_FLAG) { + if (src + count > end_of_buffer) { + return -1; + } while (count--) { *dest = *src++; dest += z; } } else { + if (src > end_of_buffer) { + return -1; + } pixel = *src++; while (count--) { *dest = pixel; @@ -61,12 +113,14 @@ expandrow(UINT8 *dest, UINT8 *src, int n, int z, int xsize) { } static int -expandrow2(UINT8 *dest, const UINT8 *src, int n, int z, int xsize) { +expandrow2(UINT8 *dest, const UINT8 *src, int n, int z, int xsize, UINT8 *end_of_buffer) { UINT8 pixel, count; - int x = 0; for (; n > 0; n--) { + if (src + 1 > end_of_buffer) { + return -1; + } pixel = src[1]; src += 2; if (n == 1 && pixel != 0) { @@ -81,12 +135,18 @@ expandrow2(UINT8 *dest, const UINT8 *src, int n, int z, int xsize) { } x += count; if (pixel & RLE_COPY_FLAG) { + if (src + 2 * count > end_of_buffer) { + return -1; + } while (count--) { memcpy(dest, src, 2); src += 2; dest += z * 2; } } else { + if (src + 2 > end_of_buffer) { + return -1; + } while (count--) { memcpy(dest, src, 2); dest += z * 2; @@ -132,7 +192,11 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t return -1; } _imaging_seek_pyFd(state->fd, SGI_HEADER_SIZE, SEEK_SET); - _imaging_read_pyFd(state->fd, (char *)ptr, c->bufsize); + if (_imaging_read_pyFd(state->fd, (char *)ptr, c->bufsize) != c->bufsize) { + state->errcode = IMAGING_CODEC_UNKNOWN; + return -1; + } + /* decoder initialization */ state->count = 0; @@ -166,20 +230,20 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t read4B(&c->lengthtab[c->tabindex], &ptr[c->bufindex]); } - state->count += c->tablen * sizeof(UINT32) * 2; - /* read compressed rows */ for (c->rowno = 0; c->rowno < im->ysize; c->rowno++, state->y += state->ystep) { for (c->channo = 0; c->channo < im->bands; c->channo++) { c->rleoffset = c->starttab[c->rowno + c->channo * im->ysize]; c->rlelength = c->lengthtab[c->rowno + c->channo * im->ysize]; - c->rleoffset -= SGI_HEADER_SIZE; - if (c->rleoffset + c->rlelength > c->bufsize) { + // Check for underflow of rleoffset-SGI_HEADER_SIZE + if (c->rleoffset < SGI_HEADER_SIZE) { state->errcode = IMAGING_CODEC_OVERRUN; goto sgi_finish_decode; } + c->rleoffset -= SGI_HEADER_SIZE; + /* row decompression */ if (c->bpc == 1) { status = expandrow( @@ -187,14 +251,16 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t &ptr[c->rleoffset], c->rlelength, im->bands, - im->xsize); + im->xsize, + &ptr[c->bufsize-1]); } else { status = expandrow2( &state->buffer[c->channo * 2], &ptr[c->rleoffset], c->rlelength, im->bands, - im->xsize); + im->xsize, + &ptr[c->bufsize-1]); } if (status == -1) { state->errcode = IMAGING_CODEC_OVERRUN; @@ -203,15 +269,12 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t goto sgi_finish_decode; } - state->count += c->rlelength; } /* store decompressed data in image */ state->shuffle((UINT8 *)im->image[state->y], state->buffer, im->xsize); } - c->bufsize++; - sgi_finish_decode:; free(c->starttab); @@ -221,5 +284,5 @@ sgi_finish_decode:; state->errcode = err; return -1; } - return state->count - c->bufsize; + return 0; }