Openembedded Core Discussions
 help / color / mirror / Atom feed
* [PATCH] unzip: fix four CVE defects
@ 2015-06-23  5:32 rongqing.li
  2015-06-23 22:41 ` akuster808
  0 siblings, 1 reply; 3+ messages in thread
From: rongqing.li @ 2015-06-23  5:32 UTC (permalink / raw)
  To: openembedded-core

From: Roy Li <rongqing.li@windriver.com>

Port four patches from unzip_6.0-8+deb7u2.debian.tar.gz to fix:
     cve-2014-8139
     cve-2014-8140
     cve-2014-8141
     cve-2014-9636

Signed-off-by: Roy Li <rongqing.li@windriver.com>
---
 .../unzip/09-cve-2014-8139-crc-overflow.patch      |  52 ++++++++
 .../unzip/10-cve-2014-8140-test-compr-eb.patch     |  33 +++++
 .../unzip/11-cve-2014-8141-getzip64data.patch      | 144 +++++++++++++++++++++
 .../unzip/12-cve-2014-9636-test-compr-eb.patch     |  45 +++++++
 meta/recipes-extended/unzip/unzip_6.0.bb           |   4 +
 5 files changed, 278 insertions(+)
 create mode 100644 meta/recipes-extended/unzip/unzip/09-cve-2014-8139-crc-overflow.patch
 create mode 100644 meta/recipes-extended/unzip/unzip/10-cve-2014-8140-test-compr-eb.patch
 create mode 100644 meta/recipes-extended/unzip/unzip/11-cve-2014-8141-getzip64data.patch
 create mode 100644 meta/recipes-extended/unzip/unzip/12-cve-2014-9636-test-compr-eb.patch

diff --git a/meta/recipes-extended/unzip/unzip/09-cve-2014-8139-crc-overflow.patch b/meta/recipes-extended/unzip/unzip/09-cve-2014-8139-crc-overflow.patch
new file mode 100644
index 0000000..e137f0d
--- /dev/null
+++ b/meta/recipes-extended/unzip/unzip/09-cve-2014-8139-crc-overflow.patch
@@ -0,0 +1,52 @@
+From: sms
+Subject: Fix CVE-2014-8139: CRC32 verification heap-based overflow
+Bug-Debian: http://bugs.debian.org/773722
+
+The patch comes from unzip_6.0-8+deb7u2.debian.tar.gz
+
+Upstream-Status: Backport
+
+Signed-off-by: Roy Li <rongqing.li@windriver.com>
+
+--- a/extract.c
++++ b/extract.c
+@@ -298,6 +298,8 @@
+ #ifndef SFX
+    static ZCONST char Far InconsistEFlength[] = "bad extra-field entry:\n \
+      EF block length (%u bytes) exceeds remaining EF data (%u bytes)\n";
++   static ZCONST char Far TooSmallEBlength[] = "bad extra-field entry:\n \
++     EF block length (%u bytes) invalid (< %d)\n";
+    static ZCONST char Far InvalidComprDataEAs[] =
+      " invalid compressed data for EAs\n";
+ #  if (defined(WIN32) && defined(NTSD_EAS))
+@@ -2023,7 +2025,8 @@
+         ebID = makeword(ef);
+         ebLen = (unsigned)makeword(ef+EB_LEN);
+ 
+-        if (ebLen > (ef_len - EB_HEADSIZE)) {
++        if (ebLen > (ef_len - EB_HEADSIZE))
++        {
+            /* Discovered some extra field inconsistency! */
+             if (uO.qflag)
+                 Info(slide, 1, ((char *)slide, "%-22s ",
+@@ -2158,11 +2161,19 @@
+                 }
+                 break;
+             case EF_PKVMS:
+-                if (makelong(ef+EB_HEADSIZE) !=
++                if (ebLen < 4)
++                {
++                    Info(slide, 1,
++                     ((char *)slide, LoadFarString(TooSmallEBlength),
++                     ebLen, 4));
++                }
++                else if (makelong(ef+EB_HEADSIZE) !=
+                     crc32(CRCVAL_INITIAL, ef+(EB_HEADSIZE+4),
+                           (extent)(ebLen-4)))
++                {
+                     Info(slide, 1, ((char *)slide,
+                       LoadFarString(BadCRC_EAs)));
++                }
+                 break;
+             case EF_PKW32:
+             case EF_PKUNIX:
diff --git a/meta/recipes-extended/unzip/unzip/10-cve-2014-8140-test-compr-eb.patch b/meta/recipes-extended/unzip/unzip/10-cve-2014-8140-test-compr-eb.patch
new file mode 100644
index 0000000..edc7d51
--- /dev/null
+++ b/meta/recipes-extended/unzip/unzip/10-cve-2014-8140-test-compr-eb.patch
@@ -0,0 +1,33 @@
+From: sms
+Subject: Fix CVE-2014-8140: out-of-bounds write issue in test_compr_eb()
+Bug-Debian: http://bugs.debian.org/773722
+
+The patch comes from unzip_6.0-8+deb7u2.debian.tar.gz
+
+Upstream-Status: Backport
+
+Signed-off-by: Roy Li <rongqing.li@windriver.com>
+
+--- a/extract.c
++++ b/extract.c
+@@ -2232,10 +2232,17 @@
+     if (compr_offset < 4)                /* field is not compressed: */
+         return PK_OK;                    /* do nothing and signal OK */
+ 
++    /* Return no/bad-data error status if any problem is found:
++     *    1. eb_size is too small to hold the uncompressed size
++     *       (eb_ucsize).  (Else extract eb_ucsize.)
++     *    2. eb_ucsize is zero (invalid).  2014-12-04 SMS.
++     *    3. eb_ucsize is positive, but eb_size is too small to hold
++     *       the compressed data header.
++     */
+     if ((eb_size < (EB_UCSIZE_P + 4)) ||
+-        ((eb_ucsize = makelong(eb+(EB_HEADSIZE+EB_UCSIZE_P))) > 0L &&
+-         eb_size <= (compr_offset + EB_CMPRHEADLEN)))
+-        return IZ_EF_TRUNC;               /* no compressed data! */
++     ((eb_ucsize = makelong( eb+ (EB_HEADSIZE+ EB_UCSIZE_P))) == 0L) ||
++     ((eb_ucsize > 0L) && (eb_size <= (compr_offset + EB_CMPRHEADLEN))))
++        return IZ_EF_TRUNC;             /* no/bad compressed data! */
+ 
+     if (
+ #ifdef INT_16BIT
diff --git a/meta/recipes-extended/unzip/unzip/11-cve-2014-8141-getzip64data.patch b/meta/recipes-extended/unzip/unzip/11-cve-2014-8141-getzip64data.patch
new file mode 100644
index 0000000..d0c1db3
--- /dev/null
+++ b/meta/recipes-extended/unzip/unzip/11-cve-2014-8141-getzip64data.patch
@@ -0,0 +1,144 @@
+From: sms
+Subject: Fix CVE-2014-8141: out-of-bounds read issues in getZip64Data()
+Bug-Debian: http://bugs.debian.org/773722
+
+The patch comes from unzip_6.0-8+deb7u2.debian.tar.gz
+
+Upstream-Status: Backport
+
+Signed-off-by: Roy Li <rongqing.li@windriver.com>
+
+
+--- a/fileio.c
++++ b/fileio.c
+@@ -176,6 +176,8 @@
+ #endif
+ static ZCONST char Far ExtraFieldTooLong[] =
+   "warning:  extra field too long (%d).  Ignoring...\n";
++static ZCONST char Far ExtraFieldCorrupt[] =
++  "warning:  extra field (type: 0x%04x) corrupt.  Continuing...\n";
+ 
+ #ifdef WINDLL
+    static ZCONST char Far DiskFullQuery[] =
+@@ -2295,7 +2297,12 @@
+             if (readbuf(__G__ (char *)G.extra_field, length) == 0)
+                 return PK_EOF;
+             /* Looks like here is where extra fields are read */
+-            getZip64Data(__G__ G.extra_field, length);
++            if (getZip64Data(__G__ G.extra_field, length) != PK_COOL)
++            {
++                Info(slide, 0x401, ((char *)slide,
++                 LoadFarString( ExtraFieldCorrupt), EF_PKSZ64));
++                error = PK_WARN;
++            }
+ #ifdef UNICODE_SUPPORT
+             G.unipath_filename = NULL;
+             if (G.UzO.U_flag < 2) {
+--- a/process.c
++++ b/process.c
+@@ -1,5 +1,5 @@
+ /*
+-  Copyright (c) 1990-2009 Info-ZIP.  All rights reserved.
++  Copyright (c) 1990-2014 Info-ZIP.  All rights reserved.
+ 
+   See the accompanying file LICENSE, version 2009-Jan-02 or later
+   (the contents of which are also included in unzip.h) for terms of use.
+@@ -1901,48 +1901,82 @@
+     and a 4-byte version of disk start number.
+     Sets both local header and central header fields.  Not terribly clever,
+     but it means that this procedure is only called in one place.
++
++    2014-12-05 SMS.
++    Added checks to ensure that enough data are available before calling
++    makeint64() or makelong().  Replaced various sizeof() values with
++    simple ("4" or "8") constants.  (The Zip64 structures do not depend
++    on our variable sizes.)  Error handling is crude, but we should now
++    stay within the buffer.
+   ---------------------------------------------------------------------------*/
+ 
++#define Z64FLGS 0xffff
++#define Z64FLGL 0xffffffff
++
+     if (ef_len == 0 || ef_buf == NULL)
+         return PK_COOL;
+ 
+     Trace((stderr,"\ngetZip64Data: scanning extra field of length %u\n",
+       ef_len));
+ 
+-    while (ef_len >= EB_HEADSIZE) {
++    while (ef_len >= EB_HEADSIZE)
++    {
+         eb_id = makeword(EB_ID + ef_buf);
+         eb_len = makeword(EB_LEN + ef_buf);
+ 
+-        if (eb_len > (ef_len - EB_HEADSIZE)) {
+-            /* discovered some extra field inconsistency! */
++        if (eb_len > (ef_len - EB_HEADSIZE))
++        {
++            /* Extra block length exceeds remaining extra field length. */
+             Trace((stderr,
+               "getZip64Data: block length %u > rest ef_size %u\n", eb_len,
+               ef_len - EB_HEADSIZE));
+             break;
+         }
+-        if (eb_id == EF_PKSZ64) {
+-
++        if (eb_id == EF_PKSZ64)
++        {
+           int offset = EB_HEADSIZE;
+ 
+-          if (G.crec.ucsize == 0xffffffff || G.lrec.ucsize == 0xffffffff){
+-            G.lrec.ucsize = G.crec.ucsize = makeint64(offset + ef_buf);
+-            offset += sizeof(G.crec.ucsize);
++          if ((G.crec.ucsize == Z64FLGL) || (G.lrec.ucsize == Z64FLGL))
++          {
++            if (offset+ 8 > ef_len)
++              return PK_ERR;
++
++            G.crec.ucsize = G.lrec.ucsize = makeint64(offset + ef_buf);
++            offset += 8;
+           }
+-          if (G.crec.csize == 0xffffffff || G.lrec.csize == 0xffffffff){
+-            G.csize = G.lrec.csize = G.crec.csize = makeint64(offset + ef_buf);
+-            offset += sizeof(G.crec.csize);
++
++          if ((G.crec.csize == Z64FLGL) || (G.lrec.csize == Z64FLGL))
++          {
++            if (offset+ 8 > ef_len)
++              return PK_ERR;
++
++            G.csize = G.crec.csize = G.lrec.csize = makeint64(offset + ef_buf);
++            offset += 8;
+           }
+-          if (G.crec.relative_offset_local_header == 0xffffffff){
++
++          if (G.crec.relative_offset_local_header == Z64FLGL)
++          {
++            if (offset+ 8 > ef_len)
++              return PK_ERR;
++
+             G.crec.relative_offset_local_header = makeint64(offset + ef_buf);
+-            offset += sizeof(G.crec.relative_offset_local_header);
++            offset += 8;
+           }
+-          if (G.crec.disk_number_start == 0xffff){
++
++          if (G.crec.disk_number_start == Z64FLGS)
++          {
++            if (offset+ 4 > ef_len)
++              return PK_ERR;
++
+             G.crec.disk_number_start = (zuvl_t)makelong(offset + ef_buf);
+-            offset += sizeof(G.crec.disk_number_start);
++            offset += 4;
+           }
++#if 0
++          break;                /* Expect only one EF_PKSZ64 block. */
++#endif /* 0 */
+         }
+ 
+-        /* Skip this extra field block */
++        /* Skip this extra field block. */
+         ef_buf += (eb_len + EB_HEADSIZE);
+         ef_len -= (eb_len + EB_HEADSIZE);
+     }
diff --git a/meta/recipes-extended/unzip/unzip/12-cve-2014-9636-test-compr-eb.patch b/meta/recipes-extended/unzip/unzip/12-cve-2014-9636-test-compr-eb.patch
new file mode 100644
index 0000000..b64dd99
--- /dev/null
+++ b/meta/recipes-extended/unzip/unzip/12-cve-2014-9636-test-compr-eb.patch
@@ -0,0 +1,45 @@
+From: mancha <mancha1 AT zoho DOT com>
+Date: Mon, 3 Nov 2014
+Subject: Info-ZIP UnZip buffer overflow
+Bug-Debian: http://bugs.debian.org/776589
+
+By carefully crafting a corrupt ZIP archive with "extra fields" that
+purport to have compressed blocks larger than the corresponding
+uncompressed blocks in STORED no-compression mode, an attacker can
+trigger a heap overflow that can result in application crash or
+possibly have other unspecified impact.
+
+This patch ensures that when extra fields use STORED mode, the
+"compressed" and uncompressed block sizes match.
+
+The patch comes from unzip_6.0-8+deb7u2.debian.tar.gz
+
+Upstream-Status: Backport
+
+Signed-off-by: Roy Li <rongqing.li@windriver.com>
+
+--- a/extract.c
++++ b/extract.c
+@@ -2229,6 +2229,7 @@ static int test_compr_eb(__G__ eb, eb_size, compr_offset, test_uc_ebdata)
+     uch *eb_ucptr;
+     int r;
+     ush method;
++    ush eb_compr_method;
+ 
+     if (compr_offset < 4)                /* field is not compressed: */
+         return PK_OK;                    /* do nothing and signal OK */
+@@ -2244,6 +2245,14 @@
+      ((eb_ucsize > 0L) && (eb_size <= (compr_offset + EB_CMPRHEADLEN))))
+         return IZ_EF_TRUNC;             /* no/bad compressed data! */
+ 
++    /* 2014-11-03 Michal Zalewski, SMS.
++     * For STORE method, compressed and uncompressed sizes must agree.
++     * http://www.info-zip.org/phpBB3/viewtopic.php?f=7&t=450
++     */
++    eb_compr_method = makeword( eb + (EB_HEADSIZE + compr_offset));
++    if ((eb_compr_method == STORED) && (eb_size - compr_offset != eb_ucsize))
++        return PK_ERR;
++
+     if (
+ #ifdef INT_16BIT
+         (((ulg)(extent)eb_ucsize) != eb_ucsize) ||
diff --git a/meta/recipes-extended/unzip/unzip_6.0.bb b/meta/recipes-extended/unzip/unzip_6.0.bb
index 5060d35..b022f21 100644
--- a/meta/recipes-extended/unzip/unzip_6.0.bb
+++ b/meta/recipes-extended/unzip/unzip_6.0.bb
@@ -11,6 +11,10 @@ SRC_URI = "ftp://ftp.info-zip.org/pub/infozip/src/unzip60.tgz \
 	file://define-ldflags.patch \
 	file://06-unzip60-alt-iconv-utf8_CVE-2015-1315.patch \
 	file://unzip-6.0_overflow3.diff \
+	file://09-cve-2014-8139-crc-overflow.patch \
+	file://10-cve-2014-8140-test-compr-eb.patch \
+	file://11-cve-2014-8141-getzip64data.patch \
+	file://12-cve-2014-9636-test-compr-eb.patch \
 "
 
 SRC_URI[md5sum] = "62b490407489521db863b523a7f86375"
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] unzip: fix four CVE defects
  2015-06-23  5:32 [PATCH] unzip: fix four CVE defects rongqing.li
@ 2015-06-23 22:41 ` akuster808
  2015-06-24  0:46   ` Rongqing Li
  0 siblings, 1 reply; 3+ messages in thread
From: akuster808 @ 2015-06-23 22:41 UTC (permalink / raw)
  To: rongqing.li, openembedded-core

CVE-2014-9636 is also mentioned in commit

c9ec5427609f084d9cbfb7336777fe1e3d0f3ef1
unzip: Security Advisory -CVE-2014-9636 and CVE-2015-1315

can you clarify why its on both places?

- armin

On 06/22/2015 10:32 PM, rongqing.li@windriver.com wrote:
> From: Roy Li <rongqing.li@windriver.com>
>
> Port four patches from unzip_6.0-8+deb7u2.debian.tar.gz to fix:
>       cve-2014-8139
>       cve-2014-8140
>       cve-2014-8141
>       cve-2014-9636
>
> Signed-off-by: Roy Li <rongqing.li@windriver.com>
> ---
>   .../unzip/09-cve-2014-8139-crc-overflow.patch      |  52 ++++++++
>   .../unzip/10-cve-2014-8140-test-compr-eb.patch     |  33 +++++
>   .../unzip/11-cve-2014-8141-getzip64data.patch      | 144 +++++++++++++++++++++
>   .../unzip/12-cve-2014-9636-test-compr-eb.patch     |  45 +++++++
>   meta/recipes-extended/unzip/unzip_6.0.bb           |   4 +
>   5 files changed, 278 insertions(+)
>   create mode 100644 meta/recipes-extended/unzip/unzip/09-cve-2014-8139-crc-overflow.patch
>   create mode 100644 meta/recipes-extended/unzip/unzip/10-cve-2014-8140-test-compr-eb.patch
>   create mode 100644 meta/recipes-extended/unzip/unzip/11-cve-2014-8141-getzip64data.patch
>   create mode 100644 meta/recipes-extended/unzip/unzip/12-cve-2014-9636-test-compr-eb.patch
>
> diff --git a/meta/recipes-extended/unzip/unzip/09-cve-2014-8139-crc-overflow.patch b/meta/recipes-extended/unzip/unzip/09-cve-2014-8139-crc-overflow.patch
> new file mode 100644
> index 0000000..e137f0d
> --- /dev/null
> +++ b/meta/recipes-extended/unzip/unzip/09-cve-2014-8139-crc-overflow.patch
> @@ -0,0 +1,52 @@
> +From: sms
> +Subject: Fix CVE-2014-8139: CRC32 verification heap-based overflow
> +Bug-Debian: http://bugs.debian.org/773722
> +
> +The patch comes from unzip_6.0-8+deb7u2.debian.tar.gz
> +
> +Upstream-Status: Backport
> +
> +Signed-off-by: Roy Li <rongqing.li@windriver.com>
> +
> +--- a/extract.c
> ++++ b/extract.c
> +@@ -298,6 +298,8 @@
> + #ifndef SFX
> +    static ZCONST char Far InconsistEFlength[] = "bad extra-field entry:\n \
> +      EF block length (%u bytes) exceeds remaining EF data (%u bytes)\n";
> ++   static ZCONST char Far TooSmallEBlength[] = "bad extra-field entry:\n \
> ++     EF block length (%u bytes) invalid (< %d)\n";
> +    static ZCONST char Far InvalidComprDataEAs[] =
> +      " invalid compressed data for EAs\n";
> + #  if (defined(WIN32) && defined(NTSD_EAS))
> +@@ -2023,7 +2025,8 @@
> +         ebID = makeword(ef);
> +         ebLen = (unsigned)makeword(ef+EB_LEN);
> +
> +-        if (ebLen > (ef_len - EB_HEADSIZE)) {
> ++        if (ebLen > (ef_len - EB_HEADSIZE))
> ++        {
> +            /* Discovered some extra field inconsistency! */
> +             if (uO.qflag)
> +                 Info(slide, 1, ((char *)slide, "%-22s ",
> +@@ -2158,11 +2161,19 @@
> +                 }
> +                 break;
> +             case EF_PKVMS:
> +-                if (makelong(ef+EB_HEADSIZE) !=
> ++                if (ebLen < 4)
> ++                {
> ++                    Info(slide, 1,
> ++                     ((char *)slide, LoadFarString(TooSmallEBlength),
> ++                     ebLen, 4));
> ++                }
> ++                else if (makelong(ef+EB_HEADSIZE) !=
> +                     crc32(CRCVAL_INITIAL, ef+(EB_HEADSIZE+4),
> +                           (extent)(ebLen-4)))
> ++                {
> +                     Info(slide, 1, ((char *)slide,
> +                       LoadFarString(BadCRC_EAs)));
> ++                }
> +                 break;
> +             case EF_PKW32:
> +             case EF_PKUNIX:
> diff --git a/meta/recipes-extended/unzip/unzip/10-cve-2014-8140-test-compr-eb.patch b/meta/recipes-extended/unzip/unzip/10-cve-2014-8140-test-compr-eb.patch
> new file mode 100644
> index 0000000..edc7d51
> --- /dev/null
> +++ b/meta/recipes-extended/unzip/unzip/10-cve-2014-8140-test-compr-eb.patch
> @@ -0,0 +1,33 @@
> +From: sms
> +Subject: Fix CVE-2014-8140: out-of-bounds write issue in test_compr_eb()
> +Bug-Debian: http://bugs.debian.org/773722
> +
> +The patch comes from unzip_6.0-8+deb7u2.debian.tar.gz
> +
> +Upstream-Status: Backport
> +
> +Signed-off-by: Roy Li <rongqing.li@windriver.com>
> +
> +--- a/extract.c
> ++++ b/extract.c
> +@@ -2232,10 +2232,17 @@
> +     if (compr_offset < 4)                /* field is not compressed: */
> +         return PK_OK;                    /* do nothing and signal OK */
> +
> ++    /* Return no/bad-data error status if any problem is found:
> ++     *    1. eb_size is too small to hold the uncompressed size
> ++     *       (eb_ucsize).  (Else extract eb_ucsize.)
> ++     *    2. eb_ucsize is zero (invalid).  2014-12-04 SMS.
> ++     *    3. eb_ucsize is positive, but eb_size is too small to hold
> ++     *       the compressed data header.
> ++     */
> +     if ((eb_size < (EB_UCSIZE_P + 4)) ||
> +-        ((eb_ucsize = makelong(eb+(EB_HEADSIZE+EB_UCSIZE_P))) > 0L &&
> +-         eb_size <= (compr_offset + EB_CMPRHEADLEN)))
> +-        return IZ_EF_TRUNC;               /* no compressed data! */
> ++     ((eb_ucsize = makelong( eb+ (EB_HEADSIZE+ EB_UCSIZE_P))) == 0L) ||
> ++     ((eb_ucsize > 0L) && (eb_size <= (compr_offset + EB_CMPRHEADLEN))))
> ++        return IZ_EF_TRUNC;             /* no/bad compressed data! */
> +
> +     if (
> + #ifdef INT_16BIT
> diff --git a/meta/recipes-extended/unzip/unzip/11-cve-2014-8141-getzip64data.patch b/meta/recipes-extended/unzip/unzip/11-cve-2014-8141-getzip64data.patch
> new file mode 100644
> index 0000000..d0c1db3
> --- /dev/null
> +++ b/meta/recipes-extended/unzip/unzip/11-cve-2014-8141-getzip64data.patch
> @@ -0,0 +1,144 @@
> +From: sms
> +Subject: Fix CVE-2014-8141: out-of-bounds read issues in getZip64Data()
> +Bug-Debian: http://bugs.debian.org/773722
> +
> +The patch comes from unzip_6.0-8+deb7u2.debian.tar.gz
> +
> +Upstream-Status: Backport
> +
> +Signed-off-by: Roy Li <rongqing.li@windriver.com>
> +
> +
> +--- a/fileio.c
> ++++ b/fileio.c
> +@@ -176,6 +176,8 @@
> + #endif
> + static ZCONST char Far ExtraFieldTooLong[] =
> +   "warning:  extra field too long (%d).  Ignoring...\n";
> ++static ZCONST char Far ExtraFieldCorrupt[] =
> ++  "warning:  extra field (type: 0x%04x) corrupt.  Continuing...\n";
> +
> + #ifdef WINDLL
> +    static ZCONST char Far DiskFullQuery[] =
> +@@ -2295,7 +2297,12 @@
> +             if (readbuf(__G__ (char *)G.extra_field, length) == 0)
> +                 return PK_EOF;
> +             /* Looks like here is where extra fields are read */
> +-            getZip64Data(__G__ G.extra_field, length);
> ++            if (getZip64Data(__G__ G.extra_field, length) != PK_COOL)
> ++            {
> ++                Info(slide, 0x401, ((char *)slide,
> ++                 LoadFarString( ExtraFieldCorrupt), EF_PKSZ64));
> ++                error = PK_WARN;
> ++            }
> + #ifdef UNICODE_SUPPORT
> +             G.unipath_filename = NULL;
> +             if (G.UzO.U_flag < 2) {
> +--- a/process.c
> ++++ b/process.c
> +@@ -1,5 +1,5 @@
> + /*
> +-  Copyright (c) 1990-2009 Info-ZIP.  All rights reserved.
> ++  Copyright (c) 1990-2014 Info-ZIP.  All rights reserved.
> +
> +   See the accompanying file LICENSE, version 2009-Jan-02 or later
> +   (the contents of which are also included in unzip.h) for terms of use.
> +@@ -1901,48 +1901,82 @@
> +     and a 4-byte version of disk start number.
> +     Sets both local header and central header fields.  Not terribly clever,
> +     but it means that this procedure is only called in one place.
> ++
> ++    2014-12-05 SMS.
> ++    Added checks to ensure that enough data are available before calling
> ++    makeint64() or makelong().  Replaced various sizeof() values with
> ++    simple ("4" or "8") constants.  (The Zip64 structures do not depend
> ++    on our variable sizes.)  Error handling is crude, but we should now
> ++    stay within the buffer.
> +   ---------------------------------------------------------------------------*/
> +
> ++#define Z64FLGS 0xffff
> ++#define Z64FLGL 0xffffffff
> ++
> +     if (ef_len == 0 || ef_buf == NULL)
> +         return PK_COOL;
> +
> +     Trace((stderr,"\ngetZip64Data: scanning extra field of length %u\n",
> +       ef_len));
> +
> +-    while (ef_len >= EB_HEADSIZE) {
> ++    while (ef_len >= EB_HEADSIZE)
> ++    {
> +         eb_id = makeword(EB_ID + ef_buf);
> +         eb_len = makeword(EB_LEN + ef_buf);
> +
> +-        if (eb_len > (ef_len - EB_HEADSIZE)) {
> +-            /* discovered some extra field inconsistency! */
> ++        if (eb_len > (ef_len - EB_HEADSIZE))
> ++        {
> ++            /* Extra block length exceeds remaining extra field length. */
> +             Trace((stderr,
> +               "getZip64Data: block length %u > rest ef_size %u\n", eb_len,
> +               ef_len - EB_HEADSIZE));
> +             break;
> +         }
> +-        if (eb_id == EF_PKSZ64) {
> +-
> ++        if (eb_id == EF_PKSZ64)
> ++        {
> +           int offset = EB_HEADSIZE;
> +
> +-          if (G.crec.ucsize == 0xffffffff || G.lrec.ucsize == 0xffffffff){
> +-            G.lrec.ucsize = G.crec.ucsize = makeint64(offset + ef_buf);
> +-            offset += sizeof(G.crec.ucsize);
> ++          if ((G.crec.ucsize == Z64FLGL) || (G.lrec.ucsize == Z64FLGL))
> ++          {
> ++            if (offset+ 8 > ef_len)
> ++              return PK_ERR;
> ++
> ++            G.crec.ucsize = G.lrec.ucsize = makeint64(offset + ef_buf);
> ++            offset += 8;
> +           }
> +-          if (G.crec.csize == 0xffffffff || G.lrec.csize == 0xffffffff){
> +-            G.csize = G.lrec.csize = G.crec.csize = makeint64(offset + ef_buf);
> +-            offset += sizeof(G.crec.csize);
> ++
> ++          if ((G.crec.csize == Z64FLGL) || (G.lrec.csize == Z64FLGL))
> ++          {
> ++            if (offset+ 8 > ef_len)
> ++              return PK_ERR;
> ++
> ++            G.csize = G.crec.csize = G.lrec.csize = makeint64(offset + ef_buf);
> ++            offset += 8;
> +           }
> +-          if (G.crec.relative_offset_local_header == 0xffffffff){
> ++
> ++          if (G.crec.relative_offset_local_header == Z64FLGL)
> ++          {
> ++            if (offset+ 8 > ef_len)
> ++              return PK_ERR;
> ++
> +             G.crec.relative_offset_local_header = makeint64(offset + ef_buf);
> +-            offset += sizeof(G.crec.relative_offset_local_header);
> ++            offset += 8;
> +           }
> +-          if (G.crec.disk_number_start == 0xffff){
> ++
> ++          if (G.crec.disk_number_start == Z64FLGS)
> ++          {
> ++            if (offset+ 4 > ef_len)
> ++              return PK_ERR;
> ++
> +             G.crec.disk_number_start = (zuvl_t)makelong(offset + ef_buf);
> +-            offset += sizeof(G.crec.disk_number_start);
> ++            offset += 4;
> +           }
> ++#if 0
> ++          break;                /* Expect only one EF_PKSZ64 block. */
> ++#endif /* 0 */
> +         }
> +
> +-        /* Skip this extra field block */
> ++        /* Skip this extra field block. */
> +         ef_buf += (eb_len + EB_HEADSIZE);
> +         ef_len -= (eb_len + EB_HEADSIZE);
> +     }
> diff --git a/meta/recipes-extended/unzip/unzip/12-cve-2014-9636-test-compr-eb.patch b/meta/recipes-extended/unzip/unzip/12-cve-2014-9636-test-compr-eb.patch
> new file mode 100644
> index 0000000..b64dd99
> --- /dev/null
> +++ b/meta/recipes-extended/unzip/unzip/12-cve-2014-9636-test-compr-eb.patch
> @@ -0,0 +1,45 @@
> +From: mancha <mancha1 AT zoho DOT com>
> +Date: Mon, 3 Nov 2014
> +Subject: Info-ZIP UnZip buffer overflow
> +Bug-Debian: http://bugs.debian.org/776589
> +
> +By carefully crafting a corrupt ZIP archive with "extra fields" that
> +purport to have compressed blocks larger than the corresponding
> +uncompressed blocks in STORED no-compression mode, an attacker can
> +trigger a heap overflow that can result in application crash or
> +possibly have other unspecified impact.
> +
> +This patch ensures that when extra fields use STORED mode, the
> +"compressed" and uncompressed block sizes match.
> +
> +The patch comes from unzip_6.0-8+deb7u2.debian.tar.gz
> +
> +Upstream-Status: Backport
> +
> +Signed-off-by: Roy Li <rongqing.li@windriver.com>
> +
> +--- a/extract.c
> ++++ b/extract.c
> +@@ -2229,6 +2229,7 @@ static int test_compr_eb(__G__ eb, eb_size, compr_offset, test_uc_ebdata)
> +     uch *eb_ucptr;
> +     int r;
> +     ush method;
> ++    ush eb_compr_method;
> +
> +     if (compr_offset < 4)                /* field is not compressed: */
> +         return PK_OK;                    /* do nothing and signal OK */
> +@@ -2244,6 +2245,14 @@
> +      ((eb_ucsize > 0L) && (eb_size <= (compr_offset + EB_CMPRHEADLEN))))
> +         return IZ_EF_TRUNC;             /* no/bad compressed data! */
> +
> ++    /* 2014-11-03 Michal Zalewski, SMS.
> ++     * For STORE method, compressed and uncompressed sizes must agree.
> ++     * http://www.info-zip.org/phpBB3/viewtopic.php?f=7&t=450
> ++     */
> ++    eb_compr_method = makeword( eb + (EB_HEADSIZE + compr_offset));
> ++    if ((eb_compr_method == STORED) && (eb_size - compr_offset != eb_ucsize))
> ++        return PK_ERR;
> ++
> +     if (
> + #ifdef INT_16BIT
> +         (((ulg)(extent)eb_ucsize) != eb_ucsize) ||
> diff --git a/meta/recipes-extended/unzip/unzip_6.0.bb b/meta/recipes-extended/unzip/unzip_6.0.bb
> index 5060d35..b022f21 100644
> --- a/meta/recipes-extended/unzip/unzip_6.0.bb
> +++ b/meta/recipes-extended/unzip/unzip_6.0.bb
> @@ -11,6 +11,10 @@ SRC_URI = "ftp://ftp.info-zip.org/pub/infozip/src/unzip60.tgz \
>   	file://define-ldflags.patch \
>   	file://06-unzip60-alt-iconv-utf8_CVE-2015-1315.patch \
>   	file://unzip-6.0_overflow3.diff \
> +	file://09-cve-2014-8139-crc-overflow.patch \
> +	file://10-cve-2014-8140-test-compr-eb.patch \
> +	file://11-cve-2014-8141-getzip64data.patch \
> +	file://12-cve-2014-9636-test-compr-eb.patch \
>   "
>
>   SRC_URI[md5sum] = "62b490407489521db863b523a7f86375"
>


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] unzip: fix four CVE defects
  2015-06-23 22:41 ` akuster808
