This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Document offset hack
[perl5.git] / pod / perlsec.pod
1 =head1 NAME
2
3 perlsec - Perl security
4
5 =head1 DESCRIPTION
6
7 Perl is designed to make it easy to program securely even when running
8 with extra privileges, like setuid or setgid programs.  Unlike most
9 command line shells, which are based on multiple substitution passes on
10 each line of the script, Perl uses a more conventional evaluation scheme
11 with fewer hidden snags.  Additionally, because the language has more
12 builtin functionality, it can rely less upon external (and possibly
13 untrustworthy) programs to accomplish its purposes.
14
15 Perl automatically enables a set of special security checks, called I<taint
16 mode>, when it detects its program running with differing real and effective
17 user or group IDs.  The setuid bit in Unix permissions is mode 04000, the
18 setgid bit mode 02000; either or both may be set.  You can also enable taint
19 mode explicitly by using the B<-T> command line flag. This flag is
20 I<strongly> suggested for server programs and any program run on behalf of
21 someone else, such as a CGI script. Once taint mode is on, it's on for
22 the remainder of your script.
23
24 While in this mode, Perl takes special precautions called I<taint
25 checks> to prevent both obvious and subtle traps.  Some of these checks
26 are reasonably simple, such as verifying that path directories aren't
27 writable by others; careful programmers have always used checks like
28 these.  Other checks, however, are best supported by the language itself,
29 and it is these checks especially that contribute to making a set-id Perl
30 program more secure than the corresponding C program.
31
32 You may not use data derived from outside your program to affect
33 something else outside your program--at least, not by accident.  All
34 command line arguments, environment variables, locale information (see
35 L<perllocale>), results of certain system calls (readdir(),
36 readlink(), the variable of shmread(), the messages returned by
37 msgrcv(), the password, gcos and shell fields returned by the
38 getpwxxx() calls), and all file input are marked as "tainted".
39 Tainted data may not be used directly or indirectly in any command
40 that invokes a sub-shell, nor in any command that modifies files,
41 directories, or processes. (B<Important exception>: If you pass a list
42 of arguments to either C<system> or C<exec>, the elements of that list
43 are B<NOT> checked for taintedness.) Any variable set to a value
44 derived from tainted data will itself be tainted, even if it is
45 logically impossible for the tainted data to alter the variable.
46 Because taintedness is associated with each scalar value, some
47 elements of an array can be tainted and others not.
48
49 For example:
50
51     $arg = shift;               # $arg is tainted
52     $hid = $arg, 'bar';         # $hid is also tainted
53     $line = <>;                 # Tainted
54     $line = <STDIN>;            # Also tainted
55     open FOO, "/home/me/bar" or die $!;
56     $line = <FOO>;              # Still tainted
57     $path = $ENV{'PATH'};       # Tainted, but see below
58     $data = 'abc';              # Not tainted
59
60     system "echo $arg";         # Insecure
61     system "/bin/echo", $arg;   # Secure (doesn't use sh)
62     system "echo $hid";         # Insecure
63     system "echo $data";        # Insecure until PATH set
64
65     $path = $ENV{'PATH'};       # $path now tainted
66
67     $ENV{'PATH'} = '/bin:/usr/bin';
68     delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
69
70     $path = $ENV{'PATH'};       # $path now NOT tainted
71     system "echo $data";        # Is secure now!
72
73     open(FOO, "< $arg");        # OK - read-only file
74     open(FOO, "> $arg");        # Not OK - trying to write
75
76     open(FOO,"echo $arg|");     # Not OK, but...
77     open(FOO,"-|")
78         or exec 'echo', $arg;   # OK
79
80     $shout = `echo $arg`;       # Insecure, $shout now tainted
81
82     unlink $data, $arg;         # Insecure
83     umask $arg;                 # Insecure
84
85     exec "echo $arg";           # Insecure
86     exec "echo", $arg;          # Secure (doesn't use the shell)
87     exec "sh", '-c', $arg;      # Considered secure, alas!
88
89     @files = <*.c>;             # insecure (uses readdir() or similar)
90     @files = glob('*.c');       # insecure (uses readdir() or similar)
91
92 If you try to do something insecure, you will get a fatal error saying
93 something like "Insecure dependency" or "Insecure $ENV{PATH}".  Note that you
94 can still write an insecure B<system> or B<exec>, but only by explicitly
95 doing something like the "considered secure" example above.
96
97 =head2 Laundering and Detecting Tainted Data
98
99 To test whether a variable contains tainted data, and whose use would thus
100 trigger an "Insecure dependency" message, check your nearby CPAN mirror
101 for the F<Taint.pm> module, which should become available around November
102 1997.  Or you may be able to use the following I<is_tainted()> function.
103
104     sub is_tainted {
105         return ! eval {
106             join('',@_), kill 0;
107             1;
108         };
109     }
110
111 This function makes use of the fact that the presence of tainted data
112 anywhere within an expression renders the entire expression tainted.  It
113 would be inefficient for every operator to test every argument for
114 taintedness.  Instead, the slightly more efficient and conservative
115 approach is used that if any tainted value has been accessed within the
116 same expression, the whole expression is considered tainted.
117
118 But testing for taintedness gets you only so far.  Sometimes you have just
119 to clear your data's taintedness.  The only way to bypass the tainting
120 mechanism is by referencing subpatterns from a regular expression match.
121 Perl presumes that if you reference a substring using $1, $2, etc., that
122 you knew what you were doing when you wrote the pattern.  That means using
123 a bit of thought--don't just blindly untaint anything, or you defeat the
124 entire mechanism.  It's better to verify that the variable has only good
125 characters (for certain values of "good") rather than checking whether it
126 has any bad characters.  That's because it's far too easy to miss bad
127 characters that you never thought of.
128
129 Here's a test to make sure that the data contains nothing but "word"
130 characters (alphabetics, numerics, and underscores), a hyphen, an at sign,
131 or a dot.
132
133     if ($data =~ /^([-\@\w.]+)$/) {
134         $data = $1;                     # $data now untainted
135     } else {
136         die "Bad data in $data";        # log this somewhere
137     }
138
139 This is fairly secure because C</\w+/> doesn't normally match shell
140 metacharacters, nor are dot, dash, or at going to mean something special
141 to the shell.  Use of C</.+/> would have been insecure in theory because
142 it lets everything through, but Perl doesn't check for that.  The lesson
143 is that when untainting, you must be exceedingly careful with your patterns.
144 Laundering data using regular expression is the I<only> mechanism for
145 untainting dirty data, unless you use the strategy detailed below to fork
146 a child of lesser privilege.
147
148 The example does not untaint $data if C<use locale> is in effect,
149 because the characters matched by C<\w> are determined by the locale.
150 Perl considers that locale definitions are untrustworthy because they
151 contain data from outside the program.  If you are writing a
152 locale-aware program, and want to launder data with a regular expression
153 containing C<\w>, put C<no locale> ahead of the expression in the same
154 block.  See L<perllocale/SECURITY> for further discussion and examples.
155
156 =head2 Switches On the "#!" Line
157
158 When you make a script executable, in order to make it usable as a
159 command, the system will pass switches to perl from the script's #!
160 line.  Perl checks that any command line switches given to a setuid
161 (or setgid) script actually match the ones set on the #! line.  Some
162 Unix and Unix-like environments impose a one-switch limit on the #!
163 line, so you may need to use something like C<-wU> instead of C<-w -U>
164 under such systems.  (This issue should arise only in Unix or
165 Unix-like environments that support #! and setuid or setgid scripts.)
166
167 =head2 Cleaning Up Your Path
168
169 For "Insecure C<$ENV{PATH}>" messages, you need to set C<$ENV{'PATH'}> to a
170 known value, and each directory in the path must be non-writable by others
171 than its owner and group.  You may be surprised to get this message even
172 if the pathname to your executable is fully qualified.  This is I<not>
173 generated because you didn't supply a full path to the program; instead,
174 it's generated because you never set your PATH environment variable, or
175 you didn't set it to something that was safe.  Because Perl can't
176 guarantee that the executable in question isn't itself going to turn
177 around and execute some other program that is dependent on your PATH, it
178 makes sure you set the PATH.
179
180 The PATH isn't the only environment variable which can cause problems.
181 Because some shells may use the variables IFS, CDPATH, ENV, and
182 BASH_ENV, Perl checks that those are either empty or untainted when
183 starting subprocesses. You may wish to add something like this to your
184 setid and taint-checking scripts.
185
186     delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};   # Make %ENV safer
187
188 It's also possible to get into trouble with other operations that don't
189 care whether they use tainted values.  Make judicious use of the file
190 tests in dealing with any user-supplied filenames.  When possible, do
191 opens and such B<after> properly dropping any special user (or group!)
192 privileges. Perl doesn't prevent you from opening tainted filenames for reading,
193 so be careful what you print out.  The tainting mechanism is intended to
194 prevent stupid mistakes, not to remove the need for thought.
195
196 Perl does not call the shell to expand wild cards when you pass B<system>
197 and B<exec> explicit parameter lists instead of strings with possible shell
198 wildcards in them.  Unfortunately, the B<open>, B<glob>, and
199 backtick functions provide no such alternate calling convention, so more
200 subterfuge will be required.
201
202 Perl provides a reasonably safe way to open a file or pipe from a setuid
203 or setgid program: just create a child process with reduced privilege who
204 does the dirty work for you.  First, fork a child using the special
205 B<open> syntax that connects the parent and child by a pipe.  Now the
206 child resets its ID set and any other per-process attributes, like
207 environment variables, umasks, current working directories, back to the
208 originals or known safe values.  Then the child process, which no longer
209 has any special permissions, does the B<open> or other system call.
210 Finally, the child passes the data it managed to access back to the
211 parent.  Because the file or pipe was opened in the child while running
212 under less privilege than the parent, it's not apt to be tricked into
213 doing something it shouldn't.
214
215 Here's a way to do backticks reasonably safely.  Notice how the B<exec> is
216 not called with a string that the shell could expand.  This is by far the
217 best way to call something that might be subjected to shell escapes: just
218 never call the shell at all.  
219
220     use English;
221     die "Can't fork: $!" unless defined $pid = open(KID, "-|");
222     if ($pid) {           # parent
223         while (<KID>) {
224             # do something
225         }
226         close KID;
227     } else {
228         my @temp = ($EUID, $EGID);
229         $EUID = $UID;
230         $EGID = $GID;    #      initgroups() also called!
231         # Make sure privs are really gone
232         ($EUID, $EGID) = @temp;
233         die "Can't drop privileges" 
234                 unless $UID == $EUID  && $GID eq $EGID; 
235         $ENV{PATH} = "/bin:/usr/bin";
236         exec 'myprog', 'arg1', 'arg2' 
237             or die "can't exec myprog: $!";
238     }
239
240 A similar strategy would work for wildcard expansion via C<glob>, although
241 you can use C<readdir> instead.
242
243 Taint checking is most useful when although you trust yourself not to have
244 written a program to give away the farm, you don't necessarily trust those
245 who end up using it not to try to trick it into doing something bad.  This
246 is the kind of security checking that's useful for set-id programs and
247 programs launched on someone else's behalf, like CGI programs.
248
249 This is quite different, however, from not even trusting the writer of the
250 code not to try to do something evil.  That's the kind of trust needed
251 when someone hands you a program you've never seen before and says, "Here,
252 run this."  For that kind of safety, check out the Safe module,
253 included standard in the Perl distribution.  This module allows the
254 programmer to set up special compartments in which all system operations
255 are trapped and namespace access is carefully controlled.
256
257 =head2 Security Bugs
258
259 Beyond the obvious problems that stem from giving special privileges to
260 systems as flexible as scripts, on many versions of Unix, set-id scripts
261 are inherently insecure right from the start.  The problem is a race
262 condition in the kernel.  Between the time the kernel opens the file to
263 see which interpreter to run and when the (now-set-id) interpreter turns
264 around and reopens the file to interpret it, the file in question may have
265 changed, especially if you have symbolic links on your system.
266
267 Fortunately, sometimes this kernel "feature" can be disabled.
268 Unfortunately, there are two ways to disable it.  The system can simply
269 outlaw scripts with any set-id bit set, which doesn't help much.
270 Alternately, it can simply ignore the set-id bits on scripts.  If the
271 latter is true, Perl can emulate the setuid and setgid mechanism when it
272 notices the otherwise useless setuid/gid bits on Perl scripts.  It does
273 this via a special executable called B<suidperl> that is automatically
274 invoked for you if it's needed.
275
276 However, if the kernel set-id script feature isn't disabled, Perl will
277 complain loudly that your set-id script is insecure.  You'll need to
278 either disable the kernel set-id script feature, or put a C wrapper around
279 the script.  A C wrapper is just a compiled program that does nothing
280 except call your Perl program.   Compiled programs are not subject to the
281 kernel bug that plagues set-id scripts.  Here's a simple wrapper, written
282 in C:
283
284     #define REAL_PATH "/path/to/script"
285     main(ac, av)
286         char **av;
287     {
288         execv(REAL_PATH, av);
289     }
290
291 Compile this wrapper into a binary executable and then make I<it> rather
292 than your script setuid or setgid.
293
294 In recent years, vendors have begun to supply systems free of this
295 inherent security bug.  On such systems, when the kernel passes the name
296 of the set-id script to open to the interpreter, rather than using a
297 pathname subject to meddling, it instead passes I</dev/fd/3>.  This is a
298 special file already opened on the script, so that there can be no race
299 condition for evil scripts to exploit.  On these systems, Perl should be
300 compiled with C<-DSETUID_SCRIPTS_ARE_SECURE_NOW>.  The B<Configure>
301 program that builds Perl tries to figure this out for itself, so you
302 should never have to specify this yourself.  Most modern releases of
303 SysVr4 and BSD 4.4 use this approach to avoid the kernel race condition.
304
305 Prior to release 5.6.1 of Perl, bugs in the code of B<suidperl> could
306 introduce a security hole.
307
308 =head2 Protecting Your Programs
309
310 There are a number of ways to hide the source to your Perl programs,
311 with varying levels of "security".
312
313 First of all, however, you I<can't> take away read permission, because
314 the source code has to be readable in order to be compiled and
315 interpreted.  (That doesn't mean that a CGI script's source is
316 readable by people on the web, though.)  So you have to leave the
317 permissions at the socially friendly 0755 level.  This lets 
318 people on your local system only see your source.
319
320 Some people mistakenly regard this as a security problem.  If your program does
321 insecure things, and relies on people not knowing how to exploit those
322 insecurities, it is not secure.  It is often possible for someone to
323 determine the insecure things and exploit them without viewing the
324 source.  Security through obscurity, the name for hiding your bugs
325 instead of fixing them, is little security indeed.
326
327 You can try using encryption via source filters (Filter::* from CPAN).
328 But crackers might be able to decrypt it.  You can try using the
329 byte code compiler and interpreter described below, but crackers might
330 be able to de-compile it.  You can try using the native-code compiler
331 described below, but crackers might be able to disassemble it.  These
332 pose varying degrees of difficulty to people wanting to get at your
333 code, but none can definitively conceal it (this is true of every
334 language, not just Perl).
335
336 If you're concerned about people profiting from your code, then the
337 bottom line is that nothing but a restrictive licence will give you
338 legal security.  License your software and pepper it with threatening
339 statements like "This is unpublished proprietary software of XYZ Corp.
340 Your access to it does not give you permission to use it blah blah
341 blah."  You should see a lawyer to be sure your licence's wording will
342 stand up in court.
343
344 =head1 SEE ALSO
345
346 L<perlrun> for its description of cleaning up environment variables.