错误问题之“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 

 

posted @ 2021-12-13 19:44  骚哥  阅读(4058)  评论(0编辑  收藏  举报