Spring Boot Log4j2漏洞修复指南 (Log4J2 Vulnerability and Spring Boot)
Posted Moshow郑锴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot Log4j2漏洞修复指南 (Log4J2 Vulnerability and Spring Boot)相关的知识,希望对你有一定的参考价值。
前言
一句话总结issue:如果你使用的是 Log4j 1.x、Logback 或者其他日志框架,这次就可以幸免于难。如果你使用Spring Boot默认日志
,也是没有问题的,因为默认是Commons Logging
。
一句话修复solution:升级springboot到最新v2.5.8
和v2.6.2
以及后续版本,确保安全;如果单独依赖了log4j2日志,请强制使用最新版本v2.15.0
换切换其他日志系统或者追加参数-Dlog4j2.formatMsgNoLookups=true
。
UPDATE:
- 2021/12/14 09:30 新增RCA
- 2021/12/14 22:00 加更:log4j2官方已推送中央仓库2.16.0版本
- 2021/12/15 07:30 加更:ESET NOD32发布Apache Log4j漏洞解决方案,列举部分受影响的框架/平台
Reference:
背调
正如您在新闻中所看到的,针对流行的 Log4J2 库的新零日漏洞利用已被报道,该库可允许攻击者远程执行代码。 该漏洞已通过针对 log4j-core jar 的 CVE-2021-44228
报告,并已在 Log4J v2.15.0
中修复。
此漏洞由Lookup
功能引发,Log4j在默认情况下会开启Lookup功能
,提供给客户一种添加特殊值到日志中的方式。此功能中也包含了对JNDI的Lookup
,但由于Lookup对加载的JNDI内容未做任何限制,使得攻击者可以通过JNDI注入实现远程加载恶意类到应用中,从而造成RCE
。
漏洞定位: log4j的真正漏洞代码出现在log4j-core的子组件。修复其他组件不一定能有效消除漏洞。很多产品都产生了误报的行为,但是为了安全起见,建议使用专业的分析平台或者强制升级比较稳妥,以绝后患
。
部分受影响框架
目前受影响的Apache Log4j2版本:2.0 ≤ Apache Log4j <= 2.14.1
可能的受影响应用包括但不限于如下:
- Spring-Boot-strater-log4j2
- Apache Struts2
- Apache Solr
- Apache Flink
- Apache Druid
- ElasticSearch
- flume
- dubbo
- Redis
- logstash
- kafka
Spring Boot 用户如何处理
Spring Boot 用户只有在将默认日志系统切换到 Log4J2 时才会受到此漏洞的影响。 我们包含在 spring-boot-starter-logging 中的 log4j-to-slf4j 和 log4j-api jar 不能被单独利用。 只有使用 log4j-core 并在日志消息中包含用户输入的应用程序容易受到攻击。
Spring Boot 即将发布的 v2.5.8 和 v2.6.2 版本(2021 年 12 月 23 日到期)将采用 Log4J v2.15.0,但由于这是一个如此严重的漏洞,您可能希望覆盖我们的依赖项管理并尽快升级您的 Log4J2 依赖项。
Maven 处理log4j2指南
对于 Maven 用户,您可以按照这些说明进行设置 log4j2.version 属性.
<properties>
<log4j2.version>2.15.0</log4j2.version>
</properties>
如何确认是否成功修复?运行 ./mvnw dependency:list | grep log4j
检测版本是否为2.15.0
.
通过JVM参数处理漏洞
如果程序/系统很难升级,则可以选择追加参数避免该漏洞。
设置log4j2.formatMsgNoLookups
系统参数为true
即可
例如
java -Dlog4j2.formatMsgNoLookups=true -jar myapp.jar.
设置系统环境变量解决
将系统变量“LOG4J_FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS
” 设置为 “true
”
powered by zhengkai.blog.csdn.net
设置log4j2.component.properties解决
在项目 classpath 目录下添加 log4j2.component.properties 配置文件,设置 log4j2.formatMsgNoLookups=true
如何查看框架的log4j版本
可以通过maven仓库分解对应的log4j版本
https://mvnrepository.com
Jfinal与log4j漏洞有关吗
例如Jfinal,可以通过maven仓库分解对应的log4j版本
https://mvnrepository.com/artifact/com.jfinal/jfinal/4.1
拆解得知是1.2.16
,安全!
如果你使用最新版本4.9.7,也是安全的,因为用的还是1.2.x
https://mvnrepository.com/artifact/com.jfinal/jfinal/4.9.17
spring-boot-starter-logging
可以到 https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-logging/2.5.7
例如你使用了spring-boot-starter-logging
2.5.7 ,包含了log4j的2.14.1
版本,还是相当危险,最好等待官方发最新 2.5.8
Spring-Boot-strater-log4j2
更是绝对的危险,等候官方推送新版解决。
使用Scantist SCA检测及分析
Scantist SCA平台 https://scantist.io , 来源
为了解决开源软件的漏洞检测和管理的问题,Scantist SCA产品是一套完整的解决方案,同时支持源码和二进制扫描,通过提供对应用程序软件供应链的更大可视性,主动帮助企业管理开源库的安全性和合规性风险。Scantist SCA通过分析软件应用程序中已知的第三方库和组件的特殊签名,并与漏洞和许可证数据库进行交叉对比,以识别软件开发和部署阶段中的安全隐患。
分析报告
加更:Log4J 2.16.0修复版发布
修复Log4J2 Vulnerability问题
更新内容:
-
删除了消息Lookups。目的是采取强化措施以防止 CVE-2021-44228,此举措不是修复 CVE-2021-44228所必须的。
-
虽然版本 2.15.0 删除了处理Lookups和利用JNDI从日志消息和地址访问的问题,Log4j团队认为默认启用 JNDI 会引入未知的风险。从版本 2.16.0 开始,JNDI 功能是默认情况下禁用,可以通过 log4j2.enableJndi重新启用系统属性。在不受保护的上下文中使用 JNDI 是一个很大的问题 安全风险,应该在这个库和 所有其他使用 JNDI 的 Java 库。
-
在 2.15.0 版本之前,Log4j 会在模式布局(Pattern Layout)中包含的消息或参数中自动解析 Lookups。这行为不再是默认值,必须通过指定启用%msglookup。:
修正错误
-
LOG4J2-3208:默认禁用 JNDI。需要 log4j2.enableJndi设置为 true 以允许 JNDI。 LOG4J2-3211:完全删除对消息查找的支持。
-
Apache Log4j 2.16.0 至少需要 Java 8 才能构建和运行。Log4j 2.12.1 是最后一个支持 Java 7 的版本。Java 7 不是Log4j 团队的长期支持版本。
-
有关 Apache Log4j 2 的完整信息,包括有关如何提交错误报告、补丁或改进建议,请参阅 Apache Apache Log4j 2 网站:
https://issues.apache.org/jira/browse/LOG4J2-2975
https://logging.apache.org/log4j/2.x/download.html
ESET快速响应模块检测拦截此漏洞: JAVA/Exploit.CVE-2021-44228
ESET已经在全球范围内推动了组件更新,请确保“快速响应模块”已经更新到版本19417以上
其他情况
欢迎讨论和补充!
以上是关于Spring Boot Log4j2漏洞修复指南 (Log4J2 Vulnerability and Spring Boot)的主要内容,如果未能解决你的问题,请参考以下文章
一行配置搞定Spring Boot项目的 log4j2 核弹漏洞!
一行配置解决Spring Boot项目的log4j2核弹漏洞
一行配置解决Spring Boot项目的log4j2核弹漏洞
Spring-Boot-strater-log4j2怎么修复漏洞
终于!Spring Boot 最新版发布,一招解决 Log4j2 核弹级漏洞!
Spring Boot2 + Gradle5 + Log4j2 启动出现 StackOverflowError 问题的解决方法