2.3.19

Page Contents

发布日期:2012-02-29

不要错过与安全相关的更改,它们可能会影响您的申请!

FTL 方面的更改

Java 方面的更改

这是为了解决安全问题,其中使用诸如"secret.txt\u0000.ftl"之类的模板路径绕过应用程序中的扩展筛选。 FreeMarker 本身并不关心扩展,但是某些应用程序根据 extensions 决定是否将路径委托给 FreeMarker。当他们使用这样的路径时,存储机制后面的 C/C 实现可能会看到该路径为"secret.txt",因为 0 终止了 C/C 中的字符串,因此将非 FTL 文件作为模板加载,返回文件内容给攻击者。

请注意,某些 HTTP 服务器(尤其是 Tomcat 和 Apache HTTP Server)会阻止 URL-s,其中 URL 在查询字符串之外包含 0(%00),因此无法通过此类 Web URL-s 对其进行利用。但是,其他一些 HTTP 服务器(例如 Jetty)不会阻止此类 URL。

这是为了解决安全性问题,其中类加载器层次结构中的java.net.URLClassLoader将诸如"file:/etc/secret""http://example.com/malware.ftl"之类的模板路径解释为完整 URL,从而允许从这些 URL 中加载文件作为模板。这是java.net.URLClassLoader的古怪(或错误),因此仅在使用此类类加载器的系统上存在此问题。

当心,某些框架使用自己的TemplateLoader实现,如果它们容易受到攻击,那么在更新 FreeMarker 之后它们也将保持不变!请注意,只有在类加载器层次结构包含URLClassLoader且类加载器用于加载模板而不在模板路径之前添加任何前缀("/"除外)的情况下,此漏洞利用才有效。

这些安全性问题仅会影响应用程序用户(访问者)可以向应用程序提供任意模板路径。正确构建的 MVC 应用程序不是这种情况,因为只有 MVC Controller 可以直接寻址,而 Controller 指定模板路径。但是基于JSP Model-2的旧版 MVC 应用程序通常将 MVC 视图公开为以.ftl结尾的公共 URL,从而允许用户向 FreeMarker 提供任意路径。如相关手册部分所示,应在web.xml中用security-constratint保护此类应用程序。无论当前的安全修复程序是什么,都应该这样做。

通常,您不应允许用户指定任意模板路径,或者如果您允许这样做,则应格外小心使用TemplateLoader

上一章 首页 下一章