@ 2015-06-24  0:46   ` Rongqing Li
  0 siblings, 0 replies; 3+ messages in thread
From: Rongqing Li @ 2015-06-24  0:46 UTC (permalink / raw)
  To: akuster808, openembedded-core



On 2015年06月24日 06:41, akuster808 wrote:
> CVE-2014-9636 is also mentioned in commit
>
> c9ec5427609f084d9cbfb7336777fe1e3d0f3ef1
> unzip: Security Advisory -CVE-2014-9636 and CVE-2015-1315
>
> can you clarify why its on both places?
>

sorry, it is duplicated, but I did not know why it can
be applied, I will resend it

thanks

-R

> - armin
>
> On 06/22/2015 10:32 PM, rongqing.li@windriver.com wrote:
>> From: Roy Li <rongqing.li@windriver.com>
>>
>> Port four patches from unzip_6.0-8+deb7u2.debian.tar.gz to fix:
>>       cve-2014-8139
>>       cve-2014-8140
>>       cve-2014-8141
>>       cve-2014-9636
>>
>> Signed-off-by: Roy Li <rongqing.li@windriver.com>
>> ---
>>   .../unzip/09-cve-2014-8139-crc-overflow.patch      |  52 ++++++++
>>   .../unzip/10-cve-2014-8140-test-compr-eb.patch     |  33 +++++
>>   .../unzip/11-cve-2014-8141-getzip64data.patch      | 144
>> +++++++++++++++++++++
>>   .../unzip/12-cve-2014-9636-test-compr-eb.patch     |  45 +++++++
>>   meta/recipes-extended/unzip/unzip_6.0.bb           |   4 +
>>   5 files changed, 278 insertions(+)
>>   create mode 100644
>> meta/recipes-extended/unzip/unzip/09-cve-2014-8139-crc-overflow.patch
>>   create mode 100644
>> meta/recipes-extended/unzip/unzip/10-cve-2014-8140-test-compr-eb.patch
>>   create mode 100644
>> meta/recipes-extended/unzip/unzip/11-cve-2014-8141-getzip64data.patch
>>   create mode 100644
>> meta/recipes-extended/unzip/unzip/12-cve-2014-9636-test-compr-eb.patch
>>
>> diff --git
>> a/meta/recipes-extended/unzip/unzip/09-cve-2014-8139-crc-overflow.patch b/meta/recipes-extended/unzip/unzip/09-cve-2014-8139-crc-overflow.patch
>>
>> new file mode 100644
>> index 0000000..e137f0d
>> --- /dev/null
>> +++
>> b/meta/recipes-extended/unzip/unzip/09-cve-2014-8139-crc-overflow.patch
>> @@ -0,0 +1,52 @@
>> +From: sms
>> +Subject: Fix CVE-2014-8139: CRC32 verification heap-based overflow
>> +Bug-Debian: http://bugs.debian.org/773722
>> +
>> +The patch comes from unzip_6.0-8+deb7u2.debian.tar.gz
>> +
>> +Upstream-Status: Backport
>> +
>> +Signed-off-by: Roy Li <rongqing.li@windriver.com>
>> +
>> +--- a/extract.c
>> ++++ b/extract.c
>> +@@ -298,6 +298,8 @@
>> + #ifndef SFX
>> +    static ZCONST char Far InconsistEFlength[] = "bad extra-field
>> entry:\n \
>> +      EF block length (%u bytes) exceeds remaining EF data (%u
>> bytes)\n";
>> ++   static ZCONST char Far TooSmallEBlength[] = "bad extra-field
>> entry:\n \
>> ++     EF block length (%u bytes) invalid (< %d)\n";
>> +    static ZCONST char Far InvalidComprDataEAs[] =
>> +      " invalid compressed data for EAs\n";
>> + #  if (defined(WIN32) && defined(NTSD_EAS))
>> +@@ -2023,7 +2025,8 @@
>> +         ebID = makeword(ef);
>> +         ebLen = (unsigned)makeword(ef+EB_LEN);
>> +
>> +-        if (ebLen > (ef_len - EB_HEADSIZE)) {
>> ++        if (ebLen > (ef_len - EB_HEADSIZE))
>> ++        {
>> +            /* Discovered some extra field inconsistency! */
>> +             if (uO.qflag)
>> +                 Info(slide, 1, ((char *)slide, "%-22s ",
>> +@@ -2158,11 +2161,19 @@
>> +                 }
>> +                 break;
>> +             case EF_PKVMS:
>> +-                if (makelong(ef+EB_HEADSIZE) !=
>> ++                if (ebLen < 4)
>> ++                {
>> ++                    Info(slide, 1,
>> ++                     ((char *)slide, LoadFarString(TooSmallEBlength),
>> ++                     ebLen, 4));
>> ++                }
>> ++                else if (makelong(ef+EB_HEADSIZE) !=
>> +                     crc32(CRCVAL_INITIAL, ef+(EB_HEADSIZE+4),
>> +                           (extent)(ebLen-4)))
>> ++                {
>> +                     Info(slide, 1, ((char *)slide,
>> +                       LoadFarString(BadCRC_EAs)));
>> ++                }
>> +                 break;
>> +             case EF_PKW32:
>> +             case EF_PKUNIX:
>> diff --git
>> a/meta/recipes-extended/unzip/unzip/10-cve-2014-8140-test-compr-eb.patch
>> b/meta/recipes-extended/unzip/unzip/10-cve-2014-8140-test-compr-eb.patch
>> new file mode 100644
>> index 0000000..edc7d51
>> --- /dev/null
>> +++
>> b/meta/recipes-extended/unzip/unzip/10-cve-2014-8140-test-compr-eb.patch
>> @@ -0,0 +1,33 @@
>> +From: sms
>> +Subject: Fix CVE-2014-8140: out-of-bounds write issue in test_compr_eb()
>> +Bug-Debian: http://bugs.debian.org/773722
>> +
>> +The patch comes from unzip_6.0-8+deb7u2.debian.tar.gz
>> +
>> +Upstream-Status: Backport
>> +
>> +Signed-off-by: Roy Li <rongqing.li@windriver.com>
>> +
>> +--- a/extract.c
>> ++++ b/extract.c
>> +@@ -2232,10 +2232,17 @@
>> +     if (compr_offset < 4)                /* field is not compressed: */
>> +         return PK_OK;                    /* do nothing and signal OK */
>> +
>> ++    /* Return no/bad-data error status if any problem is found:
>> ++     *    1. eb_size is too small to hold the uncompressed size
>> ++     *       (eb_ucsize).  (Else extract eb_ucsize.)
>> ++     *    2. eb_ucsize is zero (invalid).  2014-12-04 SMS.
>> ++     *    3. eb_ucsize is positive, but eb_size is too small to hold
>> ++     *       the compressed data header.
>> ++     */
>> +     if ((eb_size < (EB_UCSIZE_P + 4)) ||
>> +-        ((eb_ucsize = makelong(eb+(EB_HEADSIZE+EB_UCSIZE_P))) > 0L &&
>> +-         eb_size <= (compr_offset + EB_CMPRHEADLEN)))
>> +-        return IZ_EF_TRUNC;               /* no compressed data! */
>> ++     ((eb_ucsize = makelong( eb+ (EB_HEADSIZE+ EB_UCSIZE_P))) == 0L) ||
>> ++     ((eb_ucsize > 0L) && (eb_size <= (compr_offset +
>> EB_CMPRHEADLEN))))
>> ++        return IZ_EF_TRUNC;             /* no/bad compressed data! */
>> +
>> +     if (
>> + #ifdef INT_16BIT
>> diff --git
>> a/meta/recipes-extended/unzip/unzip/11-cve-2014-8141-getzip64data.patch b/meta/recipes-extended/unzip/unzip/11-cve-2014-8141-getzip64data.patch
>>
>> new file mode 100644
>> index 0000000..d0c1db3
>> --- /dev/null
>> +++
>> b/meta/recipes-extended/unzip/unzip/11-cve-2014-8141-getzip64data.patch
>> @@ -0,0 +1,144 @@
>> +From: sms
>> +Subject: Fix CVE-2014-8141: out-of-bounds read issues in getZip64Data()
>> +Bug-Debian: http://bugs.debian.org/773722
>> +
>> +The patch comes from unzip_6.0-8+deb7u2.debian.tar.gz
>> +
>> +Upstream-Status: Backport
>> +
>> +Signed-off-by: Roy Li <rongqing.li@windriver.com>
>> +
>> +
>> +--- a/fileio.c
>> ++++ b/fileio.c
>> +@@ -176,6 +176,8 @@
>> + #endif
>> + static ZCONST char Far ExtraFieldTooLong[] =
>> +   "warning:  extra field too long (%d).  Ignoring...\n";
>> ++static ZCONST char Far ExtraFieldCorrupt[] =
>> ++  "warning:  extra field (type: 0x%04x) corrupt.  Continuing...\n";
>> +
>> + #ifdef WINDLL
>> +    static ZCONST char Far DiskFullQuery[] =
>> +@@ -2295,7 +2297,12 @@
>> +             if (readbuf(__G__ (char *)G.extra_field, length) == 0)
>> +                 return PK_EOF;
>> +             /* Looks like here is where extra fields are read */
>> +-            getZip64Data(__G__ G.extra_field, length);
>> ++            if (getZip64Data(__G__ G.extra_field, length) != PK_COOL)
>> ++            {
>> ++                Info(slide, 0x401, ((char *)slide,
>> ++                 LoadFarString( ExtraFieldCorrupt), EF_PKSZ64));
>> ++                error = PK_WARN;
>> ++            }
>> + #ifdef UNICODE_SUPPORT
>> +             G.unipath_filename = NULL;
>> +             if (G.UzO.U_flag < 2) {
>> +--- a/process.c
>> ++++ b/process.c
>> +@@ -1,5 +1,5 @@
>> + /*
>> +-  Copyright (c) 1990-2009 Info-ZIP.  All rights reserved.
>> ++  Copyright (c) 1990-2014 Info-ZIP.  All rights reserved.
>> +
>> +   See the accompanying file LICENSE, version 2009-Jan-02 or later
>> +   (the contents of which are also included in unzip.h) for terms of
>> use.
>> +@@ -1901,48 +1901,82 @@
>> +     and a 4-byte version of disk start number.
>> +     Sets both local header and central header fields.  Not terribly
>> clever,
>> +     but it means that this procedure is only called in one place.
>> ++
>> ++    2014-12-05 SMS.
>> ++    Added checks to ensure that enough data are available before
>> calling
>> ++    makeint64() or makelong().  Replaced various sizeof() values with
>> ++    simple ("4" or "8") constants.  (The Zip64 structures do not depend
>> ++    on our variable sizes.)  Error handling is crude, but we should now
>> ++    stay within the buffer.
>> +
>> ---------------------------------------------------------------------------*/
>>
>> +
>> ++#define Z64FLGS 0xffff
>> ++#define Z64FLGL 0xffffffff
>> ++
>> +     if (ef_len == 0 || ef_buf == NULL)
>> +         return PK_COOL;
>> +
>> +     Trace((stderr,"\ngetZip64Data: scanning extra field of length
>> %u\n",
>> +       ef_len));
>> +
>> +-    while (ef_len >= EB_HEADSIZE) {
>> ++    while (ef_len >= EB_HEADSIZE)
>> ++    {
>> +         eb_id = makeword(EB_ID + ef_buf);
>> +         eb_len = makeword(EB_LEN + ef_buf);
>> +
>> +-        if (eb_len > (ef_len - EB_HEADSIZE)) {
>> +-            /* discovered some extra field inconsistency! */
>> ++        if (eb_len > (ef_len - EB_HEADSIZE))
>> ++        {
>> ++            /* Extra block length exceeds remaining extra field
>> length. */
>> +             Trace((stderr,
>> +               "getZip64Data: block length %u > rest ef_size %u\n",
>> eb_len,
>> +               ef_len - EB_HEADSIZE));
>> +             break;
>> +         }
>> +-        if (eb_id == EF_PKSZ64) {
>> +-
>> ++        if (eb_id == EF_PKSZ64)
>> ++        {
>> +           int offset = EB_HEADSIZE;
>> +
>> +-          if (G.crec.ucsize == 0xffffffff || G.lrec.ucsize ==
>> 0xffffffff){
>> +-            G.lrec.ucsize = G.crec.ucsize = makeint64(offset + ef_buf);
>> +-            offset += sizeof(G.crec.ucsize);
>> ++          if ((G.crec.ucsize == Z64FLGL) || (G.lrec.ucsize == Z64FLGL))
>> ++          {
>> ++            if (offset+ 8 > ef_len)
>> ++              return PK_ERR;
>> ++
>> ++            G.crec.ucsize = G.lrec.ucsize = makeint64(offset + ef_buf);
>> ++            offset += 8;
>> +           }
>> +-          if (G.crec.csize == 0xffffffff || G.lrec.csize ==
>> 0xffffffff){
>> +-            G.csize = G.lrec.csize = G.crec.csize = makeint64(offset
>> + ef_buf);
>> +-            offset += sizeof(G.crec.csize);
>> ++
>> ++          if ((G.crec.csize == Z64FLGL) || (G.lrec.csize == Z64FLGL))
>> ++          {
>> ++            if (offset+ 8 > ef_len)
>> ++              return PK_ERR;
>> ++
>> ++            G.csize = G.crec.csize = G.lrec.csize = makeint64(offset
>> + ef_buf);
>> ++            offset += 8;
>> +           }
>> +-          if (G.crec.relative_offset_local_header == 0xffffffff){
>> ++
>> ++          if (G.crec.relative_offset_local_header == Z64FLGL)
>> ++          {
>> ++            if (offset+ 8 > ef_len)
>> ++              return PK_ERR;
>> ++
>> +             G.crec.relative_offset_local_header = makeint64(offset +
>> ef_buf);
>> +-            offset += sizeof(G.crec.relative_offset_local_header);
>> ++            offset += 8;
>> +           }
>> +-          if (G.crec.disk_number_start == 0xffff){
>> ++
>> ++          if (G.crec.disk_number_start == Z64FLGS)
>> ++          {
>> ++            if (offset+ 4 > ef_len)
>> ++              return PK_ERR;
>> ++
>> +             G.crec.disk_number_start = (zuvl_t)makelong(offset +
>> ef_buf);
>> +-            offset += sizeof(G.crec.disk_number_start);
>> ++            offset += 4;
>> +           }
>> ++#if 0
>> ++          break;                /* Expect only one EF_PKSZ64 block. */
>> ++#endif /* 0 */
>> +         }
>> +
>> +-        /* Skip this extra field block */
>> ++        /* Skip this extra field block. */
>> +         ef_buf += (eb_len + EB_HEADSIZE);
>> +         ef_len -= (eb_len + EB_HEADSIZE);
>> +     }
>> diff --git
>> a/meta/recipes-extended/unzip/unzip/12-cve-2014-9636-test-compr-eb.patch
>> b/meta/recipes-extended/unzip/unzip/12-cve-2014-9636-test-compr-eb.patch
>> new file mode 100644
>> index 0000000..b64dd99
>> --- /dev/null
>> +++
>> b/meta/recipes-extended/unzip/unzip/12-cve-2014-9636-test-compr-eb.patch
>> @@ -0,0 +1,45 @@
>> +From: mancha <mancha1 AT zoho DOT com>
>> +Date: Mon, 3 Nov 2014
>> +Subject: Info-ZIP UnZip buffer overflow
>> +Bug-Debian: http://bugs.debian.org/776589
>> +
>> +By carefully crafting a corrupt ZIP archive with "extra fields" that
>> +purport to have compressed blocks larger than the corresponding
>> +uncompressed blocks in STORED no-compression mode, an attacker can
>> +trigger a heap overflow that can result in application crash or
>> +possibly have other unspecified impact.
>> +
>> +This patch ensures that when extra fields use STORED mode, the
>> +"compressed" and uncompressed block sizes match.
>> +
>> +The patch comes from unzip_6.0-8+deb7u2.debian.tar.gz
>> +
>> +Upstream-Status: Backport
>> +
>> +Signed-off-by: Roy Li <rongqing.li@windriver.com>
>> +
>> +--- a/extract.c
>> ++++ b/extract.c
>> +@@ -2229,6 +2229,7 @@ static int test_compr_eb(__G__ eb, eb_size,
>> compr_offset, test_uc_ebdata)
>> +     uch *eb_ucptr;
>> +     int r;
>> +     ush method;
>> ++    ush eb_compr_method;
>> +
>> +     if (compr_offset < 4)                /* field is not compressed: */
>> +         return PK_OK;                    /* do nothing and signal OK */
>> +@@ -2244,6 +2245,14 @@
>> +      ((eb_ucsize > 0L) && (eb_size <= (compr_offset +
>> EB_CMPRHEADLEN))))
>> +         return IZ_EF_TRUNC;             /* no/bad compressed data! */
>> +
>> ++    /* 2014-11-03 Michal Zalewski, SMS.
>> ++     * For STORE method, compressed and uncompressed sizes must agree.
>> ++     * http://www.info-zip.org/phpBB3/viewtopic.php?f=7&t=450
>> ++     */
>> ++    eb_compr_method = makeword( eb + (EB_HEADSIZE + compr_offset));
>> ++    if ((eb_compr_method == STORED) && (eb_size - compr_offset !=
>> eb_ucsize))
>> ++        return PK_ERR;
>> ++
>> +     if (
>> + #ifdef INT_16BIT
>> +         (((ulg)(extent)eb_ucsize) != eb_ucsize) ||
>> diff --git a/meta/recipes-extended/unzip/unzip_6.0.bb
>> b/meta/recipes-extended/unzip/unzip_6.0.bb
>> index 5060d35..b022f21 100644
>> --- a/meta/recipes-extended/unzip/unzip_6.0.bb
>> +++ b/meta/recipes-extended/unzip/unzip_6.0.bb
>> @@ -11,6 +11,10 @@ SRC_URI =
>> "ftp://ftp.info-zip.org/pub/infozip/src/unzip60.tgz \
>>       file://define-ldflags.patch \
>>       file://06-unzip60-alt-iconv-utf8_CVE-2015-1315.patch \
>>       file://unzip-6.0_overflow3.diff \
>> +    file://09-cve-2014-8139-crc-overflow.patch \
>> +    file://10-cve-2014-8140-test-compr-eb.patch \
>> +    file://11-cve-2014-8141-getzip64data.patch \
>> +    file://12-cve-2014-9636-test-compr-eb.patch \
>>   "
>>
>>   SRC_URI[md5sum] = "62b490407489521db863b523a7f86375"
>>
>
>

-- 
Best Reagrds,
Roy | RongQing Li


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2015-06-24  0:46 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-06-23  5:32 [PATCH] unzip: fix four CVE defects rongqing.li
2015-06-23 22:41 ` akuster808
2015-06-24  0:46   ` Rongqing Li

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox