昨天,我们发布了ZendFramework1.7.5。它包含对Zend_View
的一些有争议的安全修复,可能会影响组件的某些用例;我将提供有关该安全修复程序的详细信息,并展示如何在此处解决它。
用户提交了一份问题报告,显示Zend_View
的setScriptPath()
方法中存在潜在的本地文件包含漏洞:如果用户输入用于指定脚本路径,那么就有可能触发LFI。该漏洞是完全人为的;理智的开发人员不应该使用用户输入来配置视图脚本路径。然而,它指出了另一个非常真实的LFI攻击向量。
攻击向量再次是信任未经过滤的输入的情况,但这次是更有可能发生的情况。在这种特殊情况下,假设我们将Zend_View
配置如下:
$view->addScriptPath('/var/www/application/views/scripts');
然后我们接受以下输入,并将其传递给render()
方法:“../../../../etc/passwd”。
然后触发了LFI向量,因为render()
实际上允许遍历父目录。
ZF1.7.5现在可以检查此类符号(../
或..\\
),并在检测到时抛出异常。
在#zftalk.dev上,一些贡献者指出这可能会破坏他们的一些应用程序。在他们的情况下,他们使用的是父目录遍历,而不是来自用户输入。在这种情况下,由于他们可以控制该值,所以他们认为最好将检查留给用户态代码。
为了适应这一点,我们引入了一个标志,“lfiProtectionOn”。默认情况下,此标志为真,启用检查。您可以通过以下两种方式之一将其关闭:
// At instantiation: $view = new Zend_View(array( 'lfiProtectionOn' => false, )); // Programmatically, at any time: $view->setLfiProtection(false);
包含此安全修复程序是一个艰难的决定。一方面,我们非常努力地保持版本之间的向后兼容性。另一方面,我们的用户也有责任确保他们的安全。希望上面添加的LFI保护标志将有助于缓解迁移问题。
有关此更改的更多信息,您可以阅读相关手册页。