On 26 October 2016 at 11:26, Yi Zhao <yi.z...@windriver.com> wrote: > CVE-2016-3945 libtiff: Multiple integer overflows in the (1) > cvt_by_strip and (2) cvt_by_tile functions in the tiff2rgba tool in > LibTIFF 4.0.6 and earlier, when -b mode is enabled, allow remote > attackers to cause a denial of service (crash) or execute arbitrary code > via a crafted TIFF image, which triggers an out-of-bounds write. > > External References: > https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-3945 > http://bugzilla.maptools.org/show_bug.cgi?id=2545 > > Patch from: > https://github.com/vadz/libtiff/commit/7c39352ccd9060d311d3dc9a1f1bc0 > 0133a160e6 > > Signed-off-by: Yi Zhao <yi.z...@windriver.com> > --- > .../libtiff/files/CVE-2016-3945.patch | 118 > +++++++++++++++++++++ > meta/recipes-multimedia/libtiff/tiff_4.0.6.bb | 1 + > 2 files changed, 119 insertions(+) > create mode 100644 meta/recipes-multimedia/libtiff/files/CVE-2016-3945. > patch > > diff --git a/meta/recipes-multimedia/libtiff/files/CVE-2016-3945.patch > b/meta/recipes-multimedia/libtiff/files/CVE-2016-3945.patch > new file mode 100644 > index 0000000..4d965be > --- /dev/null > +++ b/meta/recipes-multimedia/libtiff/files/CVE-2016-3945.patch > @@ -0,0 +1,118 @@ > +From 7c39352ccd9060d311d3dc9a1f1bc00133a160e6 Mon Sep 17 00:00:00 2001 > +From: erouault <erouault> > +Date: Mon, 15 Aug 2016 20:06:40 +0000 > +Subject: [PATCH] * tools/tiff2rgba.c: Fix integer overflow in size of > + allocated buffer, when -b mode is enabled, that could result in > out-of-bounds > + write. Based initially on patch tiff-CVE-2016-3945.patch from > + libtiff-4.0.3-25.el7_2.src.rpm by Nikola Forro, with correction for > invalid > + tests that rejected valid files. > + > +CVE: CVE-2016-3945 > +Upstream-Status: Backport > +https://github.com/vadz/libtiff/commit/7c39352ccd9060d311d3dc9a1f1bc0 > 0133a160e6 >
It would be appropriate to point out that this is not the real upstream, just a nameless github user who maintains a git mirror of the libtiff repository. It's probably a reasonable choice -- the current libtiff situation with no real homepage, no real tarball hosting and a half-hidden cvs server for source control is pretty sad -- but should still be openly mentioned. Jussi > + > +Signed-off-by: Yi Zhao <yi.z...@windirver.com> > +--- > + ChangeLog | 8 ++++++++ > + tools/tiff2rgba.c | 34 ++++++++++++++++++++++++++++++---- > + 2 files changed, 38 insertions(+), 4 deletions(-) > + > +diff --git a/ChangeLog b/ChangeLog > +index 62dc1b5..9c0ab29 100644 > +--- a/ChangeLog > ++++ b/ChangeLog > +@@ -1,3 +1,11 @@ > ++2016-08-15 Even Rouault <even.rouault at spatialys.com> > ++ > ++ * tools/tiff2rgba.c: Fix integer overflow in size of allocated > ++ buffer, when -b mode is enabled, that could result in out-of-bounds > ++ write. Based initially on patch tiff-CVE-2016-3945.patch from > ++ libtiff-4.0.3-25.el7_2.src.rpm by Nikola Forro, with correction for > ++ invalid tests that rejected valid files. > ++ > + 2016-07-11 Even Rouault <even.rouault at spatialys.com> > + > + * tools/tiffcrop.c: Avoid access outside of stack allocated array > +diff --git a/tools/tiff2rgba.c b/tools/tiff2rgba.c > +index b7a81eb..16e3dc4 100644 > +--- a/tools/tiff2rgba.c > ++++ b/tools/tiff2rgba.c > +@@ -147,6 +147,7 @@ cvt_by_tile( TIFF *in, TIFF *out ) > + uint32 row, col; > + uint32 *wrk_line; > + int ok = 1; > ++ uint32 rastersize, wrk_linesize; > + > + TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &width); > + TIFFGetField(in, TIFFTAG_IMAGELENGTH, &height); > +@@ -163,7 +164,13 @@ cvt_by_tile( TIFF *in, TIFF *out ) > + /* > + * Allocate tile buffer > + */ > +- raster = (uint32*)_TIFFmalloc(tile_width * tile_height * sizeof > (uint32)); > ++ rastersize = tile_width * tile_height * sizeof (uint32); > ++ if (tile_width != (rastersize / tile_height) / sizeof( uint32)) > ++ { > ++ TIFFError(TIFFFileName(in), "Integer overflow when calculating > raster buffer"); > ++ exit(-1); > ++ } > ++ raster = (uint32*)_TIFFmalloc(rastersize); > + if (raster == 0) { > + TIFFError(TIFFFileName(in), "No space for raster buffer"); > + return (0); > +@@ -173,7 +180,13 @@ cvt_by_tile( TIFF *in, TIFF *out ) > + * Allocate a scanline buffer for swapping during the vertical > + * mirroring pass. > + */ > +- wrk_line = (uint32*)_TIFFmalloc(tile_width * sizeof (uint32)); > ++ wrk_linesize = tile_width * sizeof (uint32); > ++ if (tile_width != wrk_linesize / sizeof (uint32)) > ++ { > ++ TIFFError(TIFFFileName(in), "Integer overflow when calculating > wrk_line buffer"); > ++ exit(-1); > ++ } > ++ wrk_line = (uint32*)_TIFFmalloc(wrk_linesize); > + if (!wrk_line) { > + TIFFError(TIFFFileName(in), "No space for raster scanline > buffer"); > + ok = 0; > +@@ -249,6 +262,7 @@ cvt_by_strip( TIFF *in, TIFF *out ) > + uint32 row; > + uint32 *wrk_line; > + int ok = 1; > ++ uint32 rastersize, wrk_linesize; > + > + TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &width); > + TIFFGetField(in, TIFFTAG_IMAGELENGTH, &height); > +@@ -263,7 +277,13 @@ cvt_by_strip( TIFF *in, TIFF *out ) > + /* > + * Allocate strip buffer > + */ > +- raster = (uint32*)_TIFFmalloc(width * rowsperstrip * sizeof > (uint32)); > ++ rastersize = width * rowsperstrip * sizeof (uint32); > ++ if (width != (rastersize / rowsperstrip) / sizeof( uint32)) > ++ { > ++ TIFFError(TIFFFileName(in), "Integer overflow when calculating > raster buffer"); > ++ exit(-1); > ++ } > ++ raster = (uint32*)_TIFFmalloc(rastersize); > + if (raster == 0) { > + TIFFError(TIFFFileName(in), "No space for raster buffer"); > + return (0); > +@@ -273,7 +293,13 @@ cvt_by_strip( TIFF *in, TIFF *out ) > + * Allocate a scanline buffer for swapping during the vertical > + * mirroring pass. > + */ > +- wrk_line = (uint32*)_TIFFmalloc(width * sizeof (uint32)); > ++ wrk_linesize = width * sizeof (uint32); > ++ if (width != wrk_linesize / sizeof (uint32)) > ++ { > ++ TIFFError(TIFFFileName(in), "Integer overflow when calculating > wrk_line buffer"); > ++ exit(-1); > ++ } > ++ wrk_line = (uint32*)_TIFFmalloc(wrk_linesize); > + if (!wrk_line) { > + TIFFError(TIFFFileName(in), "No space for raster scanline > buffer"); > + ok = 0; > +-- > +2.7.4 > + > diff --git a/meta/recipes-multimedia/libtiff/tiff_4.0.6.bb > b/meta/recipes-multimedia/libtiff/tiff_4.0.6.bb > index 8147bc4..b978528 100644 > --- a/meta/recipes-multimedia/libtiff/tiff_4.0.6.bb > +++ b/meta/recipes-multimedia/libtiff/tiff_4.0.6.bb > @@ -10,6 +10,7 @@ SRC_URI = "http://download.osgeo.org/ > libtiff/tiff-${PV}.tar.gz \ > file://CVE-2016-3186.patch \ > file://CVE-2016-5321.patch \ > file://CVE-2016-5323.patch \ > + file://CVE-2016-3945.patch \ > " > > SRC_URI[md5sum] = "d1d2e940dea0b5ad435f21f03d96dd72" > -- > 2.7.4 > > -- > _______________________________________________ > Openembedded-core mailing list > Openembedded-core@lists.openembedded.org > http://lists.openembedded.org/mailman/listinfo/openembedded-core >
-- _______________________________________________ Openembedded-core mailing list Openembedded-core@lists.openembedded.org http://lists.openembedded.org/mailman/listinfo/openembedded-core