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>
Thu, 7 Apr 2016 07:45:33 +0000 (09:45 +0200)
16 files changed:
doc/doc-docbook/spec.xfpt
doc/doc-txt/ChangeLog
doc/doc-txt/NewStuff
src/conf [new file with mode: 0644]
src/src/globals.c
src/src/globals.h
src/src/perl.c
src/src/readconf.c
test/confs/3001
test/confs/3002
test/confs/3011 [new file with mode: 0644]
test/confs/3012 [new file with mode: 0644]
test/scripts/3000-Perl/3011 [new file with mode: 0644]
test/scripts/3000-Perl/3012 [new symlink]
test/stdout/3011 [new file with mode: 0644]
test/stdout/3012 [new file with mode: 0644]

index e30f17cc0939540131e3b81dbf1fde921ef3f718..5eb3d1909386470b10ba2ee08fa88d477ec36606 100644 (file)
@@ -12977,6 +12977,17 @@ 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.
 
+.new
+.ilist
+.oindex "&%perl_taintmode%&"
+.cindex "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.
+.wen
+
 
 .section "Calling Perl subroutines" "SECID86"
 When the configuration file includes a &%perl_startup%& option you can make use
@@ -13505,6 +13516,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
 
 
@@ -15622,14 +15634,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 6c55bd82c47cb10e8ea33fda424e54f813b2a8dc..496e9d07e245702571453dd2665ad670e3b599fe 100644 (file)
@@ -329,6 +329,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
 -----------------
index 4f369bc6513e084849468940a6f212f5a7c45895..07e6f1dba0e15ae6501255db5089569381824102 100644 (file)
@@ -9,6 +9,9 @@ the documentation is updated, this file is reduced to a short list.
 Version 4.88
 ------------
 
+ 1. The new perl_tainmode option allows to run the embedded perl
+    interpreter in taint mode.
+
 
 Version 4.87
 ------------
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 8e5a4dfe8e53353f30d263c5bbd0d9b4b1633348..be1fae849298ddb732d941136e7f27e5bffb05c1 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 5a0b79eb185156aa8922ffab2b495ca876c66f98..72bb13919f76b90f5aa8de06a023b62d9d3ae0e6 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 5ca6a84761b6832a630135108d05a94f4bc3f716..ba4cb668b51d1db832bb8da05238e8b5a7c7eb83 100644 (file)
@@ -349,6 +349,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 },
index 86ecee108b9eefca52a9a66d6bb93b7bf423dc15..bc0e7e771a7a890e9cc9ae05fd491094459184e3 100644 (file)
@@ -1,4 +1,4 @@
-# exim test configuration 0615
+# exim test configuration 3001
 exim_path = EXIM_PATH
 tls_advertise_hosts =
 spool_directory = DIR/spool
index 7962d97344c6ded372fc7e3e45062d8b0e184497..9b668f0027c90cc021b13bcb3290ab75fce98dbb 100644 (file)
@@ -1,4 +1,4 @@
-# exim test configuration 0616
+# exim test configuration 3002
 exim_path = EXIM_PATH
 keep_environment = ^FOO\d : BAR
 add_environment = ADDED1=added1 : ADDED2=added2
diff --git a/test/confs/3011 b/test/confs/3011
new file mode 100644 (file)
index 0000000..f584ff5
--- /dev/null
@@ -0,0 +1,5 @@
+# exim test configuration 3011
+exim_path = EXIM_PATH
+tls_advertise_hosts =
+spool_directory = DIR/spool
+perl_startup = sub taint_flag { ${^TAINT} ? 'ON' : 'OFF' }
diff --git a/test/confs/3012 b/test/confs/3012
new file mode 100644 (file)
index 0000000..505e49f
--- /dev/null
@@ -0,0 +1,7 @@
+# exim test configuration 3012
+exim_path = EXIM_PATH
+keep_environment = ^FOO\d : BAR
+add_environment = ADDED1=added1 : ADDED2=added2
+tls_advertise_hosts =
+perl_startup = sub taint_flag { ${^TAINT} ? 'ON' : 'OFF' }
+perl_taintmode = yes
diff --git a/test/scripts/3000-Perl/3011 b/test/scripts/3000-Perl/3011
new file mode 100644 (file)
index 0000000..87b32e7
--- /dev/null
@@ -0,0 +1,3 @@
+# Perl w/o taintmode
+exim -be '${perl{taint_flag}}'
+****
diff --git a/test/scripts/3000-Perl/3012 b/test/scripts/3000-Perl/3012
new file mode 120000 (symlink)
index 0000000..3ae81fb
--- /dev/null
@@ -0,0 +1 @@
+3011
\ No newline at end of file
diff --git a/test/stdout/3011 b/test/stdout/3011
new file mode 100644 (file)
index 0000000..6506cb3
--- /dev/null
@@ -0,0 +1 @@
+OFF
diff --git a/test/stdout/3012 b/test/stdout/3012
new file mode 100644 (file)
index 0000000..76371f2
--- /dev/null
@@ -0,0 +1 @@
+ON