2010-10-12 73 views
0

當我引用 「命令/ sbin目錄/ iptables的......」 在我的Perl CGI腳本,我得到的錯誤:如何在污染模式下從Perl CGI調用/ sbin/iptables?

Insecure dependency in system while running with -T switch at usr/lib/perl5/vendor_perl/5.8.8/IPC/Run3.pm line 403 

我嘗試添加「/ sbin目錄中:/ etc /的sysconf:在/ etc /初始化.d「在$ ENV {'PATH'}但仍然沒有成功。任何人有任何想法?

回答

3

您應該限制路徑,意思是:將其設置爲滿足特定要求的少量已知值(例如$ENV{PATH} = '/sbin:/usr/sbin:/usr/bin';),而不是添加到該路徑。詳情請參閱Cleaning Up Your Path in perlsec

在你的簡單情況下,最好完全清除它,並且僅依賴具有完全限定文件名的系統調用。

delete @ENV{qw(PATH ENV)}; 
system qw(/usr/bin/sudo /sbin/iptables -h); 
+0

是的,我做到了。但這還不夠。有一些變量傳遞給iptables命令行。您需要使用正則表達式映射來修改這些變量。例如。 if($ port =〜/([0-9] +)){$ port = $ 1;} else {die「invalid port number」;}。在將所有變量解開後,我可以使其工作 – 2010-10-15 19:46:11

3

是的,在使用-T開關運行時,系統中存在不安全的依賴關係。 :p

您正在taintperl模式下運行您的腳本,並根據用戶傳入的信息(可能被污染)調用外部程序(使用sudo,不低於)。如果你真的確實確保輸出有效且不會造成風險,則需要將其解除:請參閱有關laundering tainted data的官方文檔。

您運行外部程序或者從CGI執行系統操作時,必須真正小心 - 例如,考慮如果輸入`rm -rf /`作爲用戶輸入可能會發生什麼。 perldoc perlsec有很多信息可以幫助您入門,但也有幾本關於編寫安全代碼的書籍。