【问题标题】:Finding the source of a perl taint mode error查找 perl 污点模式错误的根源
【发布时间】:2011-06-15 05:03:41
【问题描述】:

在污点模式下运行 perl CGI 脚本时,我收到以下形式的错误...

Insecure dependency in some_function while running with -T switch at (eval some_line) line some_other_line.
Compilation failed in require at my-script.cgi line 39.
BEGIN failed--compilation aborted at my-script.cgi line 39.

my-script.cgi 第 39 行是 perl 模块的 use 语句,它本身不使用 eval 或 some_function,但可能使用了另一个库。 some_line 和 some_other_line 行号在 my-script.cgi 或在 my-script.cgi 第 39 行“使用”的库中似乎没有意义。

鉴于此错误,我如何追踪污点错误发生的位置?

我尝试设置一个新的 die 信号处理程序,它应该打印一个堆栈跟踪,即

$SIG{ __DIE__ } = sub { require Carp; Carp::confess(@_); };

但这似乎对错误没有影响。也许这是错误的信号,没有足够早地发生,或者需要更复杂的信号。

【问题讨论】:

  • 通过缓慢移动 die 语句,我设法缩小问题范围,发现 CGI.pm 中的错误是我遇到的特定问题的根本原因 - nntp.perl.org/group/perl.perl5.porters/2008/01/msg133691.html I'不过,我仍然对追踪此类问题的一般方法非常感兴趣。
  • 这就是为什么人们应该将 CGI.pm 用于 CGI(而不是仅仅“自己做”)。通过对数千名用户(如您)的压力测试发现、报告和修复错误。在发现问题方面也做得很好。

标签: perl cgi taint


【解决方案1】:

Carp::Always 可以很好地处理污点检查引发的异常。示例输出:

$ perl -MCarp::Always -T blah.pl
Insecure dependency in sprintf while running with -T switch at blah.pl line 6
        main::foo() called at blah.pl line 8
        main::bar() called at blah.pl line 10

【讨论】:

  • 看起来是一个不错的计划,但我无法让它发挥作用。在 CGI 的 perl 调用中添加 -I the_carp_always_install_location -MCarp::Always 似乎没有任何效果。可能它会像您显示的那样直接在命令行上正常运行,但由于错误是通过 POST 文件文件上传触发的,所以我必须弄清楚如何从命令行模拟它。
  • 这看起来很方便,但除非我遗漏了什么,否则它不会说明如何伪造文件上传,只是普通的 POST 参数(除非有某种我不知道发送 POST 的方式参数,实际上是文件上传)。看起来这个线程可能会让我有所帮助 - perlmonks.org/?node_id=667813
【解决方案2】:

这些天我经常使用Devel::SimpleTrace 进行调试,它最近帮助我在使用 Archive::Zip 时发现了一个污染错误。

但是,我不知道它是否适用于您的情况,因为它本质上设置了与您使用的相同的 sig 处理程序。

【讨论】:

  • 是的,恐怕它似乎不影响输出。不过感谢您的建议。
猜你喜欢
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 2015-04-15
相关资源
最近更新 更多