Mir scheint da ein Missverständnis vorzuliegen, was der Taint-Modus leistet; oder es liegt eine sehr hoch hängende Erwartungshaltung vor.
Der Taint-Modus kann keine Wunder vollbringen.
In erster Linie kann er Dich unterstützen; aber die Gedanken, dein Programm sicher zu machen, musst Du Dir selber machen. Du als Programmierender musst dafür Sorge tragen, dass eingehende Daten überprüft werden.
Wenn Du das nicht tust, dann kann eben Deine C:/boot.ini gelesen werden.
haj hat zum Taint-Modus (auch in Bezug auf Web-Anwendungen) ja schon einiges Kluges geschrieben.
Weitere Tests:
1
2
3
4
5
6
7
8
9
10
11
12
13
use strict;
use warnings;
use 5.020;
use Scalar::Util qw( tainted );
my $tainted_filename = shift // die "Specify a filename.\n";
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
Sobald man die 3-Argument-Form des open() mit Lesemodus verwendet, sind auch die Fälle mit Pipe und Ausgabeumleitung für taint OK, weil der Modus im Programm festgelegt ist; dann kommt eher sowas:
open(>> /tmp/foo) failed: No such file or directory
Wenn man natürlich nun im aktuellen Verzeichnis eine Datei mit diesem Namen
>> /tmp/foo liegen hat, dann wird die eben gelesen. Wiederum unkritisch im Sinne des taint.
Die Verwendung von
<> ist hier ähnlich unsicher, weil es effektiv laut
perlop nur ein 2-Argument-Open verwendet.
Sicherer wäre die Verwendung von
<<>>; für Weiteres siehe
perlop (Stichwort: "null filehandle")
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!