2020-01-16T00:24:51 hajWo liegt denn Dein Risiko / Problem?
2020-01-16T07:06:38 biancaEigentlich beides keine Risiken und ist auch sozusagen nur im privaten Umfeld aber lieber einmal mehr gefragt als über etwas unüberlegtes zu stolpern.
2020-01-17T08:19:41 hajdenn die Logik "kein @ARGV => Web-Aufruf" erscheint mir etwas verquer.
2020-01-17T08:19:41 hajfür den Browser erst mal keine Response außer "Job gestartet" und brauchst eine zweite Funktion, um das Ergebnis abzuholen.
2020-01-17T11:12:23 bianca2020-01-17T08:19:41 hajdenn die Logik "kein @ARGV => Web-Aufruf" erscheint mir etwas verquer.
Anders herum habe ich es: @ARGV belegt = Cron Aufruf
1 2 3
my $classfile = $class; # Admin::FileMan $classfile =~ s|::|/|g; # Admin/Fileman require "$classfile.pm"; # Admin/Fileman.pm
1 2 3 4 5
if ($data =~ /^([-\@\w.]+)$/) { $data = $1; # $data now untainted } else { die "Bad data in '$data'"; # log this somewhere }
1
2
3
4
5
6
7
$ perl -T test_taint.pl Foo::Bar
47.11
$ perl -T test_taint.pl Foo::..::Bar
'untaint' fehlgeschlagen.
$
2020-01-19T10:53:07 rosti[...]
daß sowas mit -T in der shebang nicht durchgeht. Wobei in $class eine Klasse steht die ich selbst da reingeschrieben habe, die wird aus der Routingtable (Binärdatei) gelesen.
2020-01-19T10:53:07 rostiNun, interessant deswegen, weil es Frameworks gibt, da steht der Name der Klasse im URL!
Aber meine Frage ist natürlich, was ich tun muss damit meine Klasse mit -T geladen werden kann.
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/env -S perl -T use strict; use warnings; use 5.020; use Scalar::Util qw(tainted); sub untaint_unchecked { ($_[0] =~ /(.*)/)[0]; } sub check_taint { my ($name,$var) = @_;; my $tainted = tainted($var) ? '' : ' nicht'; say "$name mit Wert '$var' ist$tainted verdorben"; } check_taint("Umgebungsvariable HOME", $ENV{HOME}); my $var = $ENV{HOME} =~ s!/!::!gr; check_taint("Modifizierte Kopie",$var); my $laundered = untaint_unchecked($var); check_taint("Reingewaschene Variable",$laundered);
QuoteDabei kann man, wen man der Quelle vertraut, auch mogeln und im regulären Ausdruck einfach alles von vorn bis hinten mit qr/(.*)/
QuoteIch hatte mit einigen Produkten zu tun, bei denen "von draußen" nicht so klar definiert ist.
2020-01-20T21:00:37 rostiDann zeige doch mal ein Beispiel wie man -t hilfreich nutzen kann. Also nachvollziehbar. MFG
2020-01-20T21:00:37 rostiPS:
QuoteIch hatte mit einigen Produkten zu tun, bei denen "von draußen" nicht so klar definiert ist.
Also ich dachte genau das ist das was -t macht: Zu erkennen was von draußen kommt und als tainted (verdorben) zu taggn.
2020-01-21T07:45:03 rostiScenarios sind eine spekulative Angelegenheit.
Quoteim aktuellen Verzeichnis des Prozesses) manipulierte Bibliotheken ablegt, die das Skript dann anstelle derer vom System oder von PostgreSQL benutzt.
QuoteDie Entwickler der Skripten gehen davon aus, dass die Bibliotheken auf den in Perl konfigurierten Pfaden nur mit Root-Rechten zu manipulieren sind
2020-01-16T13:59:14 GwenDragonNiemals sollte sin Perl-Programm externen Variablen und Parametern vertrauen.
Interessant dazu: https://media.ccc.de/v/32c3-7130-the_perl_jam_2
2020-01-16T13:59:14 GwenDragonWenn eins es sicher will:
- nutzt den Schalter -t im Shebang (das aktviert den Taint-Mode)
- prüft per regex was in @ARGV drin steht
- sinnvollerweise nie so eben mal mit <> einlesen
QuoteAber ernsthaft: Wenn Du prüfst, woher Deine Programme ihre Einträge in @INC beziehen, dann solltest Du diesem Problem schnell auf die Spur kommen.
use lib qw(...);
set_include_path(get_include_path().PATH_SEPARATOR.LIBDIR);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
#! /usr/bin/perl -T use strict; use warnings; use 5.020; use FindBin; use File::Spec; use Cwd qw( realpath ); use Scalar::Util qw( tainted ); our @LIB_DIRS; BEGIN { # build paths for different library directories # all are tainted because of $FindBin::Bin and realpath (which removes the /../ from the paths) # this script is located inside cgi-bin; and the lib directories are in parallel directories @LIB_DIRS = map { realpath( File::Spec->catdir( $FindBin::Bin, '..', $_ ) ) } qw( lib perl5lib stay-tainted ); # untaint dirs for ( @LIB_DIRS ) { if ( m|^([\w/]+)$|i ) { $_ = $1; } else { # better die here #die "$_ is an insecure path\n"; } } } use lib @LIB_DIRS; ### check for tainted directories say tainted($_). " $_" for @INC; # Now #use MyModule1; #use MyModule2;
2020-01-23T07:30:42 rostiUnd noch etwas: Der Taintmodus -T warnt nicht, wenn $ENV{QUERY_STRING} im Script verwendet wird und warnt nicht bei der Verwendung von @ARGV und warnt auch nicht bei der Verwendung von ARGV. Siehe mein Beispiel.
2020-01-23T07:30:42 rostiUnd wenn man bei einem CGI-Script die Warnungen nicht in den Status einer Exception erhebt so daß sie einen 500er hervorrufen, bekommt man sie nur mit wenn man zufällig mal ins Errorlog schaut.
MFG
2020-01-23T10:15:40 rostiIm Gegensatz zu PHP kann man in Perl dafür sorgen, daß auch ein 500er Status mit einem aussagekräftigen Text im Browser erscheint, so daß man nicht im Errorlog nachschauen muss.