summaryrefslogtreecommitdiff
path: root/0005-Fix-CVE-2022-4883-compression-commands-depend-on-PAT.patch
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2024-08-06 02:20:50 +0000
committerCoprDistGit <infra@openeuler.org>2024-08-06 02:20:50 +0000
commite59aafdde26bae7ba753b5276bdfb4a3814df7fc (patch)
tree60318a47fd41bb2602a37a25ebb55f4a2bad1eae /0005-Fix-CVE-2022-4883-compression-commands-depend-on-PAT.patch
parent4938be216836b159a90d6725a7fcdfce5fa88afa (diff)
automatic import of libXpmopeneuler24.03_LTS
Diffstat (limited to '0005-Fix-CVE-2022-4883-compression-commands-depend-on-PAT.patch')
-rw-r--r--0005-Fix-CVE-2022-4883-compression-commands-depend-on-PAT.patch144
1 files changed, 144 insertions, 0 deletions
diff --git a/0005-Fix-CVE-2022-4883-compression-commands-depend-on-PAT.patch b/0005-Fix-CVE-2022-4883-compression-commands-depend-on-PAT.patch
new file mode 100644
index 0000000..7ba81de
--- /dev/null
+++ b/0005-Fix-CVE-2022-4883-compression-commands-depend-on-PAT.patch
@@ -0,0 +1,144 @@
+From cdbc3fa8edc5b42391a5f2bfe1a8f6099929acf7 Mon Sep 17 00:00:00 2001
+From: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date: Fri, 6 Jan 2023 12:50:48 -0800
+Subject: [PATCH libXpm 5/6] Fix CVE-2022-4883: compression commands depend on
+ $PATH
+
+By default, on all platforms except MinGW, libXpm will detect if a
+filename ends in .Z or .gz, and will when reading such a file fork off
+an uncompress or gunzip command to read from via a pipe, and when
+writing such a file will fork off a compress or gzip command to write
+to via a pipe.
+
+In libXpm 3.5.14 or older these are run via execlp(), relying on $PATH
+to find the commands. If libXpm is called from a program running with
+raised privileges, such as via setuid, then a malicious user could set
+$PATH to include programs of their choosing to be run with those
+privileges.
+
+Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+---
+ README.md | 12 ++++++++++++
+ configure.ac | 14 ++++++++++++++
+ src/RdFToI.c | 17 ++++++++++++++---
+ src/WrFFrI.c | 4 ++--
+ 4 files changed, 42 insertions(+), 5 deletions(-)
+
+diff --git a/README.md b/README.md
+index f3f4c93..0b1c886 100644
+--- a/README.md
++++ b/README.md
+@@ -31,3 +31,15 @@ if it can't find the file it was asked to open. It relies on the
+ --enable-open-zfile feature to open the file, and is enabled by default
+ when --enable-open-zfile is enabled, and can be disabled by passing the
+ --disable-stat-zfile flag to the configure script.
++
++All of these commands will be executed with whatever userid & privileges the
++function is called with, relying on the caller to ensure the correct euid,
++egid, etc. are set before calling.
++
++To reduce risk, the paths to these commands are now set at configure time to
++the first version found in the PATH used to run configure, and do not depend
++on the PATH environment variable set at runtime.
++
++To specify paths to be used for these commands instead of searching $PATH, pass
++the XPM_PATH_COMPRESS, XPM_PATH_UNCOMPRESS, XPM_PATH_GZIP, and XPM_PATH_GUNZIP
++variables to the configure command.
+diff --git a/configure.ac b/configure.ac
+index 85e2c73..4fc370d 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -49,6 +49,14 @@ if test "x$USE_GETTEXT" = "xyes" ; then
+ fi
+ AM_CONDITIONAL(USE_GETTEXT, test "x$USE_GETTEXT" = "xyes")
+
++dnl Helper macro to find absolute path to program and add a #define for it
++AC_DEFUN([XPM_PATH_PROG],[
++AC_PATH_PROG([$1], [$2], [])
++AS_IF([test "x$$1" = "x"],
++ [AC_MSG_ERROR([$2 not found, set $1 or use --disable-stat-zfile])])
++AC_DEFINE_UNQUOTED([$1], ["$$1"], [Path to $2])
++]) dnl End of AC_DEFUN([XPM_PATH_PROG]...
++
+ # Optional feature: When a filename ending in .Z or .gz is requested,
+ # open a pipe to a newly forked compress/uncompress/gzip/gunzip command to
+ # handle it.
+@@ -64,6 +72,12 @@ AC_ARG_ENABLE(open-zfile,
+ AC_MSG_RESULT([$OPEN_ZFILE])
+ if test x$OPEN_ZFILE = xno ; then
+ AC_DEFINE(NO_ZPIPE, 1, [Define to 1 to disable decompression via pipes])
++else
++ XPM_PATH_PROG([XPM_PATH_COMPRESS], [compress])
++ XPM_PATH_PROG([XPM_PATH_UNCOMPRESS], [uncompress])
++ XPM_PATH_PROG([XPM_PATH_GZIP], [gzip])
++ XPM_PATH_PROG([XPM_PATH_GUNZIP], [gunzip])
++ AC_CHECK_FUNCS([closefrom close_range], [break])
+ fi
+
+ # Optional feature: When ___.xpm is requested, also look for ___.xpm.Z & .gz
+diff --git a/src/RdFToI.c b/src/RdFToI.c
+index bd09611..a91d337 100644
+--- a/src/RdFToI.c
++++ b/src/RdFToI.c
+@@ -43,6 +43,7 @@
+ #include <errno.h>
+ #include <sys/types.h>
+ #include <sys/wait.h>
++#include <unistd.h>
+ #else
+ #ifdef FOR_MSW
+ #include <fcntl.h>
+@@ -161,7 +162,17 @@ xpmPipeThrough(
+ goto err;
+ if ( 0 == pid )
+ {
+- execlp(cmd, cmd, arg1, (char *)NULL);
++#ifdef HAVE_CLOSEFROM
++ closefrom(3);
++#elif defined(HAVE_CLOSE_RANGE)
++# ifdef CLOSE_RANGE_UNSHARE
++# define close_range_flags CLOSE_RANGE_UNSHARE
++# else
++# define close_range_flags 0
++#endif
++ close_range(3, ~0U, close_range_flags);
++#endif
++ execl(cmd, cmd, arg1, (char *)NULL);
+ perror(cmd);
+ goto err;
+ }
+@@ -235,12 +246,12 @@ OpenReadFile(
+ if ( ext && !strcmp(ext, ".Z") )
+ {
+ mdata->type = XPMPIPE;
+- mdata->stream.file = xpmPipeThrough(fd, "uncompress", "-c", "r");
++ mdata->stream.file = xpmPipeThrough(fd, XPM_PATH_UNCOMPRESS, "-c", "r");
+ }
+ else if ( ext && !strcmp(ext, ".gz") )
+ {
+ mdata->type = XPMPIPE;
+- mdata->stream.file = xpmPipeThrough(fd, "gunzip", "-qc", "r");
++ mdata->stream.file = xpmPipeThrough(fd, XPM_PATH_GUNZIP, "-qc", "r");
+ }
+ else
+ #endif /* z-files */
+diff --git a/src/WrFFrI.c b/src/WrFFrI.c
+index 328c987..d59098f 100644
+--- a/src/WrFFrI.c
++++ b/src/WrFFrI.c
+@@ -342,10 +342,10 @@ OpenWriteFile(
+ #ifndef NO_ZPIPE
+ len = strlen(filename);
+ if (len > 2 && !strcmp(".Z", filename + (len - 2))) {
+- mdata->stream.file = xpmPipeThrough(fd, "compress", NULL, "w");
++ mdata->stream.file = xpmPipeThrough(fd, XPM_PATH_COMPRESS, NULL, "w");
+ mdata->type = XPMPIPE;
+ } else if (len > 3 && !strcmp(".gz", filename + (len - 3))) {
+- mdata->stream.file = xpmPipeThrough(fd, "gzip", "-q", "w");
++ mdata->stream.file = xpmPipeThrough(fd, XPM_PATH_GZIP, "-q", "w");
+ mdata->type = XPMPIPE;
+ } else
+ #endif
+--
+2.39.0
+