Alexander Bluhm <alexander.bl...@gmx.net> writes:

> Hi,
>
> There are a bunch of CVE and other fixes for unzip in debian and
> redhat bug tracker.  I added the links to the patch files.  The fix
> for CVE-2014-9636 got an update, so we have a diff onto of a diff.
>
> Unfortunately unzip did its last release in 2009 and they do not
> offer patches on their web site.
>
> ok?

Does this:

  "Fix: restore uid and gid information when requested"

mean that the pledge calls should also list "chown"?

Maybe this should be put in a bulk build, for extra safety?

> bluhm
>
> Index: archivers/unzip/Makefile
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/ports/archivers/unzip/Makefile,v
> retrieving revision 1.59
> diff -u -p -r1.59 Makefile
> --- archivers/unzip/Makefile  13 Sep 2016 11:44:06 -0000      1.59
> +++ archivers/unzip/Makefile  21 Mar 2017 15:24:39 -0000
> @@ -7,7 +7,7 @@ COMMENT =     extract, list & test files in 
>  VERSION =    6.0
>  DISTNAME =   unzip${VERSION:S/.//}
>  PKGNAME =    unzip-${VERSION}
> -REVISION =   9
> +REVISION =   10
>  CATEGORIES = archivers
>  MASTER_SITES =       ${MASTER_SITE_SOURCEFORGE:=infozip/} \
>               ftp://ftp.info-zip.org/pub/infozip/src/
> Index: archivers/unzip/patches/patch-crypt_c
> ===================================================================
> RCS file: archivers/unzip/patches/patch-crypt_c
> diff -N archivers/unzip/patches/patch-crypt_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ archivers/unzip/patches/patch-crypt_c     21 Mar 2017 16:24:58 -0000
> @@ -0,0 +1,28 @@
> +$OpenBSD$
> +
> +Fix CVE-2015-7696: upstream fix for heap overflow
> +    https://bugs.debian.org/802162
> +    https://bugzilla.redhat.com/show_bug.cgi?id=1260944
> +    https://bugzilla.redhat.com/attachment.cgi?id=1073002
> +
> +--- crypt.c.orig     Fri Jan  5 16:47:36 2007
> ++++ crypt.c  Tue Mar 21 16:10:27 2017
> +@@ -465,7 +465,17 @@ int decrypt(__G__ passwrd)
> +     GLOBAL(pInfo->encrypted) = FALSE;
> +     defer_leftover_input(__G);
> +     for (n = 0; n < RAND_HEAD_LEN; n++) {
> +-        b = NEXTBYTE;
> ++        /* 2012-11-23 SMS.  (OUSPG report.)
> ++         * Quit early if compressed size < HEAD_LEN.  The resulting
> ++         * error message ("unable to get password") could be improved,
> ++         * but it's better than trying to read nonexistent data, and
> ++         * then continuing with a negative G.csize.  (See
> ++         * fileio.c:readbyte()).
> ++         */
> ++        if ((b = NEXTBYTE) == (ush)EOF)
> ++        {
> ++            return PK_ERR;
> ++        }
> +         h[n] = (uch)b;
> +         Trace((stdout, " (%02x)", h[n]));
> +     }
> Index: archivers/unzip/patches/patch-extract_c
> ===================================================================
> RCS file: 
> /data/mirror/openbsd/cvs/ports/archivers/unzip/patches/patch-extract_c,v
> retrieving revision 1.1
> diff -u -p -r1.1 patch-extract_c
> --- archivers/unzip/patches/patch-extract_c   6 Feb 2015 21:37:04 -0000       
> 1.1
> +++ archivers/unzip/patches/patch-extract_c   21 Mar 2017 16:24:58 -0000
> @@ -1,11 +1,20 @@
>  $OpenBSD: patch-extract_c,v 1.1 2015/02/06 21:37:04 naddy Exp $
>  
> +Fix CVE-2015-7696: prevent unsigned overflow on invalid input
> +    https://bugzilla.redhat.com/attachment.cgi?id=1075942
> +    https://bugzilla.redhat.com/show_bug.cgi?id=1260944
>  Fix CVE-2014-8139: CRC32 verification heap-based overflow
> +    https://bugzilla.redhat.com/show_bug.cgi?id=1174844
> +    https://bugzilla.redhat.com/attachment.cgi?id=989833
>  Fix CVE-2014-8140: out-of-bounds write issue in test_compr_eb()
>  Fix CVE-2014-9636: out-of-bounds read/write in test_compr_eb()
> +Fix CVE-2015-7697: infinite loop when extracting empty bzip2 data
> +    https://bugs.debian.org/802160
> +    https://bugzilla.redhat.com/show_bug.cgi?id=1260944
> +    https://bugzilla.redhat.com/attachment.cgi?id=1073339
>  
>  --- extract.c.orig   Sat Mar 14 02:32:52 2009
> -+++ extract.c        Thu Feb  5 18:58:23 2015
> ++++ extract.c        Tue Mar 21 16:10:27 2017
>  @@ -1,5 +1,5 @@
>   /*
>  -  Copyright (c) 1990-2009 Info-ZIP.  All rights reserved.
> @@ -22,7 +31,26 @@ Fix CVE-2014-9636: out-of-bounds read/wr
>      static ZCONST char Far InvalidComprDataEAs[] =
>        " invalid compressed data for EAs\n";
>   #  if (defined(WIN32) && defined(NTSD_EAS))
> -@@ -2023,7 +2025,8 @@ static int TestExtraField(__G__ ef, ef_len)
> +@@ -1255,8 +1257,17 @@ static int extract_or_test_entrylist(__G__ numchunk,
> +         if (G.lrec.compression_method == STORED) {
> +             zusz_t csiz_decrypted = G.lrec.csize;
> + 
> +-            if (G.pInfo->encrypted)
> ++            if (G.pInfo->encrypted) {
> ++                if (csiz_decrypted < 12) {
> ++                    /* handle the error now to prevent unsigned overflow */
> ++                    Info(slide, 0x401, ((char *)slide,
> ++                      LoadFarStringSmall(ErrUnzipNoFile),
> ++                      LoadFarString(InvalidComprData),
> ++                      LoadFarStringSmall2(Inflate)));
> ++                    return PK_ERR;
> ++                }
> +                 csiz_decrypted -= 12;
> ++            }
> +             if (G.lrec.ucsize != csiz_decrypted) {
> +                 Info(slide, 0x401, ((char *)slide,
> +                   LoadFarStringSmall2(WrnStorUCSizCSizDiff),
> +@@ -2023,7 +2034,8 @@ static int TestExtraField(__G__ ef, ef_len)
>           ebID = makeword(ef);
>           ebLen = (unsigned)makeword(ef+EB_LEN);
>   
> @@ -32,7 +60,7 @@ Fix CVE-2014-9636: out-of-bounds read/wr
>              /* Discovered some extra field inconsistency! */
>               if (uO.qflag)
>                   Info(slide, 1, ((char *)slide, "%-22s ",
> -@@ -2158,11 +2161,19 @@ static int TestExtraField(__G__ ef, ef_len)
> +@@ -2158,11 +2170,19 @@ static int TestExtraField(__G__ ef, ef_len)
>                   }
>                   break;
>               case EF_PKVMS:
> @@ -53,7 +81,7 @@ Fix CVE-2014-9636: out-of-bounds read/wr
>                   break;
>               case EF_PKW32:
>               case EF_PKUNIX:
> -@@ -2217,14 +2228,30 @@ static int test_compr_eb(__G__ eb, eb_size, 
> compr_offs
> +@@ -2217,15 +2237,32 @@ static int test_compr_eb(__G__ eb, eb_size, 
> compr_offs
>       ulg eb_ucsize;
>       uch *eb_ucptr;
>       int r;
> @@ -76,14 +104,29 @@ Fix CVE-2014-9636: out-of-bounds read/wr
>  +     ((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! */
> -+
> -+    /* 2014-11-03 Michal Zalewski, SMS.
> + 
> ++    /* 2015-02-10 Mancha(?), Michal Zalewski, Tomas Hoger, 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))
> ++    if ((eb_compr_method == STORED) &&
> ++     (eb_size != compr_offset + EB_CMPRHEADLEN + eb_ucsize))
>  +        return PK_ERR;
> - 
> ++
>       if (
>   #ifdef INT_16BIT
> +         (((ulg)(extent)eb_ucsize) != eb_ucsize) ||
> +@@ -2700,6 +2737,12 @@ __GDEF
> +     int err=BZ_OK;
> +     int repeated_buf_err;
> +     bz_stream bstrm;
> ++
> ++    if (G.incnt <= 0 && G.csize <= 0L) {
> ++        /* avoid an infinite loop */
> ++        Trace((stderr, "UZbunzip2() got empty input\n"));
> ++        return 2;
> ++    }
> + 
> + #if (defined(DLL) && !defined(NO_SLIDE_REDIR))
> +     if (G.redirect_slide)
> Index: archivers/unzip/patches/patch-list_c
> ===================================================================
> RCS file: archivers/unzip/patches/patch-list_c
> diff -N archivers/unzip/patches/patch-list_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ archivers/unzip/patches/patch-list_c      21 Mar 2017 16:24:58 -0000
> @@ -0,0 +1,40 @@
> +$OpenBSD$
> +
> +Fix: increase size of cfactorstr array to avoid buffer overflow
> +    https://bugs.debian.org/741384
> +Fix CVE-2014-9913: buffer overflow in unzip
> +    https://sourceforge.net/p/infozip/bugs/27/
> +    https://bugs.debian.org/847485
> +    https://launchpad.net/bugs/387350
> +
> +--- list.c.orig      Sun Feb  8 18:11:34 2009
> ++++ list.c   Tue Mar 21 16:10:27 2017
> +@@ -97,7 +97,7 @@ int list_files(__G)    /* return PK-type error code */
> + {
> +     int do_this_file=FALSE, cfactor, error, error_in_archive=PK_COOL;
> + #ifndef WINDLL
> +-    char sgn, cfactorstr[10];
> ++    char sgn, cfactorstr[12];
> +     int longhdr=(uO.vflag>1);
> + #endif
> +     int date_format;
> +@@ -339,7 +339,18 @@ int list_files(__G)    /* return PK-type error code */
> +                 G.crec.compression_method == ENHDEFLATED) {
> +                 methbuf[5] = dtype[(G.crec.general_purpose_bit_flag>>1) & 
> 3];
> +             } else if (methnum >= NUM_METHODS) {
> +-                sprintf(&methbuf[4], "%03u", G.crec.compression_method);
> ++                /* 2013-02-26 SMS.
> ++                 * http://sourceforge.net/p/infozip/bugs/27/  CVE-2014-9913.
> ++                 * Unexpectedly large compression methods overflow
> ++                 * &methbuf[].  Use the old, three-digit decimal format
> ++                 * for values which fit.  Otherwise, sacrifice the
> ++                 * colon, and use four-digit hexadecimal.
> ++                 */
> ++                if (G.crec.compression_method <= 999) {
> ++                    sprintf( &methbuf[ 4], "%03u", 
> G.crec.compression_method);
> ++                } else {
> ++                    sprintf( &methbuf[ 3], "%04X", 
> G.crec.compression_method);
> ++                }
> +             }
> + 
> + #if 0       /* GRR/Euro:  add this? */
> Index: archivers/unzip/patches/patch-process_c
> ===================================================================
> RCS file: 
> /data/mirror/openbsd/cvs/ports/archivers/unzip/patches/patch-process_c,v
> retrieving revision 1.2
> diff -u -p -r1.2 patch-process_c
> --- archivers/unzip/patches/patch-process_c   6 Feb 2015 21:37:04 -0000       
> 1.2
> +++ archivers/unzip/patches/patch-process_c   21 Mar 2017 16:24:58 -0000
> @@ -1,10 +1,16 @@
>  $OpenBSD: patch-process_c,v 1.2 2015/02/06 21:37:04 naddy Exp $
>  
> -Fix extraction of symlinks
> +Fix: handle the PKWare verification bit of internal attributes
> +    https://bugs.debian.org/630078
> +Fix: extraction of symlinks
>  Fix CVE-2014-8141: out-of-bounds read issues in getZip64Data()
> +Fix: do not ignore extra fields containing Unix Timestamps
> +    https://bugs.debian.org/842993
> +Fix: restore uid and gid information when requested
> +    https://bugs.debian.org/689212
>  
>  --- process.c.orig   Fri Mar  6 02:25:10 2009
> -+++ process.c        Thu Feb  5 18:57:59 2015
> ++++ process.c        Tue Mar 21 16:10:27 2017
>  @@ -1,5 +1,5 @@
>   /*
>  -  Copyright (c) 1990-2009 Info-ZIP.  All rights reserved.
> @@ -12,7 +18,21 @@ Fix CVE-2014-8141: out-of-bounds read is
>   
>     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.
> -@@ -1751,6 +1751,12 @@ int process_cdir_file_hdr(__G)    /* return PK-type er
> +@@ -1729,6 +1729,13 @@ int process_cdir_file_hdr(__G)    /* return PK-type er
> +     else if (uO.L_flag > 1)   /* let -LL force lower case for all names */
> +         G.pInfo->lcflag = 1;
> + 
> ++    /* Handle the PKWare verification bit, bit 2 (0x0004) of internal
> ++       attributes.  If this is set, then a verification checksum is in the
> ++       first 3 bytes of the external attributes.  In this case all we can 
> use
> ++       for setting file attributes is the last external attributes byte. */
> ++    if (G.crec.internal_file_attributes & 0x0004)
> ++      G.crec.external_file_attributes &= (ulg)0xff;
> ++
> +     /* do Amigas (AMIGA_) also have volume labels? */
> +     if (IS_VOLID(G.crec.external_file_attributes) &&
> +         (G.pInfo->hostnum == FS_FAT_ || G.pInfo->hostnum == FS_HPFS_ ||
> +@@ -1751,6 +1758,12 @@ int process_cdir_file_hdr(__G)    /* return PK-type er
>           = (G.crec.general_purpose_bit_flag & (1 << 11)) == (1 << 11);
>   #endif
>   
> @@ -25,7 +45,7 @@ Fix CVE-2014-8141: out-of-bounds read is
>       return PK_COOL;
>   
>   } /* end function process_cdir_file_hdr() */
> -@@ -1888,48 +1894,82 @@ int getZip64Data(__G__ ef_buf, ef_len)
> +@@ -1888,48 +1901,82 @@ int getZip64Data(__G__ ef_buf, ef_len)
>       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.
> @@ -124,3 +144,53 @@ Fix CVE-2014-8141: out-of-bounds read is
>           ef_buf += (eb_len + EB_HEADSIZE);
>           ef_len -= (eb_len + EB_HEADSIZE);
>       }
> +@@ -2867,10 +2914,13 @@ unsigned ef_scan_for_izux(ef_buf, ef_len, ef_is_c, 
> dos
> +             break;
> + 
> +           case EF_IZUNIX2:
> +-            if (have_new_type_eb == 0) {
> +-                flags &= ~0x0ff;        /* ignore any previous IZUNIX field 
> */
> ++            if (have_new_type_eb == 0) {        /* (< 1) */
> +                 have_new_type_eb = 1;
> +             }
> ++            if (have_new_type_eb <= 1) {
> ++                /* Ignore any prior (EF_IZUNIX/EF_PKUNIX) UID/GID. */
> ++                flags &= 0x0ff;
> ++            }
> + #ifdef IZ_HAVE_UXUIDGID
> +             if (have_new_type_eb > 1)
> +                 break;          /* IZUNIX3 overrides IZUNIX2 e.f. block ! */
> +@@ -2886,6 +2936,8 @@ unsigned ef_scan_for_izux(ef_buf, ef_len, ef_is_c, dos
> +             /* new 3rd generation Unix ef */
> +             have_new_type_eb = 2;
> + 
> ++            /* Ignore any prior EF_IZUNIX/EF_PKUNIX/EF_IZUNIX2 UID/GID. */
> ++            flags &= 0x0ff;
> +         /*
> +           Version       1 byte      version of this extra field, currently 1
> +           UIDSize       1 byte      Size of UID field
> +@@ -2897,7 +2949,7 @@ unsigned ef_scan_for_izux(ef_buf, ef_len, ef_is_c, dos
> + #ifdef IZ_HAVE_UXUIDGID
> +             if (eb_len >= EB_UX3_MINLEN
> +                 && z_uidgid != NULL
> +-                && (*((EB_HEADSIZE + 0) + ef_buf) == 1)
> ++                && (*((EB_HEADSIZE + 0) + ef_buf) == 1))
> +                     /* only know about version 1 */
> +             {
> +                 uch uid_size;
> +@@ -2906,13 +2958,11 @@ unsigned ef_scan_for_izux(ef_buf, ef_len, ef_is_c, 
> dos
> +                 uid_size = *((EB_HEADSIZE + 1) + ef_buf);
> +                 gid_size = *((EB_HEADSIZE + uid_size + 2) + ef_buf);
> + 
> +-                flags &= ~0x0ff;      /* ignore any previous UNIX field */
> +-
> +                 if ( read_ux3_value((EB_HEADSIZE + 2) + ef_buf,
> +-                                    uid_size, z_uidgid[0])
> ++                                    uid_size, &z_uidgid[0])
> +                     &&
> +                      read_ux3_value((EB_HEADSIZE + uid_size + 3) + ef_buf,
> +-                                    gid_size, z_uidgid[1]) )
> ++                                    gid_size, &z_uidgid[1]) )
> +                 {
> +                     flags |= EB_UX2_VALID;   /* signal success */
> +                 }
> Index: archivers/unzip/patches/patch-zipinfo_c
> ===================================================================
> RCS file: archivers/unzip/patches/patch-zipinfo_c
> diff -N archivers/unzip/patches/patch-zipinfo_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ archivers/unzip/patches/patch-zipinfo_c   21 Mar 2017 16:24:58 -0000
> @@ -0,0 +1,38 @@
> +$OpenBSD$
> +
> +Fix CVE-2016-9844: buffer overflow in zipinfo
> +    https://bugs.debian.org/847486
> +    https://launchpad.net/bugs/1643750
> +Do not crash when hostver byte is >= 100
> +
> +--- zipinfo.c.orig   Sun Feb  8 18:04:30 2009
> ++++ zipinfo.c        Tue Mar 21 16:10:27 2017
> +@@ -1921,7 +1921,18 @@ static int zi_short(__G)   /* return PK-type error cod
> +         ush  dnum=(ush)((G.crec.general_purpose_bit_flag>>1) & 3);
> +         methbuf[3] = dtype[dnum];
> +     } else if (methnum >= NUM_METHODS) {   /* unknown */
> +-        sprintf(&methbuf[1], "%03u", G.crec.compression_method);
> ++        /* 2016-12-05 SMS.
> ++         * https://launchpad.net/bugs/1643750
> ++         * Unexpectedly large compression methods overflow
> ++         * &methbuf[].  Use the old, three-digit decimal format
> ++         * for values which fit.  Otherwise, sacrifice the "u",
> ++         * and use four-digit hexadecimal.
> ++         */
> ++        if (G.crec.compression_method <= 999) {
> ++            sprintf( &methbuf[ 1], "%03u", G.crec.compression_method);
> ++        } else {
> ++            sprintf( &methbuf[ 0], "%04X", G.crec.compression_method);
> ++        }
> +     }
> + 
> +     for (k = 0;  k < 15;  ++k)
> +@@ -2114,7 +2125,7 @@ static int zi_short(__G)   /* return PK-type error cod
> +             else
> +                 attribs[9] = (xattr & UNX_ISVTX)? 'T' : '-';  /* 
> T==undefined */
> + 
> +-            sprintf(&attribs[12], "%u.%u", hostver/10, hostver%10);
> ++            sprintf(&attribs[11], "%2u.%u", hostver/10, hostver%10);
> +             break;
> + 
> +     } /* end switch (hostnum: external attributes format) */
>

-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Reply via email to