Thread Fragen zum Taintmodus (13 answers)
Opened by rosti at 2020-01-21 10:20

Linuxer
 2020-01-21 22:46
#191175 #191175
User since
2006-01-27
3869 Artikel
HausmeisterIn

user image
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:
Code (perl): (dl )
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;


Code: (dl )
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 Perldoc:perlop nur ein 2-Argument-Open verwendet.
Sicherer wäre die Verwendung von <<>>; für Weiteres siehe Perldoc: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!

View full thread Fragen zum Taintmodus