Alexander (HH): Tainted Love again, .pl vs .cgi - Lese-Wink an Alexander(HH)

Beitrag lesen

Moin Moin!

tainted_test.PL -> 500er
tainted_test.CGI -> funzt(TM)

Ersteres ist kaputt, siehe error_log.

Würde bedeuten, der »Tainted Mode« ist nur für Skripts mit der Endung .cgi reserviert?

Nein. Tainted Mode hat nichts mit Dateiendungen oder URLs zu tun.

Der lokale Apache schreibt in die error.log:

[Fri Jan 25 12:37:55 2008] [error] [client 192.168.0.1] Premature end of script headers: tainted_test.pl
[Fri Jan 25 12:37:55 2008] [error] [client 192.168.0.1] "-T" is on the #! line, it must also be used on the command line at /.../tainted_test.pl line 1.\r

Du rufst ein Script mit "#!/usr/bin/perl -T" indirekt via perl executable auf, ohne dort ebenfalls -T zu benutzen.

perl taint_mode_script.pl

wird nie funktionieren, es muß immer

perl -T taint_mode_script.pl

heißen.

Hast Du mod_perl aktiviert, dass auf .pl via Apache::Registry reagiert und zudem OHNE Taint-Mode läuft? Letzteres wäre ohnehin nicht sehr clever.

Das würde den beobachteten Unterschied zwischen .pl (via mod_perl und Apache::Registry) und .cgi (via mod_cgi und /usr/bin/perl) erklären. Beim direkten Aufruf des Scripts zerlegt der OS-Kernel die erste Zeile des Scripts in Interpreter-Programm und Kommandozeilen-Parameter, und hängt schließlich den Script-Namen und die Original-Parameter an.

  
execl("/usr/bin/script.pl","/usr/bin/script.pl","foo","bar",NULL);  

macht, wenn Zeile 1 von /usr/bin/script.pl wie folgt ist,

  
#!/usr/bin/perl -w -T  

exakt das selbe wie

  
execl("/usr/bin/perl","/usr/bin/perl","-w","-T","/usr/bin/script.pl","foo","bar",NULL);  

Weil Perl beim -T-Parameter aber paranoid wird, ist das, anders als bei allen anderen Kommandozeilen-Parameter, nicht identisch mit

  
execl("/usr/bin/perl","/usr/bin/perl","/usr/bin/script.pl","foo","bar",NULL);  

-w und andere Parameter pickt sich Perl auch selbst aus der Zeile 1, wenn der Interpreter schon läuft, aber der Taint-Mode muß aktiviert werden, BEVOR der Interpreter läuft. Daher bleiben an dieser Stelle nur zwei Möglichkeiten: Taint-Modus trotz anders lautenden Instruktionen ausgeschaltet lassen und unsicher weiter arbeiten, oder aber laut Zeter und Mordio schreien. Unter Sicherheitsaspekten ist nur die letzte Möglichkeit sinnvoll.

Unter Windows mußt Du im Apachen "ScriptInterpreterSource Registry" auskommentieren bzw. auf script ändern, damit der Apache die Bemühungen eines Unix-Kernels simuliert, und die #!-Zeile auf "#!C:/perl/bin/perl.exe -T -w" ändern.

Ich lasse mir hier zusätzlich @INC ausgeben, weil ich festgestellt habe, dass "." im Tainted Mode nicht mehr ausgegeben wird:

Richtig. Das ist so gewollt und auch in perlsec dokumentiert.

not_tainted.cgi

Gibt es eine _deutschprachige_ Seite, auf welcher genau erklärt wird, was -T alles bewirkt?

use English; # ;-)

perldoc perlsec

http://wiki.perl-community.de/bin/view/Perldoc/PerlDokumentListe ist ein bescheidener Anfang.

babelfish ist nicht wirklich gut, eher lustig ...

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".