如何在污点模式下从Perl CGI调用/ sbin / iptables?

时间:2010-10-12 01:36:03

标签: perl security cgi iptables taint

当我在Perl CGI脚本中调用“sudo / 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

我试图在$ ENV {'PATH'}中添加“/sbin:/etc/sysconf:/etc/init.d”,但仍然没有成功。有人有任何想法吗?

2 个答案:

答案 0 :(得分:3)

是的,在使用-T开关运行时,系统中存在不安全的依赖关系。 :P

您正在以taintperl模式运行脚本,并使用基于从用户传入的信息(可能被污染)调用外部程序(使用sudo,不能少)。如果您确实确保输出有效并且没有风险,则需要对其进行解开:请参阅有关laundering tainted data的官方文档。

在运行外部程序或从CGI执行系统操作时,您需要非常 - 例如,考虑如果您输入`rm -rf /`作为用户输入可能会发生什么。 perldoc perlsec有很多信息可以帮助您入门,但也有一些关于编写安全代码的书籍。

答案 1 :(得分: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);