错误问题之“Apache Log4j 漏洞,在版本为包含2.14以内!”
漏洞概述
Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。
Log4j 1.2 中包含一个 SocketServer 类,该类容易受到不可信数据反序列化的影响,当侦听不可信网络流量以获取日志数据时,该类可被利用与反序列化小工具结合使用以远程执行任意代码。攻击者可利用该漏洞执行任意代码。
这会影响从 1.2 到 2.14 的 Log4j 版本。
在2021 年 12 月 9 日,该项目被曝存在 严重安全漏洞 ,攻击者只需要向目标机传入一段特殊代码,就能触发漏洞,自由地在远程执行任意代码来控制目标机器!
因为 Log4j 作为 Java 的知名日志记录框架,凭借其灵活高效的日志生成能力,不仅被众多自研项目所使用,很多有名项目作为了基础框架使用。
像 Redis、Kafka、Elasticsearch、Apache Flink、Apache Druid 等等。
可以想象这个漏洞的影响范围有多大,甚至被很多媒体称之为 “核弹级” 漏洞!
apache的问题记录点:https://logging.apache.org/log4j/2.x/
漏洞细节
根据 CVE 漏洞公开网站的记录,该漏洞存在于 Apache log4j <= 2.14.1 的版本(但事实上,影响的版本范围比这更大)。
攻击者可以通过 log4j 的 lookup 替换功能向其配置文件的任意位置注入代码(类似 SQL 注入,把 ${变量} 替换为 ${实际代码})
再加上这些版本中用到的 JNDI 特性并没有为 LDAP 提供足够的保护,使得注入的任意代码都能被肆无忌惮地执行。
测试1
不过我针对漏洞做了下测试,发现好像Apache 找已有了防备,正常情况下我被拒绝了
原因:
是rmi序列化漏洞,apach设置了过滤策略。
在注入时限制了一些类序列化。
在C:\Program Files\Java\jre1.8.0_161\lib\security\java.security【注意,你的文件目录可能不是这个目录】
处理方案:
更改为sun.rmi.registry.registryFilter=*即可。
测试2
总体介绍
接口
创建服务接口
进攻脚本
发送请求(结果弹出计算器)
解决方案
1.升级到2.15.1版本及以上
目前 Apache 官方已经针对该漏洞发布了补丁版本 2.15.0-rc2
,默认禁用了 lookup 行为,在确保升级该版本不会对项目的其他依赖产生冲突的情况下,建议升级。
该方案虽然比较简单粗暴,但这个版本是否稳定?是否没有漏洞呢?这很难说。
因在maven仓库中没有log4j-2.15.0-rc2.jar 。地址:https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2
jar包上传到本地maven仓库/从本地引入jar文件。
导入完成后 把jar引入到pom文件中。【我使用的maven仓库】
2.修改配置
a、修改jvm参数 -Dlog4j2.formatMsgNoLookups=true
b、系统环境变量 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS设置为true
c、修改配置:log4j2.formatMsgNoLookups=True
如果你不想升级 log4j 的版本,担心会和项目其他依赖产生冲突的话,可以采用 Apache 官方推荐的临时解决方案 —— 修改参数。
如果你的 log4j 版本 >= 2.10,可以通过设置系统属性 log4j2.formatMsgNoLookups
或者环境变量 LOG4J_FORMAT_MSG_NO_LOOKUPS
为 true
来禁用 lookup 行为;如果版本在 2.0-beta9 到 2.10.0 之间, 可以直接移除从 classpath 中移除 JndiLookup
类,用以下命令即可:
zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
这个方案相对不容易引发项目的冲突,如果项目很紧急且重要,先用它处理吧。
3.换框架
直接换成别的日志框架,如logback