http://www.meiguoidc.com

从源码看Log4j2、FastJson漏洞

远程代码漏洞对广大程序员来并不陌生,远程代码执行是指攻击者可能会通过远程调用的方式来攻击或控制计算机设备,无论该设备在哪里。如果远程代码执行的是一个死循环那服务器的CPU不得美滋滋了。

前段时间,Java 界的知名日志框架 Log4j2 发现了远程代码执行漏洞,漏洞风暴席卷各大公司,编程届异常火热(加班),我们是万万没想到那么牛逼的日志框架有BUG。

这次安全漏洞也有个小插曲,我司的员工发现了漏洞,上报了Apache没告知GXB,我司也受到了处罚,希望下次引以为戒,不过这事程序员不背锅,管理下次要反思下。

本次 Apache Log4j 远程代码执行漏洞,是由于组件存在 Java JNDI 注入漏洞:

当程序将用户输入的数据记入日志时,攻击者通过构造特殊请求,来触发 Apache Log4j2 中的远程代码执行漏洞,从而利用此漏洞在目标服务器上执行任意代码。

JNDI 是Java 命名和目录接口(Java Naming and Directory Interface,JNDI)的简称,从一开始就一直是 Java 2平台企业版的核心技术之一。

在JMS,JMail,JDBC,EJB等技术中,就大量应用的这种技术。

JNDI可访问的现有的目录及服务有:DNS、XNam 、Novell目录服务、LDAP(Lightweight Directory Access Protocol 轻型目录访问协议)、 CORBA对象服务、文件系统、Windows XP/2000/NT/Me/9x的注册表、RMI、DSML v1&v2、NIS。

JNDI 诞生的理由很简单:随着分布式应用的发展,远程访问对象访问成为常用的方法。虽然说通过Socket等编程手段仍然可实现远程通信,但按照模式的理论来说,仍是有其局限性的。

RMI技术,RMI-IIOP技术的产生,使远程对象的查找成为了技术焦点。JNDI技术就应运而生。JNDI技术产生后,就可方便的查找远程或是本地对象。

如下展示了JNDI的架构图。

为完成Bug的复现,我们需要简单的搭建一个RMI服务。

首先编写我们的攻击代码。此处攻击代码遍历指定目录下的文件,并将其输出到指定目录中。

攻击者可以获取无法服务器的任意目录结构,恐怖如斯~

编写RMI服务并启动。

打印如下日志复现Bug。

如果一切顺利,你会发现服务器中生成了一个名为badcode.txt的文件,里面存储着指定目录下的所有文件目录。

所幸,各大安全团队迅速给出了如下解决方案(本质都一样),似乎是不使用LookUp就解决了。(终极方案是将log4j-core升级为2.16.0)

但是,乖,你不好奇吗?为什么不使用 LookUp 机制就修复了呢?

LookUps提供了一种在任意位置向 Log4j 配置添加值的方法。它们是实现 StrLookup 接口的特殊类型的插件,Log4j 提供了Date Lookup、Java LookUp、Jndi LookUp(罪魁祸首)等实现。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。