SpringBoot2.x漏洞将logback1.2.x 升级至1.3.x

 更新时间:2024年09月18日 16:06:14   作者:多动手,勤思考  
安全部门在代码漏洞扫描中发现logback 1.2.x版本存在CVE漏洞,建议升级至1.3.x版本,本文就来介绍了logback1.2.x 升级至1.3.x,具有一定的参考价值,感兴趣的可以了解一下

场景

安全部门针对代码进行漏洞扫描时,发现 logback-core 和 logback-classic 都属于 1.2.x 版本,这个版本存在 CVE 漏洞,并且建议升级到 1.3.x 版本。

问题

将两个包直接升级到 1.3.x 版本时,Spring Boot Web 服务启动直接出现错误

Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder
	at org.springframework.boot.logging.logback.LogbackLoggingSystem.getLoggerContext(LogbackLoggingSystem.java:293)
	at org.springframework.boot.logging.logback.LogbackLoggingSystem.beforeInitialize(LogbackLoggingSystem.java:118)
	at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationStartingEvent(LoggingApplicationListener.java:238)
	at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:220)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)

原因

org.slf4j.impl.StaticLoggerBinder 这个类在 1.2.x 中由 logback 自行实现,在1.3.x 版本中,这个类已经消失,

所以直接升级logback的包看起来并不可行,因为spring boot的代码中对实用到了1.2.x中的类。

在这里插入图片描述

解决

按照上面所说的原因,直接升级spring boot到新版本就可以支持 logback 1.3.x ,

但是遗憾的是 spring boot 需要版本在 3.x.x 之上才支持 logback 1.3.x ,并且使用 spring boot 3 需要 jdk 17的支持,

这就麻烦了,如此大版本的升级,对于系统的影响,可能无法预知,是否存在不升级版本还能兼容使用 logback 1.3.x 的方法。

最终方案

经过尝试,我使用了下面的步骤,在不升级 spring boot 版本的情况下,成功使用 logback 1.3.x

1. 单独升级logback版本, pom.xml

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>2.0.4</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>log4j-over-slf4j</artifactId>
    <version>2.0.4</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jul-to-slf4j</artifactId>
    <version>2.0.4</version>
</dependency>


<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.3.0</version>
</dependency>

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.3.0</version>
</dependency>

2. 禁用spring boot自身对日志的适配

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        System.setProperty("org.springframework.boot.logging.LoggingSystem", "none");
        SpringApplication.run(Application.class, args);
    }

}

3. 在resources根目录下增加logback.xml文件

这一步根据自己的需求配置饥渴。

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <property name="app" value="xxx"/>
    <property name="filename" value="xxx"/>

    <import class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"/>
    <import class="ch.qos.logback.core.rolling.RollingFileAppender"/>
    <import class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"/>
    <import class="ch.qos.logback.core.ConsoleAppender"/>
    <import class="ch.qos.logback.classic.AsyncAppender"/>
    <import class="ch.qos.logback.classic.filter.ThresholdFilter"/>


    <appender name="INFO" class="RollingFileAppender">
        ....
    </appender>

    <appender name="ERROR" class="RollingFileAppender">
       .....
    </appender>

    <appender name="STDOUT" class="ConsoleAppender">
       ...
    </appender>
        ....
    <appender name="ASYNC_INFO" class="AsyncAppender">
        ....
    </appender>
        ....
    <appender name="ASYNC_ERROR" class="AsyncAppender">
        ....
    </appender>

    <logger name="sun.rmi" level="error"/>
    <logger name="sun.net" level="error"/>
    <logger name="javax.management" level="error"/>
    <logger name="org.redisson" level="warn"/>
    <logger name="com.zaxxer" level="warn"/>

    <root level="INFO" additivity="false">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ASYNC_INFO"/>
        <appender-ref ref="ASYNC_ERROR"/>
    </root>
</configuration>

4. 完毕

这时候启动项目即可正常运行。

原因说明:

slf4j-api 1.8之后的版本不再使用静态绑定,意味着不再需要StaticLoggerBinder,使用的是ServiceLoader机制,

新版本的 logback 自然为了适配,删除了 StaticLoggerBinder,使用 ServiceLoader 机制,

因此禁用了 spring boot 自身的日志适配,引入高版本logback后,logback自身通过 ServiceLoader 即引入项目中正常使用

PS

本文参考了:

到此这篇关于SpringBoot2.x漏洞将logback1.2.x 升级至1.3.x的文章就介绍到这了,更多相关logback1.2.x 升级至1.3.x内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • SpringCloud学习笔记之OpenFeign进行服务调用

    SpringCloud学习笔记之OpenFeign进行服务调用

    OpenFeign对feign进行进一步的封装,添加了springmvc的一些功能,更加强大,下面这篇文章主要给大家介绍了关于SpringCloud学习笔记之OpenFeign进行服务调用的相关资料,需要的朋友可以参考下
    2022-01-01
  • MyBatis源码剖析之Mapper代理方式详解

    MyBatis源码剖析之Mapper代理方式详解

    这篇文章主要为大家详细介绍了MyBatis中Mapper代理的方式,文中将通过源码为大家进行详细的剖析,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-07-07
  • Java中for循环的执行过程分析

    Java中for循环的执行过程分析

    这篇文章主要介绍了Java中for循环的执行过程,实例分析了for循环的执行原理与顺序,对于深入理解Java具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • JAVA线程同步实例教程

    JAVA线程同步实例教程

    这篇文章主要介绍了JAVA线程同步实例教程,在Java程序设计中有着非常广泛的应用,需要的朋友可以参考下
    2014-08-08
  • SpringBoot3集成Kafka的方法详解

    SpringBoot3集成Kafka的方法详解

    Kafka是一个开源的分布式事件流平台,常被用于高性能数据管道、流分析、数据集成和关键任务应用,下面我们就来看看SpringBoot3是如何集成Kafka的吧
    2023-08-08
  • spring boot 不连接数据库启动的解决

    spring boot 不连接数据库启动的解决

    这篇文章主要介绍了spring boot 不连接数据库启动的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Spring Boot 项目创建的详细步骤(图文)

    Spring Boot 项目创建的详细步骤(图文)

    这篇文章主要介绍了Spring Boot 项目创建的详细步骤(图文),这里我们有两种创建Spring Boot项目的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • SpringBoot中整合消息服务组件的方法

    SpringBoot中整合消息服务组件的方法

    本文介绍了消息服务组件的基本概念,以及如何在SpringBoot中整合常见的消息服务组件,如ActiveMQ、RabbitMQ和Kafka,我们探讨整合消息服务组件在实际应用场景中的优势,感兴趣的朋友跟随小编一起看看吧
    2023-07-07
  • SpringBoot ApplicationContextAware拓展接口使用详解

    SpringBoot ApplicationContextAware拓展接口使用详解

    当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean。换句话说,就是这个类可以直接获取spring配置文件中,所有有引用到的bean对象
    2023-04-04
  • SpringBoot实现API接口多版本支持的示例代码

    SpringBoot实现API接口多版本支持的示例代码

    这篇文章主要介绍了SpringBoot实现API接口多版本支持的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10

最新评论