2.3.19

Page Contents

发布日期:2012-02-29

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

FTL 方面的更改

  • 注意:在 2.3.17 中引入的内置 ISO 8601 日期/时间格式的输出已稍作更改。从现在开始,时区偏移(当显示时不是Z)始终包含分钟。例如,在模板输出中15:30:15+02变为15:30:15+02:00。两种格式都根据 ISO 8601 有效(因此任何期望 ISO 8601 日期/时间应 continue 工作的格式),但是只有最后一种格式符合 XML Schema 日期/时间格式,因此需要更改。

  • 用于转义 JSON 字符串常量json_string的新内置函数。

  • 错误修正:错误的#标记被打印为静态文本,而不是如果同一模板中较早的版本中没有正确的#标记,则导致解析错误。由于修复此问题不可能 100%向后兼容,因此除非将incompatible_enhancements设置(Configuration.setIncompatibleEnhancements(String))设置为"2.3.19"或更高,否则旧行为仍然存在。

Java 方面的更改

  • 注意:此发行版包含两个重要的安全性变通办法,这些变通办法不可避免地使人们清楚地知道如何利用某些应用程序。 * FreeMarker 不能在所有配置上解决这些问题,因此,请阅读详细信息,而不是仅更新 FreeMarker!*而且,这些更改在理论上不是 100%向后兼容的,但是它们不可能破坏任何东西。这两个更改是:

  • 模板路径中不再允许使用字符代码 0(\u0000)的字符。当路径包含它时,FreeMarker 的行为就像找不到模板一样。

这是为了解决安全问题,其中使用诸如"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。

  • ClassTemplateLoader使用基本路径"/"创建时(例如new ClassTemplateLoader(someClass, "/")),将不允许模板路径包含比任何/更早的冒号,并且会像在这种情况下未找到模板那样起作用。

这是为了解决安全性问题,其中类加载器层次结构中的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

  • Configuration具有新方法:removeTemplateFromCache(...)。这将从缓存中删除给定语言环境的给定模板,因此无论下一次请求模板更新的延迟时间如何,都将重新加载该模板。

  • BeansWrapper从现在开始在内省类时将忽略 setter 方法。无论如何都没有使用它们,因此它们不必要地导致了“ java.beans.IntrospectionException:读写方法之间的类型不匹配”错误。

  • TemplateClassResolver.SAFER_RESOLVER现在禁止创建freemarker.template.utility.JythonRuntimefreemarker.template.utility.Execute。如果将 FreeMarker 配置为使用SAFER_RESOLVER,则此更改会影响new built-in的行为,这在 2.4 之前不是默认值,因此是不可能的。

  • 错误修正:现在确实可以调用 varargs 方法。 (以前它仅适用于重载方法.)

  • 已修复[1837697] [2831150] [3039096] [3165425]的错误:Jython 支持现在可用于 Jython 2.2 和 2.5.

  • 已修复错误[3325103]TemplateException -s 和ParseException -s 现在可序列化。