相信大家最近都被 Apache 的 Log4j2 的漏洞相关的文章刷屏了,不得不说这次的这个漏洞影响范围之广,很多互联网大厂和开源软件都被影响到了,作为一个特别通用的日志框架,日常使用的场景非常多,而且很多开源软件都在使用,所以此次影响到一大批公司,堪称核弹级漏洞!
不过据说 2021 年 11 月 24 日,阿里云安全团队向 Apache 官方报告了 Apache Log4j2 远程代码执行漏洞,可能这是为什么阿里内部群很安静,没任何波澜的原因吧,毕竟有安全部门!但是很多其他公司是工程师就很不幸了,都表示自己在 12 月 10 号这天晚上被拉起来修复漏洞了,还有好多要给客户打补丁的。
漏洞描述
我们都知道在使用Apache Log4j2 记录日志的时候,会使用这样的格式logger.info("params: {}", params);,进行组装,不要告诉阿粉你是用加号拼装~。log4j2 底层在进行组装的时候,如果发现传入的 params 当中含有${} 字符串的话会进行替换的时候会执行 lookup 的操作,所谓的 lookup 的操作就是允许通过 JNDI检索变量。
通过 JNDI 注入漏洞,黑客可以恶意构造特殊数据请求包,触发此漏洞,从而成功利用此漏洞可以在目标服务器上执行任意代码,想想就很恐怖!也就是说当 params 中的参数包含一些特定的字符的时候,就会触发这个漏洞,这种字符数格式比如:${jndi:ldap://xxxxxx},${jndi:rmi://xxxxxx} 其中xxxxxx 表示黑客的服务地址。
黑客通过构造这样的字符串来访问目标网站,只要程序通过 log4j2 将日志进行记录,不管是什么级别,就会将 log4j2 的 lookup 功能触发,然后就会通过 RMI 访问黑客的服务地址,黑客通过这个服务输出一个 class 字节码文件,这个字节码文件里面可以执行任何内容,相当于把这个服务器都交给黑客了,后果可想而知!
攻击原理
有大佬画了一张攻击原理的图书,阿粉给大家看一下,很详细了。
相关实现的代码阿粉放到了后台,回复关键字【log4j】获取,不过复现的过程可能会比较坎坷,因为由于 JDK 版本的问题,很多小伙伴不一定能复现出来。
RMI
估计很多小伙伴看到这个漏洞的时候估计跟阿粉一样有一个疑问,那就是 RMI 是啥?运用面向搜索引擎编程的技巧,阿粉找到了下面的内容,看上去还是很好理解的。
Java RMI(Java Remote Method Invocation),即 Java 远程方法调用。是 Java 编程语言里,一种用于实现远程过程调用的应用程序编程接口。有点类似于我们常用的服务注册发现机制一样,使用 JRMP(Java Remote Message Protocol,Java远程消息交换协议)实现,使得客户端运行的程序可以调用远程服务器上的对象,有点 RPC 的感觉。
划重点
王坚博士曾说:安全是互联网公司的生命,也是每一位网民的最基本需求。
互联网软件的安全与我们每一个程序员相关,我们在日常工作中要随时有应对各种安全漏洞的准备,写的代码也有尽量没有漏洞。为此阿粉特意找来了一本由阿里知名白帽子道哥编写的《白帽子讲 Web 安全》书籍,里面分析了很多种 Web 安全,如下面所示,让我们为互联网的安全做一点小小的贡献。