对缓解 Apache 的 Log4j 库漏洞的怀疑

Posted

技术标签:

【中文标题】对缓解 Apache 的 Log4j 库漏洞的怀疑【英文标题】:Doubts about mitigations to Apache's Log4j library vulnerability 【发布时间】:2022-01-19 23:43:33 【问题描述】:

2021 年 12 月 9 日,与 Apache 的 Log4j 库相关的一个严重漏洞被披露。 The vulnerability is detailed here。在此链接中提到了可能的缓解措施。我希望你能帮助我解决以下问题(如果我的问题听起来太琐碎,我提前道歉):

缓解 1: 将系统属性 log4j2.formatMsgNoLookups 或环境变量 LOG4J_FORMAT_MSG_NO_LOOKUPS 设置为 true。这由 2 个不同的操作组成:

    首先是将 log4j2.formatMsgNoLookups 系统属性设置为 TRUE。系统的属性是什么以及在哪里? 或者,将环境变量 LOG4J_FORMAT_MSG_NO_LOOKUPS 设置为 TRUE。从外观上看,这就像运行它一样简单:export LOG4J_FORMAT_MSG_NO_LOOKUPS=true。在不使用 Log4j 库的系统上创建该环境变量是否有问题?

缓解 2: 可以修改所有 PatternLayout 模式以将消息转换器指定为 %mnolookups 而不仅仅是 %m。也就是说,您必须使用%mnolookups,而不是使用%m,并且这是在所有PatternLayout 模式中完成的。 In this place Log4j 库的可能配置文件已列出。我设法找到了这个 /usr/lib/appdynamics-php5/proxy/conf/logging/log4j2.xml,其中包含多行,如下所示:<PatternLayout pattern="[%t] %dDATE %5p %c - %m%n"/>。我猜它只是在需要运行此缓解措施的那些配置文件中,而不是在其他地方,对吗?

缓解 3: 从类路径中删除 JndiLookup 类。例如:zip -q -d log4j-core-.jar org/apache/logging/log4j/core/lookup/JndiLookup.class。我在任何地方都找不到名为 JndiLookup.class 的文件。我想如果它不存在,您不必寻找其他任何东西,并且这种可能的缓解措施不适用,对吗?

【问题讨论】:

"我想如果它不存在";你在使用log4j-core 但还没有找到课程吗?那么听起来你可能忽略了它,因为即使是最新的 Log4j 版本(目前是 2.17.0,虽然默认情况下禁用了 JNDI 查找)似乎仍然包含该类。 【参考方案1】:

https://access.redhat.com/security/cve/CVE-2021-45046 是在您提到的第一个问题之外发布的。缓解 1 不能解决此问题。 我不确定缓解 2,但由于它只是一种配置与缓解 1 相同效果的本地方式,我也希望它不会保护您免受此漏洞的影响。缓解 3 应该仍然有效,与删除的 JndiLookup.class 一样,从 Internet 加载数据的类将丢失。但是,缺少类的攻击应该引发异常。您的应用程序应该很健壮,不会因此而崩溃。

目前最好的缓解措施是更新到 log4j 2.17.0。随时了解最新发布的新闻和新漏洞。可能是将来发布了新的漏洞,您必须再次更新到较新的版本。

【讨论】:

缓解 3 不会引发异常,因为可用查找列表是在运行时通过注释扫描过程创建的。如果JndiLookup 不存在$jndi:something 将退回到默认查找(配置文件中的属性)或返回null

以上是关于对缓解 Apache 的 Log4j 库漏洞的怀疑的主要内容,如果未能解决你的问题,请参考以下文章

Log4j 1:如何在不将版本更新到 2.15.0 的情况下缓解 log4j 中的漏洞

Apache Log4j Server 反序列化漏洞(CVE-2017-5645)

Apache Log4j远程代码执行漏洞 | 风险漏洞提示

Apache Log4j远程代码执行漏洞 | 风险漏洞提示

如何缓解 Apache Log4j 反序列化 RCE (CVE-2019-17571)

缓解CVE-2017-5638 Apache Struts2漏洞