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.0
和org.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?的主要内容,如果未能解决你的问题,请参考以下文章
Spring-Boot-strater-log4j2怎么修复漏洞