Jemand zu Hause?
PSGI sind Anwendung und Webserver das gleiche Ding.
perlfunc system und ähnlichen Funktionen andere Skripte starten und dafür Parameter übergeben, die bei Perl-Skripten dann in @ARGV landen. Das ist bei Web-Interfaces, die über ein bestehendes CLI drübergestülpt werden, ein ganz gängiges Verfahren.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
Scalar::Utils tainted Funktion kann aufzeigen, ob ein Skalar "tainted" ist oder nicht.
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 }
QuoteDu musst Dir den Regex schon selber zusammenbauen, so dass er für Dich passt
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.
$
QuoteDie Regex muss das abdecken, was im jeweiligen Anwendungsfall korrekt sein soll.
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.
perl5260delta auch beschrieben. PERl5LIB ist noch gefährlicher, denn es wird vor die anderen Einträge in @INC gesetzt, während "." "nur" der letzte Eintrag in älteren Perl-Versionen ist.
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
Henry Spencer war wohl der erste, der Perl als die "Swiss Army Chainsaw of scripting" bezeichnet hat...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
perlsec steht:
Plack) funktionieren einfach nicht mit Taint-Mode. Wenn man die trotzdem braucht oder verwenden will, kann man -T nicht verwenden, Unit Tests mit Taint-Prüfung werden noch wichtiger.
local::lib.
File::Temp verhält sich auch "anders", weil normalerweise die Default-Directories in Umgebungsvariablen stehen. Und die sind "tainted", werden also ignoriert.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);
FindBin tainted und sollte bei Nutzung gesäubert werden.
Cwd::realpath() ist ebenfalls tainted.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
perlrun noch einmal genau anschauen. In beiden Beispielen verwendest Du als Schalter -t und nicht -T. -t warnt, -T stirbt.
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.
Wie installiert man ein Modul?