From 2442e69e4182b592757dad473c8c7b1c48ca8284 Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Thu, 22 Oct 2015 17:10:41 -0400 Subject: [PATCH] Revert "gnu: unzip: Reorganize security fixes for improved clarity." This reverts commit c46c931ecfe7fd4a5cbd979263d28d3f1e02bcca. --- gnu-system.am | 4 +- .../patches/unzip-CVE-2015-7696.patch | 35 ------ .../patches/unzip-CVE-2015-7697.patch | 28 ----- .../unzip-fix-overflows-and-infloop.patch | 108 ++++++++++++++++++ .../unzip-overflow-on-invalid-input.patch | 40 ------- gnu/packages/zip.scm | 4 +- 6 files changed, 110 insertions(+), 109 deletions(-) delete mode 100644 gnu/packages/patches/unzip-CVE-2015-7696.patch delete mode 100644 gnu/packages/patches/unzip-CVE-2015-7697.patch create mode 100644 gnu/packages/patches/unzip-fix-overflows-and-infloop.patch delete mode 100644 gnu/packages/patches/unzip-overflow-on-invalid-input.patch diff --git a/gnu-system.am b/gnu-system.am index c4810661a2..e62fe18c97 100644 --- a/gnu-system.am +++ b/gnu-system.am @@ -647,11 +647,9 @@ dist_patch_DATA = \ gnu/packages/patches/unzip-CVE-2014-8140.patch \ gnu/packages/patches/unzip-CVE-2014-8141.patch \ gnu/packages/patches/unzip-CVE-2014-9636.patch \ - gnu/packages/patches/unzip-CVE-2015-7696.patch \ - gnu/packages/patches/unzip-CVE-2015-7697.patch \ gnu/packages/patches/unzip-allow-greater-hostver-values.patch \ gnu/packages/patches/unzip-attribs-overflow.patch \ - gnu/packages/patches/unzip-overflow-on-invalid-input.patch \ + gnu/packages/patches/unzip-fix-overflows-and-infloop.patch \ gnu/packages/patches/unzip-format-secure.patch \ gnu/packages/patches/unzip-initialize-symlink-flag.patch \ gnu/packages/patches/unzip-overflow-long-fsize.patch \ diff --git a/gnu/packages/patches/unzip-CVE-2015-7696.patch b/gnu/packages/patches/unzip-CVE-2015-7696.patch deleted file mode 100644 index d6a4072673..0000000000 --- a/gnu/packages/patches/unzip-CVE-2015-7696.patch +++ /dev/null @@ -1,35 +0,0 @@ -Copied from Debian. - -From: Petr Stodulka -Date: Mon, 14 Sep 2015 18:23:17 +0200 -Subject: Upstream fix for heap overflow -Bug-Debian: https://bugs.debian.org/802162 -Bug-RedHat: https://bugzilla.redhat.com/show_bug.cgi?id=1260944 -Origin: https://bugzilla.redhat.com/attachment.cgi?id=1073002 -Forwarded: yes - ---- - crypt.c | 12 +++++++++++- - 1 file changed, 11 insertions(+), 1 deletion(-) - ---- a/crypt.c -+++ b/crypt.c -@@ -465,7 +465,17 @@ - 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])); - } diff --git a/gnu/packages/patches/unzip-CVE-2015-7697.patch b/gnu/packages/patches/unzip-CVE-2015-7697.patch deleted file mode 100644 index d688b42495..0000000000 --- a/gnu/packages/patches/unzip-CVE-2015-7697.patch +++ /dev/null @@ -1,28 +0,0 @@ -Copied from Debian. - -From: Kamil Dudka -Date: Mon, 14 Sep 2015 18:24:56 +0200 -Subject: fix infinite loop when extracting empty bzip2 data -Bug-Debian: https://bugs.debian.org/802160 -Bug-RedHat: https://bugzilla.redhat.com/show_bug.cgi?id=1260944 -Origin: other, https://bugzilla.redhat.com/attachment.cgi?id=1073339 - ---- - extract.c | 6 ++++++ - 1 file changed, 6 insertions(+) - ---- a/extract.c -+++ b/extract.c -@@ -2728,6 +2728,12 @@ - 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) - wsize = G.redirect_size, redirSlide = G.redirect_buffer; diff --git a/gnu/packages/patches/unzip-fix-overflows-and-infloop.patch b/gnu/packages/patches/unzip-fix-overflows-and-infloop.patch new file mode 100644 index 0000000000..33498db95e --- /dev/null +++ b/gnu/packages/patches/unzip-fix-overflows-and-infloop.patch @@ -0,0 +1,108 @@ +Copied from Fedora. + +http://pkgs.fedoraproject.org/cgit/unzip.git/tree/unzip-6.0-heap-overflow-infloop.patch?id=d18f821e + +From bdd4a0cecd745cb4825e4508b5bdf2579731086a Mon Sep 17 00:00:00 2001 +From: Petr Stodulka +Date: Mon, 14 Sep 2015 18:23:17 +0200 +Subject: [PATCH 1/3] upstream fix for heap overflow + +https://bugzilla.redhat.com/attachment.cgi?id=1073002 +--- + crypt.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +diff --git a/crypt.c b/crypt.c +index 784e411..a8975f2 100644 +--- a/crypt.c ++++ b/crypt.c +@@ -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])); + } +-- +2.4.6 + + +From 4b48844661ff9569f2ecf582a387d46a5775b5d8 Mon Sep 17 00:00:00 2001 +From: Kamil Dudka +Date: Mon, 14 Sep 2015 18:24:56 +0200 +Subject: [PATCH 2/3] fix infinite loop when extracting empty bzip2 data + +Bug: https://sourceforge.net/p/infozip/patches/23/ +--- + extract.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/extract.c b/extract.c +index 7134bfe..29db027 100644 +--- a/extract.c ++++ b/extract.c +@@ -2733,6 +2733,12 @@ __GDEF + 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) + wsize = G.redirect_size, redirSlide = G.redirect_buffer; +-- +2.4.6 + + +From bd150334fb4084f5555a6be26b015a0671cb5b74 Mon Sep 17 00:00:00 2001 +From: Kamil Dudka +Date: Tue, 22 Sep 2015 18:52:23 +0200 +Subject: [PATCH 3/3] extract: prevent unsigned overflow on invalid input + +Suggested-by: Stefan Cornelius +--- + extract.c | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +diff --git a/extract.c b/extract.c +index 29db027..b9ae667 100644 +--- a/extract.c ++++ b/extract.c +@@ -1257,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), +-- +2.5.2 + diff --git a/gnu/packages/patches/unzip-overflow-on-invalid-input.patch b/gnu/packages/patches/unzip-overflow-on-invalid-input.patch deleted file mode 100644 index 013002a88c..0000000000 --- a/gnu/packages/patches/unzip-overflow-on-invalid-input.patch +++ /dev/null @@ -1,40 +0,0 @@ -Extracted from a patch in Fedora. - -http://pkgs.fedoraproject.org/cgit/unzip.git/tree/unzip-6.0-heap-overflow-infloop.patch?id=d18f821e - -From bd150334fb4084f5555a6be26b015a0671cb5b74 Mon Sep 17 00:00:00 2001 -From: Kamil Dudka -Date: Tue, 22 Sep 2015 18:52:23 +0200 -Subject: [PATCH 3/3] extract: prevent unsigned overflow on invalid input - -Suggested-by: Stefan Cornelius ---- - extract.c | 11 ++++++++++- - 1 file changed, 10 insertions(+), 1 deletion(-) - -diff --git a/extract.c b/extract.c -index 29db027..b9ae667 100644 ---- a/extract.c -+++ b/extract.c -@@ -1257,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), --- -2.5.2 - diff --git a/gnu/packages/zip.scm b/gnu/packages/zip.scm index b7bed0e86d..83c452778c 100644 --- a/gnu/packages/zip.scm +++ b/gnu/packages/zip.scm @@ -85,13 +85,11 @@ Compression ratios of 2:1 to 3:1 are common for text files.") "unzip-CVE-2014-8140.patch" "unzip-CVE-2014-8141.patch" "unzip-CVE-2014-9636.patch" - "unzip-CVE-2015-7696.patch" - "unzip-CVE-2015-7697.patch" "unzip-allow-greater-hostver-values.patch" "unzip-initialize-symlink-flag.patch" "unzip-remove-build-date.patch" "unzip-attribs-overflow.patch" - "unzip-overflow-on-invalid-input.patch" + "unzip-fix-overflows-and-infloop.patch" "unzip-format-secure.patch" "unzip-overflow-long-fsize.patch"))))) (build-system gnu-build-system)