开发者

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

目录
  • 场景
  • 问题
  • 原因
  • 解决
  • 最终方案
    • 1. 单独升级logback版本, pom.XML
    • 2. 禁用spring boot自身对日志的适配
    • 3. 在resources根目录下增加logback.xml文件
    • 4. 完毕
  • PS

    场景

    安全部门针对编程代码进行漏洞扫描时,发现 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.cont编程ext.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中的类。

    SpringBoot2.x漏洞将logback1.2.x 升级至1.3.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="appandroid" 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">
       javascript    .....
        </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"/>
            <apandroidpender-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

    本文参考了:

    • springboot 版本1.5.4 版本低 logback 升级1.3以上项目启动冲突
    • logback更新到1.3版本tomcat无法启动问题解决

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

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