Christian Weisgerber:

> * archivers/unzip (zipgrep) -- AFFECTED
>   archive member names are extracted with unzip -Z1, which renders
>   \n as ^J.  However, the result is processed by shell command
>   substitution, so it undergoes field splitting and pathname
>   expansion.  If a file with an exploitable name is present in the
>   current working directory, a archive member with a shell wildcard
>   in its name may inadvertently feed it to sed.  Yes, it's convoluted.
>   The xzgrep fix can be applied.

Patch below.

The zipgrep script is not robust and will fail (harmlessly) with
adversarial filenames.

The patch addresses this case:
$ touch 'a
> b'
$ touch 'a*'
$ zip x.zip a*
  adding: a^Jb (stored 0%)
  adding: a* (stored 0%)
$ zipgrep.old foo x.zip
caution: filename not matched:  a^Jb
sed: 1: "s|^|a
b:|": unescaped newline inside substitute pattern
$ zipgrep foo x.zip   
caution: filename not matched:  a^Jb

OK?

Index: Makefile
===================================================================
RCS file: /cvs/ports/archivers/unzip/Makefile,v
retrieving revision 1.67
diff -u -p -r1.67 Makefile
--- Makefile    11 Mar 2022 18:16:25 -0000      1.67
+++ Makefile    13 Apr 2022 21:53:40 -0000
@@ -5,7 +5,7 @@ COMMENT =       extract, list & test files in 
 VERSION =      6.0
 DISTNAME =     unzip${VERSION:S/.//}
 PKGNAME =      unzip-${VERSION}
-REVISION =     14
+REVISION =     15
 CATEGORIES =   archivers
 MASTER_SITES = ${MASTER_SITE_SOURCEFORGE:=infozip/} \
                ftp://ftp.info-zip.org/pub/infozip/src/
Index: patches/patch-unix_zipgrep
===================================================================
RCS file: patches/patch-unix_zipgrep
diff -N patches/patch-unix_zipgrep
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-unix_zipgrep  13 Apr 2022 21:53:40 -0000
@@ -0,0 +1,18 @@
+Index: unix/zipgrep
+
+CVE-2022-1271
+Prevent arbitrary-file-write vulnerability if an archive member
+name contains shell wild cards that expand to an existing pathname
+with an exploit pattern.
+
+--- unix/zipgrep.orig
++++ unix/zipgrep
+@@ -70,7 +70,7 @@ for i in `unzip -Z1 "$zipfile" ${1+"$@"} | sed -e 's/\
+     # Escape (or re-escape) shell-special characters in the archive
+     # member name, "i".
+     i=` echo "$i" | \
+-     sed -e 's/\\\\/\\\\\\\\/g' -e 's/|/\\\|/g' -e 's/&/\\\&/g' `
++     sed -e 's/\\\\/\\\\\\\\/g' -e 's/|/\\\|/g' -e 's/&/\\\&/g' -e 
'$!s/$/\\\\/' `
+ 
+     # Globally, send fd 4 to stdout.  In the pipeline, send normal
+     # stdout to fd 4, and send grep status to fd 3.  Collect fd 3
-- 
Christian "naddy" Weisgerber                          na...@mips.inka.de

Reply via email to