open(mail "|$mailprog -t...im -T modus
Alain
- perl
0 Alain
Hallo,
also ich möchte nochmal zum thema vom 16.july.2003 http://forum.de.selfhtml.org/archiv/2003/7/52570/
was sagen,wo ich ein problem hatte im -T (taint modus) das mailprogramm zu starten.
Ich habs nun rausgefunden es war also doch der systemaufruf für den open (mail "|$mailprog...
wenn man da den $ENV{PATH} declariert dann gehts im taint modus.
Richtiges beispiel:
$ENV{"PATH"} = "";
open (MAIL, "|$mailprog -t") || &Dead();
print MAIL "To: $mailto\n";
wenn ich $ENV{"PATH"} = "|"; schreibe dann gehts auch nicht?! nur ohne.
Gruss vom Alain
Hallo nochmal,
dies las ich bei
http://gunther.web66.com/FAQS/taintmode.html
--------------------
The way around this problem is to clear the PATH environment variable so that Perl can trust that the
command passed as a system call is an absolute path to a command instead of being part of the search
path.
You might ask "What is unsafe about the path?". Historically, path's are considered unsafe because if
there are multiple versions of an executable, it is difficult to tell which one is actually being executed. If
there is a bug in one of the versions, then this can pose a security hazard.
Basically, before doing a system call, clear the PATH by issuing a statement like the following
$ENV{"PATH"} = "";
Note, this does not just apply to the system() call. It also applies to opening up files with the | symbol
(which executes a command) or using backticks `` to execute an external command. Of course, now you
will need to call the command using an absolute path.
------------------
meine frage dazu wäre noch,
was ist die genauere path angabe für den system aufruf "open (MAIL, "|$mailprog -t") || &Dead(); " ?
Gruss vom Alain
Halihallo Alain
Danke für die Erklärung, war mir neu.
was ist die genauere path angabe für den system aufruf "open (MAIL, "|$mailprog -t") || &Dead(); " ?
$mailprog = '/usr/sbin/sendmail'; # oder Äquvalente
einfach vom root aus adressieren, sodass das Programm eineindeutig adressiert ist
(also kein lookup in diverse /bin Verzeichnisse stattfinden muss um das Programm zu
"suchen"). Ein "absoluter Pfad" eben...
Viele Grüsse
Philipp
Hoi,
danke für die konkrete antwort .
$mailprog = '/usr/sbin/sendmail'; # oder Äquvalente
einfach vom root aus adressieren, sodass das Programm eineindeutig adressiert ist
(also kein lookup in diverse /bin Verzeichnisse stattfinden muss um das Programm zu
"suchen"). Ein "absoluter Pfad" eben...
also dann ist das $ENV{'PATH'} = '/bin:/usr/sbin/';
auch ok jedefalls funktionierts so auch im taint modus.
Gruss vom Alain
Halihallo Alain
$mailprog = '/usr/sbin/sendmail'; # oder Äquvalente
einfach vom root aus adressieren, sodass das Programm eineindeutig adressiert ist
(also kein lookup in diverse /bin Verzeichnisse stattfinden muss um das Programm zu
"suchen"). Ein "absoluter Pfad" eben...
also dann ist das $ENV{'PATH'} = '/bin:/usr/sbin/';
auch ok jedefalls funktionierts so auch im taint modus.
Das wiederspricht sich mit der Erklärung, die du gepostet hast. Dein oben genanntes
Beispiel definiert den Search-Path als entweder /bin oder /usr/sbin, somit könnte ein
Programm ohne absolute Pfadadressierung (z.B. über "./program" statt "program") in
zwei Verzeichnissen gefunden werden. Die verlinkte Ressource besagt, dass ein Programm
aber eineindeutig adressiert sein muss, da sonst eine von mehreren Versionen gefunden
werden kann, welche eben nicht "sicher" ist.
Beispiel:
$ENV{PATH} = '/bin:/usr/sbin';
system('try.pl')
sucht zuerst in /bin, dann in /usr/sbin. Wenn du dein try.pl in /usr/sbin erstellt hast,
dann aber ein anderer user ein try.pl in /bin ablegt, um deine Eingaben abzufangen, ist
dies "unsicher", da du auf die Korrektheit des anderen Programmes nicht zählen kannst.
Deshalb soll der Tainted-Modus nur absolute Pfade akzeptieren, sodass du sicher sein
kannst, dass dein Programm (also /usr/sbin/try.pl) ausgeführt wird und nicht ein anderes.
Aber warum hier der Tainted-Modus nicht Einspruch erhebt weiss ich nicht.
Viele Grüsse
Philipp
Hallo,
Aber warum hier der Tainted-Modus nicht Einspruch erhebt weiss ich nicht.
ja das find ich auch komisch,aber nach der englischen erklärung nehm ich mal an
dass das perl script im taint modus erst im /usr/bin/ verzeichniss nach dem mailprog sucht
und dann reklammiert im taint... wenn nicht vor dem öffnen des mailprogramms der andere pfad
/usr/sbin/ angegeben wird .Ich habe da auch was bei w3c http://www.w3.org/Security/faq/wwwsf4.html#CGI-Q17 gefunden .
-----------------------
OK, I turned on taint checks like you said. Now my script dies with
the message: "Insecure $ENV{PATH} at line XX" every time I try to run
it!
Even if you don't rely on the path when you invoke an external program, there's a chance that the invoked program might.
Therefore you need to include the following line towards the top of your script whenever you use taint checks:
$ENV{'PATH'} = '/bin:/usr/bin:/usr/local/bin';
Adjust this as necessary for the list of directories you want searched. It's not a good idea to include the current directory (".") in
the path.
----------------------
Gruss vom Alain
Halihallo Alain
Ich habe es mir jetzt selber angesehen:
aus http://gunther.web66.com/FAQS/taintmode.html#system:
---
When you make a system call to an external program or use its sister command, exec, taint mode also stops this from happening if the PATH has not been adjusted. Again, since a string is being passed to the system call, Perl generally has trouble figuring out whether a relative or absolute path to a command has been passed. Being in "paranoid" mode, Perl stops the command from executing.
The way around this problem is to clear the PATH environment variable so that Perl can trust that the command passed as a system call is an absolute path to a command instead of being part of the search path.
---
Also die Zeilen oberhalb deines Extracts im zweiten Posting. Sobald $ENV{PATH} auf
irgendetwas gesetzt wird, ist die Verwendung nicht tainted. Die Eineindeutigkeit muss
also nicht gegeben sein, nur, dass der Programmierer _genau_ definiert, wo seine
ausführbaren Programme sind (ansonsten ist PATH von der Umgebung entnommen, in der Perl
gestartet wurde und _das_ ist tainted).
$ENV{PATH} = ''; ist einfach _noch_ sicherer, da dann die Adressierung der Programme
nur auf absoluter Basis geschehen kann und somit auch die Eineindeutigkeit des Programmes
sichergestellt ist.
Viele Grüsse
Philipp
Hallo,
$ENV{PATH} = ''; ist einfach _noch_ sicherer, da dann die Adressierung der Programme
nur auf absoluter Basis geschehen kann und somit auch die Eineindeutigkeit des Programmes
sichergestellt ist.
AHA jetzt ist mir alles klar und klingt auch logischer.
Ich meine,warum sollte man den genauen pfad zweimal angeben,wenn gleich danach
der genaue pfad zum mailprog aufgerufen wird? Desshalb $ENV{'PATH'} = '';
Gruss vom Alain
Halihallo Alain
Ich meine,warum sollte man den genauen pfad zweimal angeben,wenn gleich danach
der genaue pfad zum mailprog aufgerufen wird? Desshalb $ENV{'PATH'} = '';
Es ist eigentlich ganz einfach, das habe ich aber auch erst nachher festgestellt :-) :
Es ist wie mit allen anderen Parameter: Kommen sie von aussen sind sie tainted, werden
sie im Programm umgestellt, oder durch RegExp geprüft sind sie akzeptiert.
Das mit der Reihenfolge der Pfade und der Eineindeutigkeit war eine Falscheinschätzung
von mir.
Viele Grüsse
Philipp