【问题标题】:How can I invoke /sbin/iptables from a Perl CGI under taint mode?如何在污点模式下从 Perl CGI 调用 /sbin/iptables?
【发布时间】:2010-10-15 02:09:49
【问题描述】:

当我在 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”,但仍然没有成功。有人知道吗?

【问题讨论】:

    标签: perl security cgi iptables taint


    【解决方案1】:

    您应该限制路径,意思是:将其设置为满足某些要求的少量已知值(例如$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);
    

    【讨论】:

    • 是的,我做到了。但这还不够。我将一些变量传递给 iptables 命令行。您需要使用正则表达式映射来清除这些变量。例如。 if ($port =~ /([0-9]+)) {$port = $1;} else {die "无效端口号";}。清除所有变量后,我可以让它工作
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多