Add backstop check for taint of executable name when calling exec()
authorJeremy Harris <jgh146exb@wizmail.org>
Wed, 9 Mar 2022 14:11:50 +0000 (14:11 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Wed, 9 Mar 2022 14:11:50 +0000 (14:11 +0000)
src/src/child.c
src/src/exim.c
src/src/smtp_in.c
src/src/transport.c

index 267306ee3f0c3eee6173ce044f703fcb9d9a85ef..4c0dbabd11a482ebf571cbfc576627833c86f9d4 100644 (file)
@@ -81,7 +81,7 @@ argv = store_get((extra + acount + MAX_CLMACROS + 24) * sizeof(char *), GET_UNTA
 /* In all case, the list starts out with the path, any macros, and a changed
 config file. */
 
-argv[n++] = exim_path;
+argv[n++] = exim_path;         /* assume untainted */
 if (clmacro_count > 0)
   {
   memcpy(argv + n, clmacros, clmacro_count * sizeof(uschar *));
@@ -343,6 +343,12 @@ int save_errno;
 int inpfd[2], outpfd[2];
 pid_t pid;
 
+if (is_tainted(argv[0]))
+  {
+  log_write(0, LOG_MAIN | LOG_PANIC, "Attempt to exec tainted path: '%s'", argv[0]);
+  return (pid_t)(-1);
+  }
+
 /* Create the pipes. */
 
 if (pipe(inpfd) != 0) return (pid_t)(-1);
index eada6bbf8177b232af589361a865873f8a05973f..ade96fe206736d72fa39e00e7adfcd20161abd8d 100644 (file)
@@ -4397,7 +4397,7 @@ if (bi_option)
     {
     int i = 0;
     uschar *argv[3];
-    argv[i++] = bi_command;
+    argv[i++] = bi_command;    /* nonexpanded option so assume untainted */
     if (alias_arg) argv[i++] = alias_arg;
     argv[i++] = NULL;
 
index 852148fcf594294dbe7944ea9773dcc69bccc0fb..3fe3dab82700acdebf162ac634795f56140465c8 100644 (file)
@@ -5911,6 +5911,7 @@ while (done <= 0)
          {
          DEBUG(D_exec) debug_print_argv(argv);
          exim_nullstd();                   /* Ensure std{in,out,err} exist */
+         /* argv[0] should be untainted, from child_exec_exim() */
          execv(CS argv[0], (char *const *)argv);
          log_write(0, LOG_MAIN|LOG_PANIC_DIE, "exec of \"%s\" (ETRN) failed: %s",
            etrn_command, strerror(errno));
index 8b320ecc201f8c215e4dcbf8b4274986c286a6a9..37623ea1ab7e7717ebda580fba8d9d337d90b13c 100644 (file)
@@ -1972,6 +1972,7 @@ if (socket_fd != 0)
 
 DEBUG(D_exec) debug_print_argv(argv);
 exim_nullstd();                          /* Ensure std{out,err} exist */
+/* argv[0] should be untainted, from child_exec_exim() */
 execv(CS argv[0], (char *const *)argv);
 
 DEBUG(D_any) debug_printf("execv failed: %s\n", strerror(errno));