Add perl_taintmode option
authorHeiko Schlittermann (HS12-RIPE) <hs@schlittermann.de>
Mon, 1 Feb 2016 12:13:27 +0000 (13:13 +0100)
committerHeiko Schlittermann (HS12-RIPE) <hs@schlittermann.de>
Tue, 2 Feb 2016 14:43:53 +0000 (15:43 +0100)
doc/doc-docbook/spec.xfpt
doc/doc-txt/ChangeLog
src/conf [new file with mode: 0644]
src/src/globals.c
src/src/globals.h
src/src/perl.c
src/src/readconf.c

index cdca6c4b34853e356e6ff41573928871a4be79b6..8a0c96753d6aaeb957c759e46012a069e1aad516 100644 (file)
@@ -12967,6 +12967,14 @@ overriding the setting of &%perl_at_start%&.
 There is also a command line option &%-pd%& (for delay) which suppresses the
 initial startup, even if &%perl_at_start%& is set.
 
+.ilist
+.oindex "&%perl_taintmode%&"
+To provide more security executing Perl code via the embedded Perl
+interpeter, the &%perl_taintmode%& option can be set. This enables the
+taint mode of the Perl interpreter. You are encouraged to set this
+option to a true value. To avoid breaking existing installations, it
+defaults to false.
+
 
 .section "Calling Perl subroutines" "SECID86"
 When the configuration file includes a &%perl_startup%& option you can make use
@@ -13495,6 +13503,7 @@ listed in more than one group.
 .table2
 .row &%perl_at_start%&               "always start the interpreter"
 .row &%perl_startup%&                "code to obey when starting Perl"
+.row &%perl_taintmode%&                     "enable taint mode in Perl"
 .endtable
 
 
@@ -15582,14 +15591,20 @@ local parts. Exim's default configuration does this.
 
 
 .option perl_at_start main boolean false
+.cindex "Perl"
 This option is available only when Exim is built with an embedded Perl
 interpreter. See chapter &<<CHAPperl>>& for details of its use.
 
 
 .option perl_startup main string unset
+.cindex "Perl"
 This option is available only when Exim is built with an embedded Perl
 interpreter. See chapter &<<CHAPperl>>& for details of its use.
 
+.option perl_startup main boolean false
+.cindex "Perl"
+This Option enables the taint mode of the embedded Perl interpreter.
+
 
 .option pgsql_servers main "string list" unset
 .cindex "PostgreSQL lookup type" "server list"
index b48b7b9888aa844ae56ffa7411741dca6fb3f63f..1d1a5d9f58ee6c754ebb3890dacea63153a9772e 100644 (file)
@@ -287,6 +287,8 @@ JH/35 Bug 1642: Fix support of $spam_ variables at delivery time.  Was
 JH/36 Bug 1659: Guard checking of input smtp commands again pseudo-command
       added for tls authenticator.
 
+HS/03 Add perl_taintmode main config option
+
 
 Exim version 4.85
 -----------------
diff --git a/src/conf b/src/conf
new file mode 100644 (file)
index 0000000..1619c0d
--- /dev/null
+++ b/src/conf
@@ -0,0 +1,2 @@
+perl_startup = $| = 1; print "<${^TAINT}>\n";
+perl_taintmode = yes
index 69f217642aa113371caf56aff7b6ee88fed679e5..adf87380e3c796fdf27a227bfd82a85f5199515c 100644 (file)
@@ -49,6 +49,7 @@ duplicate them here... */
 uschar *opt_perl_startup       = NULL;
 BOOL    opt_perl_at_start      = FALSE;
 BOOL    opt_perl_started       = FALSE;
+BOOL    opt_perl_taintmode     = FALSE;
 #endif
 
 #ifdef EXPAND_DLFUNC
index 787de41f0b699efce8b907dbdfbac4944711a67f..7f6537a9a3e921bddbd2012114f72b11fc3fbc6d 100644 (file)
@@ -28,6 +28,7 @@ typedef volatile sig_atomic_t SIGNAL_BOOL;
 extern uschar *opt_perl_startup;       /* Startup code for Perl interpreter */
 extern BOOL    opt_perl_at_start;      /* Start Perl interpreter at start */
 extern BOOL    opt_perl_started;       /* Set once interpreter started */
+extern BOOL    opt_perl_taintmode;     /* Enable taint mode in Perl */
 #endif
 
 #ifdef EXPAND_DLFUNC
index 543b5d27d1713cd6bc1bc103934c417003252cea..fbe9ee8427dafb49e471647ab1dac7b1c8038ea2 100644 (file)
@@ -13,6 +13,7 @@
 /* This Perl add-on can be distributed under the same terms as Exim itself. */
 /* See the file NOTICE for conditions of use and distribution. */
 
+#include <assert.h>
 #include "exim.h"
 
 #define EXIM_TRUE TRUE
@@ -95,11 +96,17 @@ static void  xs_init(pTHX)
 uschar *
 init_perl(uschar *startup_code)
 {
-  static int argc = 2;
-  static char *argv[3] = { "exim-perl", "/dev/null", 0 };
+  static int argc = 1;
+  static char *argv[4] = { "exim-perl" };
   SV *sv;
   STRLEN len;
 
+  if (opt_perl_taintmode) argv[argc++] = "-T";
+  argv[argc++] = "/dev/null";
+  argv[argc] = 0;
+
+  assert(sizeof(argv)/sizeof(argv[0]) > argc);
+
   if (interp_perl) return 0;
   interp_perl = perl_alloc();
   perl_construct(interp_perl);
index 9de064d958f877f83b92dd7dd3b0b1e650b3b6f5..2dfc9af8ee8cbd4f93b7d53cedc581c2ac1f531f 100644 (file)
@@ -344,6 +344,7 @@ static optionlist optionlist_config[] = {
 #ifdef EXIM_PERL
   { "perl_at_start",            opt_bool,        &opt_perl_at_start },
   { "perl_startup",             opt_stringptr,   &opt_perl_startup },
+  { "perl_taintmode",           opt_bool,        &opt_perl_taintmode },
 #endif
 #ifdef LOOKUP_PGSQL
   { "pgsql_servers",            opt_stringptr,   &pgsql_servers },