[spring-projects/spring-boot]spring-boot-starter-logging 依赖于易受攻击的 log4j 版本

2024-05-14 379 views
6

spring-boot-starter-logging 通过 log4j-to-slf4j 适配器依赖关系间接依赖于 log4j 版本 2.14。

此版本的 log4j 已成为零日漏洞的主题,如下所述:https://www.cyberkendra.com/2021/12/worst-log4j-rce-zeroday-dropped-on.html

这意味着,只要实际直接或间接执行 log4j 代码,所有使用 spring boot 的项目都可能遭受相同的零日攻击。

此处已打开相关票证:#28958,但该票证正在谈论可选的 log4j 2,它可以选择通过变量进行更新log4j2.version。但这是关于没有 2 的 log4j,默认情况下,它包含在 maven 的 spring boot starters 中。

回答

3

正如我已经在相关问题中解释过的那样,log4j-to-slf4j它是 log4j API 和 slf4j 之间的适配器。它确实带来了log4j-api但没有带来 log4j-core,因此我们的启动器不会受到此漏洞的影响。

3

但这是关于没有 2 的 log4j,默认情况下,它包含在 maven 的 spring boot starters 中。

这是不正确的。 log4j-to-slf4j 模块是 Log4j2 的一部分,覆盖该属性将影响其使用log4j2.version的版本。log4j-to-slf4jspring-boot-starter-logging

还值得重申的是,依赖的应用程序log4j-to-slf4j(用于将使用 Log4j2 API 进行的日志记录路由到除 Log4j2 之外的日志系统中)不易受到攻击。为了容易受到攻击,您必须使用log4j-core用户输入并将其包含在日志消息中。

4

谢谢你的解释,现在清楚了。

0

你好,

我使用 spring boot 2.2.6.RELEASE 并面临 log4shell 问题(此版本的 spring boot 使用 log4j2 2.12.1)。其实很多项目都依赖我们基于spring boot的框架

我们声明依赖管理如下

             <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <type>pom</type>
                <version>2.2.6.RELEASE</version>
                <scope>import</scope>
            </dependency>

log4j2 2.15.0 依赖项在另一个内部导入中显式声明。

但是当检查依赖树时

我找到了2.12.1 log4j2版本。我认为 spring boot 覆盖了我框架的 log4j 版本。

如何正确管理依赖关系(排除不适用于导入范围)?

我们已经尝试添加log4j2.version属性,但它似乎对dependencyManagement中声明的导入范围不起作用,如网站 https://spring.io/blog/2021/12/10/log4j2-vulnerability-and-上的建议弹簧靴

谢谢朱利安

3

@jdelobel

仅当您使用我们的父 pom.xml 时,属性覆盖才会起作用。对于导入,您应该使用 Maven 的<dependencyManagement>标签。

就像是

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-bom</artifactId>
            <version>2.16.0</version>
           <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

当我有时间时,我会尝试更新博客文章。

8

您引用的博客文章有一个指向 Maven 说明的链接,特别是因为您没有使用父级。具体来说应该是这样的:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-bom</artifactId>
            <version>2.16.0</version>
        </dependency>
        <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-dependencies</artifactId>
           <type>pom</type>
           <version>2.2.6.RELEASE</version>
           <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

log4j 依赖项必须位于 bom 导入之前(上面的链接也解释了这一点)。

5

你好,

我已经添加了 log4j bom


            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <type>pom</type>
                <version>2.2.6.RELEASE</version>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-bom</artifactId>
                <version>2.16.0</version>
                <scope>import</scope>
            </dependency>

但我仍然有同样的问题(如果之前有 log4j bom 依赖项,结果相同):

[INFO] +- my-internal-dependencies:jar:6.16.1:compile
[INFO] |  +- org.apache.logging.log4j:log4j-api:jar:2.12.1:compile
[INFO] |  +- org.apache.logging.log4j:log4j-core:jar:2.12.1:compile
[INFO] |  \- org.apache.logging.log4j:log4j-slf4j-impl:jar:2.12.1:compile
8

log4j 依赖项必须位于 bom 导入之前(上面的链接也解释了这一点)。

9

嗨如上所述,上面的依赖关系具有相同的结果

<dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-bom</artifactId>
                <version>2.16.0</version>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <type>pom</type>
                <version>2.2.6.RELEASE</version>
                <scope>import</scope>
            </dependency>   
[INFO] +- my-internal-dependencies:jar:6.16.1:compile
[INFO] |  +- org.apache.logging.log4j:log4j-api:jar:2.12.1:compile
[INFO] |  +- org.apache.logging.log4j:log4j-core:jar:2.12.1:compile
[INFO] |  \- org.apache.logging.log4j:log4j-slf4j-impl:jar:2.12.1:compile

注意:在你的官方文档中。依赖位于https://spring.io/blog/2021/12/10/log4j2-vulnerability-and-spring-boot之后

3

你好,

好的,我会检查一下。

仅供参考,我们使用 2.2.6.RELEASE 版本。是否可以使用 2.16.0 log4j 版本创建 2.2.7.RELEASE?我可以做 PR,但这是我第一次,我不确定 PR 是否会被验证以进行发布?

谢谢

1

是否可以使用 2.16.0 log4j 版本创建 2.2.7.RELEASE?

Spring Boot 2.2.x 不再支持 OSS 已有 2 年多了。请尽早升级到至少 2.5.x。

7

好的,谢谢您的回复。