为什么Perl在-T下运行时不想要某些文件?

sim*_*que 4 perl require taint

最近,我发现我的系统上也无法require 'lib/file.pl'下运行时-T,但require './lib/file.pl'工作.

$ perl -wT -e 'require "lib/file.pl";'
Can't locate lib/file.pl in @INC (@INC contains: /usr/lib/perl5/site_perl/5.14.2/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.14.2 /usr/lib/perl5/vendor_perl/5.14.2/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.14.2 /usr/lib/perl5/5.14.2/x86_64-linux-thread-multi /usr/lib/perl5/5.14.2 /usr/lib/perl5/site_perl/5.14.2/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.14.2 /usr/lib/perl5/site_perl)

$ perl -wT -e 'require "lib/file.pl"'
Run Code Online (Sandbox Code Playgroud)

这样做没有-T两种方式:$ perl -w -e'require"lib/file.pl"'$ perl -w -e'require"./lib/file.pl"'

在污点模式中,.不属于@INC.

perl -w -e 'print "@INC"'
[..snip..] /usr/lib/perl5/site_perl/5.14.2 /usr/lib/perl5/site_perl .
perl -wT -e 'print "@INC"'
[..snip..] /usr/lib/perl5/site_perl/5.14.2 /usr/lib/perl5/site_perl
Run Code Online (Sandbox Code Playgroud)

我在文档中找不到那种行为.有人可以告诉我这是什么记录或为什么-T不喜欢.作为lib目录?

rai*_*7ow 12

嗯...这实际上有很好的记录,我想:

当污点模式(-T)生效时,"." 目录从@INC中删除,Perl忽略环境变量PERL5LIB和PERLLIB.您仍然可以使用-I命令行选项从程序外调整@INC,如perlrun中所述.

......但我想,这只是回答的一半.这种决定背后的原因在这里给出:

... @INC的问题实际上是SUID脚本比CGI脚本更多的问题.当您拥有可以使用其他用户(例如root)的权限执行的SUID脚本时,Perl会自动进入taintmode.

对于这个SUID脚本案例,具有从用户的当前目录加载库的能力将是一个巨大的安全漏洞.如果脚本最终出现了在正常目录路径中找不到库的错误,那么用户可以通过编写自己的恶意版本的库,将其放在当前目录中,并从中运行SUID脚本来利用它.他们当前的目录.

但是,这与CGI脚本的问题并不完全相同.用户没有从任意目录执行脚本.您的Web服务器控制调用脚本的目录.所以保持"." 与在自动污染模式下运行的SUID脚本相比,在@INC中并不是一个真正的问题.