Perl的污点模式有用吗?

28
perl -T

你使用过它吗?它有助于你在Perl脚本中找到安全漏洞吗?

6个回答

32

不仅如此,它还可以在安全问题变得严重之前停止它们。当然,它并不是绝对的安全保障...... 我们曾经在任何被暴露在外的脚本中使用它(例如任何mod_perl应用程序),我们发现它非常有用,并将其作为政策。它执行了一些检查,非常方便...(任何自动化的东西都会起到帮助作用)

Perl安全性-perlsec也强烈推荐使用:

这个标记[Taint mode]强烈建议用于服务器程序和代表他人运行的任何程序,例如CGI脚本。一旦启用了Taint模式,就会一直保持该模式。


6
污点模式是一种开发者工具,它不能阻止或预防安全问题,而是展示出可能存在问题的地方,但是需要你负责妥善处理。请注意,污点模式仅用于漏洞排查和诊断,并不保证应用程序的安全性。 - brian d foy
5
这句话并不会误导。污点检查完全不会提高您的安全性。我并不是说不要使用它,只是不要认为它会保护您。它仅仅告诉您应该在哪里考虑保护。我见过很多“污点安全”的程序,但它们仍然存在未经验证的输入所带来的旧的安全问题。 - brian d foy
6
透过臭名昭著的 $safe = $1 if $unsafe =~ /(.*)/ 代码行。 - Steve Schnepp

19

当然可以!

$ echo '`rm -rf /`' | perl -Te 'eval while <>'
-e行1,<>行1运行时在使用-T开关的eval中存在不安全的依赖。

10
如果你真的运行了那个命令,那你就很勇敢。我在按下回车键之前可能花了三个小时来确认我的 perl 命令中有 -T。 - user198470
3
也许他以nobody用户身份运行了它。 - Paul
3
无论如何也不会做任何事情,“man rm”中的“--no-preserve-root:不要把'/'视为特殊字符”。 - Kent Fredric

14
精通Perl书中的“安全编程技术”章节几乎完全致力于污点检查及其使用方法。
许多人会告诉你它可以保护你,但他们在这方面有些误导。它是一个开发者工具,可以帮助你找到代码中一些需要小心处理的地方(仅限于部分)。它不能解决你所有的安全问题。

9

我认为在大家都熟悉的新代码开发时,污点模式会发挥最佳作用。

如果你有别人编写的代码质量较差,并且你在污点模式下运行它 - Perl将会因执行被污点规则视为“不安全”的操作而崩溃。

在Perl的污点模式中,一些漏洞得到了修补,但并非全部。system(“$unfiltered_user_input”)将会崩溃,但Perl仍然可以将$unfiltered_user_input数据写入一个固定名称的文件中(因为打印受污染数据被认为是“安全”的),然后使用system()执行该文件。但是,没有任何东西可以检查所有内容。

在遗留应用程序上使用它存在权衡。当Perl在污点数据上发现不安全操作时,它将崩溃 - 这意味着必须有人进去决定如何消除数据的污点,需要哪些正则表达式,才能使应用程序再次可靠。

有些人更喜欢不安全、可靠、低成本(目前)而不是安全、损坏、需要找到开发人员。虽然从长远来看这不是好事...但这并不罕见。


1
运行system()在一个包含来自用户获取的数据的文件上的示例是很好的。 - j_random_hacker
12
还有污点警告(-t)。它们会警告相同的问题,但不会停止您的程序。对于遗留程序,可以从这些警告开始。 - brian d foy

4

是的,污点模式出于上述所有原因都很有用。

当与数据库交互时,您可能不会考虑到污点数据。幸运的是,DBI支持阻止污点数据进入数据库,并将来自数据库的数据视为污点数据,以便您无法执行任何不安全的操作。您必须专门打开此选项;默认情况下它们是关闭的。有关更多信息,请参见DBI文档


-3

哦,天啊,不要使用污点模式。污点模式应该在15-20年前就从Perl中删除了。它无法防止任何东西,因为您不可能验证某些命令的响应。它让人们相信他们是安全的,但实际上只是/(.*)/。它几乎破坏了Windows上的所有内容(甚至无法获取准确的临时目录)。请勿使用污点模式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接