Don't open spool data-files which are symlinks
authorPhil Pennock <pdp@exim.org>
Tue, 15 May 2018 23:04:34 +0000 (19:04 -0400)
committerPhil Pennock <pdp@exim.org>
Tue, 15 May 2018 23:04:34 +0000 (19:04 -0400)
doc/doc-txt/ChangeLog
src/src/spool_in.c

index d9b77804bd1cfcbe5876942f7ad1c53657e5f39e..d99b2684ac79186ce49d508c95496bd96fc729e6 100644 (file)
@@ -29,6 +29,9 @@ JH/05 Bug 2273: Cutthrough delivery left a window where the received messsage
       add more error-checking on spoolfile handling while that code is being
       messed with.
 
       add more error-checking on spoolfile handling while that code is being
       messed with.
 
+PP/01 Refuse to open a spool data file (*-D) if it's a symlink.
+      No known attacks, no CVE, this is defensive hardening.
+
 
 Exim version 4.91
 -----------------
 
 Exim version 4.91
 -----------------
index 33890c516715788cab6e074c1d84df2604dc7590..cd74d1ee7cee74ba611b0cbc75cc1872a8aed84f 100644 (file)
@@ -57,9 +57,17 @@ for (i = 0; i < 2; i++)
   fname = spool_fname(US"input", message_subdir, id, US"-D");
   DEBUG(D_deliver) debug_printf("Trying spool file %s\n", fname);
 
   fname = spool_fname(US"input", message_subdir, id, US"-D");
   DEBUG(D_deliver) debug_printf("Trying spool file %s\n", fname);
 
+  /* We protect against symlink attacks both in not propagating the
+   * file-descriptor to other processes as we exec, and also ensuring that we
+   * don't even open symlinks.
+   * No -D file inside the spool area should be a symlink.
+   */
   if ((fd = Uopen(fname,
 #ifdef O_CLOEXEC
                      O_CLOEXEC |
   if ((fd = Uopen(fname,
 #ifdef O_CLOEXEC
                      O_CLOEXEC |
+#endif
+#ifdef O_NOFOLLOW
+                     O_NOFOLLOW |
 #endif
                      O_RDWR | O_APPEND, 0)) >= 0)
     break;
 #endif
                      O_RDWR | O_APPEND, 0)) >= 0)
     break;