Package: release.debian.org
Severity: normal
Tags: buster
User: release.debian....@packages.debian.org
Usertags: pu

Hi,

libsdl2-image is currently affected by the following security issues:

* CVE-2019-5052: integer overflow and subsequent buffer overflow in
  IMG_pcx.c.

* CVE-2019-5051: heap-based buffer overflow in IMG_pcx.c.

* CVE-2019-7635: heap buffer overflow in Blit1to4 (IMG_bmp.c).

* CVE-2019-12216, CVE-2019-12217,
  CVE-2019-12218, CVE-2019-12219,
  CVE-2019-12220, CVE-2019-12221,
  CVE-2019-12222: OOB R/W in IMG_LoadPCX_RW (IMG_pcx.c).

(for more information, see #932754)

Attached is a debdiff addressing all of them for buster.

All of these patches are from upstream, I have removed whitespace changes
and non security related refactoring.

thanks!

cheers,
Hugo

-- 
                Hugo Lefeuvre (hle)    |    www.owl.eu.com
RSA4096_ 360B 03B3 BF27 4F4D 7A3F D5E8 14AA 1EB8 A247 3DFD
ed25519_ 37B2 6D38 0B25 B8A2 6B9F 3A65 A36F 5357 5F2D DC4C
diff -Nru libsdl2-image-2.0.4+dfsg1/debian/changelog libsdl2-image-2.0.4+dfsg1/debian/changelog
--- libsdl2-image-2.0.4+dfsg1/debian/changelog	2019-02-03 08:59:26.000000000 -0200
+++ libsdl2-image-2.0.4+dfsg1/debian/changelog	2019-07-26 17:01:14.000000000 -0300
@@ -1,3 +1,17 @@
+libsdl2-image (2.0.4+dfsg1-1+deb10u1) buster; urgency=medium
+
+  * Non-maintainer upload.
+  * Multiple security issues (Closes: #932754):
+    - CVE-2019-5052: integer overflow and subsequent buffer overflow in
+      IMG_pcx.c.
+    - CVE-2019-7635: heap buffer overflow in Blit1to4 (IMG_bmp.c).
+    - CVE-2019-12216, CVE-2019-12217,
+      CVE-2019-12218, CVE-2019-12219,
+      CVE-2019-12220, CVE-2019-12221,
+      CVE-2019-12222, CVE-2019-5051: OOB R/W in IMG_LoadPCX_RW (IMG_pcx.c).
+
+ -- Hugo Lefeuvre <h...@debian.org>  Fri, 26 Jul 2019 17:01:14 -0300
+
 libsdl2-image (2.0.4+dfsg1-1) unstable; urgency=medium
 
   * New upstream version.
diff -Nru libsdl2-image-2.0.4+dfsg1/debian/patches/CVE-2019-12218.patch libsdl2-image-2.0.4+dfsg1/debian/patches/CVE-2019-12218.patch
--- libsdl2-image-2.0.4+dfsg1/debian/patches/CVE-2019-12218.patch	1969-12-31 21:00:00.000000000 -0300
+++ libsdl2-image-2.0.4+dfsg1/debian/patches/CVE-2019-12218.patch	2019-07-26 17:01:14.000000000 -0300
@@ -0,0 +1,84 @@
+Description: fix heap buffer overflow issue in IMG_pcx.c
+ Issue known as TALOS-2019-0841, CVE-2019-12218.
+Author: Sam Lantinga <slou...@libsdl.org>
+Origin: upstream, https://hg.libsdl.org/SDL_image/rev/7453e79c8cdb
+--- a/IMG_pcx.c	2019-07-26 17:35:40.331470589 -0300
++++ b/IMG_pcx.c	2019-07-26 17:48:45.760965290 -0300
+@@ -98,6 +98,8 @@
+     Uint8 *row, *buf = NULL;
+     char *error = NULL;
+     int bits, src_bits;
++    int count = 0;
++    Uint8 ch;
+ 
+     if ( !src ) {
+         /* The error message has been set in SDL_RWFromFile */
+@@ -146,14 +148,14 @@
+     bpl = pcxh.NPlanes * pcxh.BytesPerLine;
+     if (bpl > surface->pitch) {
+         error = "bytes per line is too large (corrupt?)";
++        goto done;
+     }
+-    buf = (Uint8 *)SDL_calloc(SDL_max(bpl, surface->pitch), 1);
++    buf = (Uint8 *)SDL_calloc(surface->pitch, 1);
+     row = (Uint8 *)surface->pixels;
+     for ( y=0; y<surface->h; ++y ) {
+         /* decode a scan line to a temporary buffer first */
+-        int i, count = 0;
+-        Uint8 ch;
+-        Uint8 *dst = (src_bits == 8) ? row : buf;
++        int i;
++        Uint8 *dst = buf;
+         if ( pcxh.Encoding == 0 ) {
+             if(!SDL_RWread(src, dst, bpl, 1)) {
+                 error = "file truncated";
+@@ -166,14 +168,15 @@
+                         error = "file truncated";
+                         goto done;
+                     }
+-                    if( (ch & 0xc0) == 0xc0) {
+-                        count = ch & 0x3f;
+-                        if(!SDL_RWread(src, &ch, 1, 1)) {
++                    if ( ch < 0xc0 ) {
++                        count = 1;
++                    } else {
++                        count = ch - 0xc0;
++                        if( !SDL_RWread(src, &ch, 1, 1)) {
+                             error = "file truncated";
+                             goto done;
+                         }
+-                    } else
+-                        count = 1;
++                    }
+                 }
+                 dst[i] = ch;
+                 count--;
+@@ -205,10 +208,16 @@
+                 int x;
+                 dst = row + plane;
+                 for(x = 0; x < width; x++) {
++                    if ( dst >= row+surface->pitch ) {
++                        error = "decoding out of bounds (corrupt?)";
++                        goto done;
++                    }
+                     *dst = *innerSrc++;
+                     dst += pcxh.NPlanes;
+                 }
+             }
++        } else {
++            SDL_memcpy(row, buf, bpl);
+         }
+ 
+         row += surface->pitch;
+@@ -225,8 +234,9 @@
+             /* look for a 256-colour palette */
+             do {
+                 if ( !SDL_RWread(src, &ch, 1, 1)) {
+-                    error = "file truncated";
+-                    goto done;
++                    /* Couldn't find the palette, try the end of the file */
++                    SDL_RWseek(src, -768, RW_SEEK_END);
++                    break;
+                 }
+             } while ( ch != 12 );
+ 
diff -Nru libsdl2-image-2.0.4+dfsg1/debian/patches/CVE-2019-5052.patch libsdl2-image-2.0.4+dfsg1/debian/patches/CVE-2019-5052.patch
--- libsdl2-image-2.0.4+dfsg1/debian/patches/CVE-2019-5052.patch	1969-12-31 21:00:00.000000000 -0300
+++ libsdl2-image-2.0.4+dfsg1/debian/patches/CVE-2019-5052.patch	2019-07-26 17:01:14.000000000 -0300
@@ -0,0 +1,15 @@
+Description: fix invalid data read on bpl == -1
+ Issue known as TALOS-2019-0821, or CVE-2019-5052.
+Author: Sam Lantinga <slou...@libsdl.org>
+Origin: upstream, https://hg.libsdl.org/SDL_image/rev/b920be2b3fc6
+--- a/IMG_pcx.c	2019-07-26 17:49:10.472114286 -0300
++++ b/IMG_pcx.c	2019-07-26 17:50:15.053906715 -0300
+@@ -146,7 +146,7 @@
+         goto done;
+ 
+     bpl = pcxh.NPlanes * pcxh.BytesPerLine;
+-    if (bpl > surface->pitch) {
++    if (bpl < 0 || bpl > surface->pitch) {
+         error = "bytes per line is too large (corrupt?)";
+         goto done;
+     }
diff -Nru libsdl2-image-2.0.4+dfsg1/debian/patches/CVE-2019-7635.patch libsdl2-image-2.0.4+dfsg1/debian/patches/CVE-2019-7635.patch
--- libsdl2-image-2.0.4+dfsg1/debian/patches/CVE-2019-7635.patch	1969-12-31 21:00:00.000000000 -0300
+++ libsdl2-image-2.0.4+dfsg1/debian/patches/CVE-2019-7635.patch	2019-07-26 17:01:14.000000000 -0300
@@ -0,0 +1,59 @@
+Subject: fix Heap-Buffer Overflow in Blit1to4 (IMG_bmp.c)
+Author: Sam Lantinga <slou...@libsdl.org>
+Origin: upstream, https://hg.libsdl.org/SDL_image/rev/03bd33e8cb49
+--- a/IMG_bmp.c	2019-07-26 18:31:09.387643105 -0300
++++ b/IMG_bmp.c	2019-07-26 18:31:21.875151518 -0300
+@@ -371,6 +371,14 @@
+             ExpandBMP = biBitCount;
+             biBitCount = 8;
+             break;
++        case 2:
++        case 3:
++        case 5:
++        case 6:
++        case 7:
++            SDL_SetError("%d-bpp BMP images are not supported", biBitCount);
++            was_error = SDL_TRUE;
++            goto done;
+         default:
+             ExpandBMP = 0;
+             break;
+@@ -511,13 +519,19 @@
+                 if ( i%(8/ExpandBMP) == 0 ) {
+                     if ( !SDL_RWread(src, &pixel, 1, 1) ) {
+                         IMG_SetError("Error reading from BMP");
++                            was_error = SDL_TRUE;
++                            goto done;
++                        }
++                    }
++                    bits[i] = (pixel >> shift);
++                    if (bits[i] >= biClrUsed) {
++                        IMG_SetError("A BMP image contains a pixel with a color out of the palette");
+                         was_error = SDL_TRUE;
+                         goto done;
+                     }
++                    pixel <<= ExpandBMP;
+                 }
+-                *(bits+i) = (pixel>>shift);
+-                pixel <<= ExpandBMP;
+-            } }
++            }
+             break;
+ 
+             default:
+@@ -526,6 +540,15 @@
+                 was_error = SDL_TRUE;
+                 goto done;
+             }
++            if (biBitCount == 8 && palette && biClrUsed < (1 << biBitCount)) {
++                for (i = 0; i < surface->w; ++i) {
++                    if (bits[i] >= biClrUsed) {
++                        SDL_SetError("A BMP image contains a pixel with a color out of the palette");
++                        was_error = SDL_TRUE;
++                        goto done;
++                    }
++                }
++            }
+ #if SDL_BYTEORDER == SDL_BIG_ENDIAN
+             /* Byte-swap the pixels if needed. Note that the 24bpp
+                case has already been taken care of above. */
diff -Nru libsdl2-image-2.0.4+dfsg1/debian/patches/IMG_pcx-out-of-bounds.patch libsdl2-image-2.0.4+dfsg1/debian/patches/IMG_pcx-out-of-bounds.patch
--- libsdl2-image-2.0.4+dfsg1/debian/patches/IMG_pcx-out-of-bounds.patch	1969-12-31 21:00:00.000000000 -0300
+++ libsdl2-image-2.0.4+dfsg1/debian/patches/IMG_pcx-out-of-bounds.patch	2019-07-26 17:01:14.000000000 -0300
@@ -0,0 +1,71 @@
+Description: fix multiple OOB issues in IMG_pcx.c
+ This patches addresses following issues: CVE-2019-12222, CVE-2019-12221,
+ CVE-2019-12220, CVE-2019-12219 and CVE-2019-12217.
+Author: Sam Lantinga <slou...@libsdl.org>, Hugo Lefeuvre <h...@debian.org>
+Origin: upstream, https://hg.libsdl.org/SDL_image/rev/e7e9786a1a34
+--- a/IMG_pcx.c	2019-07-26 18:04:15.542455425 -0300
++++ b/IMG_pcx.c	2019-07-26 18:04:54.585211727 -0300
+@@ -146,18 +146,17 @@
+         goto done;
+ 
+     bpl = pcxh.NPlanes * pcxh.BytesPerLine;
+-    if (bpl < 0 || bpl > surface->pitch) {
+-        error = "bytes per line is too large (corrupt?)";
++    buf = (Uint8 *)SDL_calloc(bpl, 1);
++    if ( !buf ) {
++        error = "Out of memory";
+         goto done;
+     }
+-    buf = (Uint8 *)SDL_calloc(surface->pitch, 1);
+     row = (Uint8 *)surface->pixels;
+     for ( y=0; y<surface->h; ++y ) {
+         /* decode a scan line to a temporary buffer first */
+         int i;
+-        Uint8 *dst = buf;
+         if ( pcxh.Encoding == 0 ) {
+-            if(!SDL_RWread(src, dst, bpl, 1)) {
++            if(!SDL_RWread(src, buf, bpl, 1)) {
+                 error = "file truncated";
+                 goto done;
+             }
+@@ -178,7 +177,7 @@
+                         }
+                     }
+                 }
+-                dst[i] = ch;
++                buf[i] = ch;
+                 count--;
+             }
+         }
+@@ -200,13 +199,21 @@
+                     }
+                 }
+             }
++        } else if ( src_bits == 8 ) {
++            /* directly copy buf content to row */
++            Uint8 *innerSrc = buf;
++            int x;
++            Uint8 *dst = row;
++            for ( x = 0; x < width; x++ ) {
++                *dst++ = *innerSrc++;
++            }
+         } else if(src_bits == 24) {
+             /* de-interlace planes */
+             Uint8 *innerSrc = buf;
+             int plane;
+             for(plane = 0; plane < pcxh.NPlanes; plane++) {
+                 int x;
+-                dst = row + plane;
++                Uint8 *dst = row + plane;
+                 for(x = 0; x < width; x++) {
+                     if ( dst >= row+surface->pitch ) {
+                         error = "decoding out of bounds (corrupt?)";
+@@ -216,8 +223,6 @@
+                     dst += pcxh.NPlanes;
+                 }
+             }
+-        } else {
+-            SDL_memcpy(row, buf, bpl);
+         }
+ 
+         row += surface->pitch;
diff -Nru libsdl2-image-2.0.4+dfsg1/debian/patches/series libsdl2-image-2.0.4+dfsg1/debian/patches/series
--- libsdl2-image-2.0.4+dfsg1/debian/patches/series	1969-12-31 21:00:00.000000000 -0300
+++ libsdl2-image-2.0.4+dfsg1/debian/patches/series	2019-07-26 16:59:47.000000000 -0300
@@ -0,0 +1,4 @@
+CVE-2019-12218.patch
+CVE-2019-5052.patch
+IMG_pcx-out-of-bounds.patch
+CVE-2019-7635.patch

Attachment: signature.asc
Description: PGP signature

Reply via email to