1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
#!/usr/bin/perl -t use strict; use warnings; use Data::Dumper; require parse_eav_file; $SIG{__WARN__} = sub { die @_ }; print eval{ my $m = bless{ CONTENT => 'Hallo!' }; my $eav = $m->parse_eav_file("..."); my $class = $eav->{'/'}{class}; my $classfile = $class; $classfile =~ s|::|/|g; $classfile =~ s|\w||g; # Leerstring! require "$classfile.pm"; # Insecure dependency in require while running with -t switch at .. "Content-Type: text/plain; Charset=utf-8\n\n".$m->{CONTENT}; } || "Content-Type: text/plain; Charset=utf-8\n\n$@";
1 2 3 4 5 6 7 8 9 10
#! /usr/bin/perl -T use strict; use warnings; use 5.010; use Scalar::Util qw( tainted ); my $string = shift @ARGV // 'default'; say "'$string' is tainted: ", tainted($string);
1
2
3
4
5
6
7
8
$ perl -T t3.pl
'default' is tainted: 0
$ perl -T t3.pl "foo"
'foo' is tainted: 1
$ perl -T t3.pl ""
'' is tainted: 1
my $r = $dbh->selectall_arrayref("select * from forum where mesgid=?", {Slice=>{}}, $ENV{QUERY_STRING});
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#!/usr/bin/perl -t use strict; use warnings; $SIG{__WARN__} = sub { die @_ }; print eval{ my $m = bless{ CONTENT => 'Hallo!' }; my $file = $ENV{QUERY_STRING}; unshift @ARGV, $file; local $/ = undef; $m->{CONTENT} = <>; "Content-Type: text/plain; Charset=utf-8\n\n".$m->{CONTENT}; } || "Content-Type: text/plain; Charset=utf-8\n\n$@";
1 2 3 4 5 6 7 8 9 10 11 12 13
#! /usr/bin/perl -T use strict; use warnings; use 5.020; use Scalar::Util qw( tainted ); my $tainted_filename = shift // die "Specify a filename.\n"; # Nicht das 3-Argument-Open; d.h. der Modus *kann* im Dateinamen stecken open( my $fh, $tainted_filename ) or die "open($tainted_filename) failed: $!\n"; print $_ for <$fh>; close $fh;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# trotz tainted wird die Datei gelesen und ausgegeben; weil es keine kritische Situation im Sinne des tainted ist
# einfaches Dateilesen ist nicht per se böse; gleiches gilt bei Deinem Lesen der C:/boot.ini
$ perl -T /tmp/t.pl /etc/passwd
root:x:0:0:root:/root:/bin/bash
...
# Pipes können böse sein, weil evtl. unbekannte/unerwünschte Programm aufgerufen werden könnten
# Hier schlägt eben das tainted $ENV{PATH} zu.
$ perl -T /tmp/t.pl "echo Hello|"
Insecure $ENV{PATH} while running with -T switch at /tmp/t.pl line 10.
# Taint schlägt auch bei Ausgabeumleitungen im Dateinamen zu (2-Argument-open())
perl -T /tmp/t.pl ">> /tmp/foo"
Insecure dependency in open while running with -T switch at /tmp/t.pl line 10.
# Einlesen ist wieder weniger kritisch und erstmal OK
$ perl -T /tmp/t.pl "< /tmp/foo"
open(< /tmp/foo) failed: No such file or directory
my $dbh = DBI->connect( 'dbi:SQLite:dbname=db1', "", "", {Taint=>1} ) or die $DBI::errstr;
2020-01-22T07:35:14 rostiHat Dir das schonmal geholfen eine Sicherheitslücke zu verhindern? Welche Du ohne Taintmodus nicht erkannt hättest?
…
Anders ausgedrückt: Man kann sich auf den Taintmodus eben nicht verlassen!