Wie kann ich invoke / sbin / iptables von einem Perl-CGI unter Taint-Modus?
Frage
Als ich invoke "sudo / sbin / iptables ..." in meinem Perl-CGI-Skripte, erhalte ich die Fehlermeldung:
Insecure dependency in system while running with -T switch at usr/lib/perl5/vendor_perl/5.8.8/IPC/Run3.pm line 403
Ich habe versucht, "/sbin:/etc/sysconf:/etc/init.d" in $ ENV hinzufügen { 'PATH'}, aber immer noch ohne Erfolg. Jeder hat eine Idee?
Lösung
Sie sollen den Weg beschränken, das heißt: es auf eine kleine Anzahl von bekannten Werten einstellen, die bestimmte Anforderungen (wie $ENV{PATH} = '/sbin:/usr/sbin:/usr/bin';
) erfüllen, nicht ihm hinzufügen. Siehe Reinigen Sie Ihren Weg in perlsec
für die Details .
In Ihrem einfachen Fall ist es am besten, es ganz zu löschen und verlassen sich nur auf Systemaufrufe mit vollständig qualifizierten Dateinamen.
delete @ENV{qw(PATH ENV)};
system qw(/usr/bin/sudo /sbin/iptables -h);
Andere Tipps
Ja, Sie haben eine unsichere Abhängigkeit im System, während mit dem -T-Schalter ausgeführt wird. : P
Sie Ihr Skript in taintperl Modus ausgeführt wird, und ruft ein externes Programm (mit sudo, nicht weniger) mit Daten basieren auf Informationen übergeben von dem Benutzer (die verdorben werden könnte). Wenn Sie wirklich sicher, dass die Ausgabe gültig ist, und stellt kein Risiko, müssen Sie untaint es: siehe die offizielle Dokumentation über Wäsche verdorbene Daten .
Sie müssen , um wirklich Sie vorsichtig, wenn externe Programme laufen oder Durchführung von Systemoperationen von einem CGI - zum Beispiel überlegen, was passieren könnte, wenn Sie `rm -rf /`
als Benutzereingabe eingeben. Es gibt viele Informationen unter Perldoc perlsec zum Einstieg, aber mehrere Bücher geschrieben worden über das Schreiben sicherer Code als auch.