SECURITY: fix Qualys CVE-2020-SLCWD
authorPhil Pennock <phil+git@pennock-tech.com>
Thu, 29 Oct 2020 15:47:58 +0000 (11:47 -0400)
committerHeiko Schlittermann (HS12-RIPE) <hs@schlittermann.de>
Tue, 27 Apr 2021 22:40:19 +0000 (00:40 +0200)
(cherry picked from commit bf5f9d56fadf9be8d947f141d31f7e0e8fa63762)

doc/doc-txt/ChangeLog
src/src/exim.c
src/src/macros.h

index 7dbccb788e24845f9db21bc3ba3d8c20bf00cd05..7ed412ea910978110404c489f304e16fda14005e 100644 (file)
@@ -174,12 +174,12 @@ PP/02 Bug 2643: Correct TLS DH constants.
       incorrect Diffie-Hellman constants in the Exim source.
       Reported by kylon94, code-gen tool fix by Simon Arlott.
 
-PP/03 Fix Linux security issue CVE-2020-SLCWD and guard against PATH_MAX
-      better.  Reported by Qualys.
-
-PP/04 Impose security length checks on various command-line options.
+PP/03 Impose security length checks on various command-line options.
       Fixes CVE-2020-SPRSS reported by Qualys.
 
+PP/04 Fix Linux security issue CVE-2020-SLCWD and guard against PATH_MAX
+      better.  Reported by Qualys.
+
 
 Exim version 4.94
 -----------------
index 34159da9369135fa6ecf7fba0faba1bbe8d72de8..067c47f8019bc6dc20de8ad3ae4abc2752291373 100644 (file)
@@ -3828,7 +3828,13 @@ during readconf_main() some expansion takes place already. */
 
 /* Store the initial cwd before we change directories.  Can be NULL if the
 dir has already been unlinked. */
+errno = 0;
 initial_cwd = os_getcwd(NULL, 0);
+if (!initial_cwd && errno)
+  exim_fail("exim: getting initial cwd failed: %s\n", strerror(errno));
+
+if (initial_cwd && (strlen(CCS initial_cwd) >= BIG_BUFFER_SIZE))
+  exim_fail("exim: initial cwd is far too long (%d)\n", Ustrlen(CCS initial_cwd));
 
 /* checking:
     -be[m] expansion test        -
index cebbf40857ab128197ec0b05199be5024cb60559..f83ba1933db85a6f6e0c391499703b518435a590 100644 (file)
@@ -153,7 +153,9 @@ enough to hold all the headers from a normal kind of message. */
 
 /* The initial size of a big buffer for use in various places. It gets put
 into big_buffer_size and in some circumstances increased. It should be at least
-as long as the maximum path length. */
+as long as the maximum path length PLUS room for string additions.
+Let's go with "at least twice as large as maximum path length".
+*/
 
 #ifdef AUTH_HEIMDAL_GSSAPI
                /* RFC 4121 section 5.2, SHOULD support 64K input buffers */
@@ -162,10 +164,12 @@ as long as the maximum path length. */
 # define __BIG_BUFFER_SIZE 16384
 #endif
 
-#if defined PATH_MAX && PATH_MAX > __BIG_BUFFER_SIZE
-# define BIG_BUFFER_SIZE PATH_MAX
-#elif defined MAXPATHLEN && MAXPATHLEN > __BIG_BUFFER_SIZE
-# define BIG_BUFFER_SIZE MAXPATHLEN
+#ifndef PATH_MAX
+/* exim.h will have ensured this exists before including us. */
+# error headers confusion, PATH_MAX missing in macros.h
+#endif
+#if (PATH_MAX*2) > __BIG_BUFFER_SIZE
+# define BIG_BUFFER_SIZE (PATH_MAX*2)
 #else
 # define BIG_BUFFER_SIZE __BIG_BUFFER_SIZE
 #endif