Gradle/Java:如何安全升级 log4j?

Posted

技术标签:

【中文标题】Gradle/Java:如何安全升级 log4j?【英文标题】:Gradle/Java: How to upgrade log4j safely? 【发布时间】:2022-01-15 21:44:31 【问题描述】:

鉴于最近的 Log4J vulnerability 在 gradle 项目中升级传递依赖项的最安全方法是什么?我的项目没有明确使用 log4j(它使用 logback),但它有许多依赖项会带来易受攻击的版本(

【问题讨论】:

欢迎您!如果您要编辑帖子以阐明您要做什么以及问题出在哪里,那么它将帮助其他人帮助您解决问题。另外,请查看“How to Ask”以及如何创建minimal reproducible example。 【参考方案1】:

将以下内容添加到您的 gradle.build 文件中:

configurations.all 
  resolutionStrategy.eachDependency  details ->
    if (details.requested.group == 'org.apache.logging.log4j') 
      details.useVersion '2.17.1'
      details.because 'zero-day exploits suck'
    
  


dependencies 
…

请注意,正如documentation 指出的那样:

以下机制允许您直接编写规则 注入解析引擎。正因为如此,它们才能被看到 作为蛮力解决方案,可能会隐藏未来的问题(例如,如果新 添加依赖项)。因此,一般的建议是只使用 如果其他方法不够用,请使用以下机制。

我意识到 OP 要求以“最安全”的方式升级依赖项——我选择将其解释为最有可能消除零日漏洞。尽管如此,我确实认识到这种蛮力方法并不能保证库之间的兼容性,但这应该确保没有易受攻击的 log4j 版本最终出现在您的依赖关系树/构建中。

您当然应该在进行更改后运行gradle dependencies,以确保更改已生效并且您没有任何存在问题的挥之不去的版本。

更新:删除了版本比较,推荐here。

更新:将版本增加到 2.17.1

【讨论】:

可能很重要:考虑<= '2.15.0',而不是<。在配置中仅使用 < 运行 ./gradlew dependencies 给了我一个依赖关系树输出,包括 org.apache.logging.log4j:log4j-1.2-api -> 2.15.0 及其子依赖关系 org.apache.logging.log4j:log4j-api:2.15.0 -> 2.11.2。使用<=,我得到了org.apache.logging.log4j:log4j-1.2-api -> 2.15.0org.apache.logging.log4j:log4j-api:2.15.0 更新实际上,在进一步研究之后,我认为更好的更改是&& details.target.version < '2.15.0'——那么我们不应该在发生冲突时意外降级。我不确定我们是否也应该更改为details.target.group kotlin 版本是:configurations.all resolutionStrategy.eachDependency if (requested.group == "org.apache.logging.log4j") useVersion("2.17.0") 因为("零日漏洞利用很糟糕”) 如果旧的 log4j 包作为传递依赖项出现,您可能还需要明确排除它:configurations runtime.exclude group: "log4j", module: "log4j" 您需要测试以 100% 确保这不会破坏您项目中的任何内容 【参考方案2】:

您可以将依赖管理插件添加到您的 gradle.build:

plugins 
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'


dependencyManagement 
    imports 
        mavenBom 'org.apache.logging.log4j:log4j-bom:2.17.0'
    

要确认更改,请运行 ./gradlew dependencies 你应该看到类似

 +--- org.apache.logging.log4j:log4j-to-slf4j:2.14.1 -> 2.17.0
|    |    |    |    +--- org.slf4j:slf4j-api:1.7.25 -> 1.7.32
|    |    |    |    \--- org.apache.logging.log4j:log4j-api:2.17.0

【讨论】:

以上是关于Gradle/Java:如何安全升级 log4j?的主要内容,如果未能解决你的问题,请参考以下文章

log4j2漏洞CVE44228官方修复方案

Spring-Boot-strater-log4j2怎么修复漏洞

SPARK 应用如何快速应对 LOG4J 的系列安全漏洞

SPARK 应用如何快读应对 LOG4J 系列安全漏洞

Elasticsearch 7.16.2 发布,升级到 log4j 2.17.0 版本

Android Studio Arctic Fox | 2020.3.1Gradle 7.0升级记录