Java反序列化漏洞探析及其修复方法研究

2016-11-07 07:25徐江珮蔡攸敏
湖北电力 2016年11期
关键词:序列化漏洞应用程序

徐江珮,王 捷,蔡攸敏,刘 畅

(国网湖北省电力公司电力科学研究院,湖北 武汉 430077)

Java反序列化漏洞探析及其修复方法研究

徐江珮,王 捷,蔡攸敏,刘 畅

(国网湖北省电力公司电力科学研究院,湖北 武汉 430077)

为避免利用Java反序列化漏洞影响企业核心业务、产生重大信息安全事件,详细介绍了Java反序列化漏洞的背景、原理、漏洞利用方法及工具,通过一个具体实例给出利用该漏洞进行服务器主机系统提权的详细步骤,并提出了多种漏洞修复方法。

Java反序列化漏洞;漏洞利用;信息安全

0 引言

Java反序列化漏洞是2015年11月初曝出的一种新型信息安全高危漏洞,存在于Apache Commons Collections等Java公共库中,其广泛影响各种基于Java编写的应用程序,被称为2015年最被低估、具有巨大破坏力的信息安全漏洞之一。通过利用WebLogic、WebSphere、JBoss、Jenkins、OpenNMS等主流中间件和框架的Java反序列化漏洞,攻击者可以很容易地实现远程任意代码执行,进而夺取Web服务器的完全控制权限,实施各种高危入侵行为。重视并研究Java反序列化漏洞原理、漏洞利用工具和方法,针对该漏洞提出有效可行的修复方案,对保障电网信息系统的正常稳定运行具有重大现实意义。

1 Java反序列化漏洞概述

1.1 漏洞背景

2015年1月28日,国外两位信息安全研究人员在AppSecCali 2015大会上指出Java反序列化漏洞可以利用常用Java库Apache Common Collections实现远程任意代码执行,并提供对应漏洞利用工具,但当时并未引起广泛重视。

直到2015年11月6日,国外FoxGlove Security安全团队的一名成员在其一篇文章中详细介绍了如何利用Java反序列化漏洞攻击最新版本的WebLogic、WebSphere、JBoss、Jenkins、OpenNMS等主流的基于Ja⁃va架构的中间件和框架,实现远程任意代码执行、获取网站服务器控制权等严重危害行为,该漏洞才引起了安全业界的广泛关注。此后,国内外许多知名企业、公司不断被曝出因Java反序列化漏洞被获得Web服务器控制权限的重大信息安全事件,使该漏洞一跃成为2015年信息安全领域最热门话题之一。

2015年11月16日,国家信息安全漏洞共享平台(CNVD)收录Java反序列化漏洞,将其正式命名为Apache Commons Components Invoker Transformer反序列化任意代码执行漏洞,漏洞编号为CNVD-2015-07556,漏洞综合评级为高危。

1.2 漏洞产生原理

Java是一种可以撰写跨平台应用程序的面向对象程序设计语言,具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动设备和互联网中。在最新的编程语言排行榜中,Java仍然高居首位,在所有编程语言中占有最高的使用率(20.5%)[1]。在当今全球云计算、大数据、物联网和移动应用产业快速发展的环境下,不断更新升级的Java技术展现了卓越的竞争力和愈加广阔的应用前景。

在Java中,序列化是指将对象转换成字节流,以便于存储在内存、文件、数据库中或者在网络上进行传送,该处理由ObjectOutputStream类的writeObject()方法实现;反序列化是序列化的逆过程,将字节流还原成Java对象,该处理由ObjectInputStream类的readObject()方法实现[2]。图1显示了Java对象从序列化到反序列化的完整处理流程。

图1 Java序列化和反序列化示意图Fig.1 Diagram of Java serialization and deserialization

Java序列化及反序列化处理在基于Java架构的Web应用中具有尤为重要的作用。位于网络两端、彼此不共享内存信息的两个Web应用在进行远程通信时,无论相互间发送何种类型的数据,在网络中实际上都是以二进制序列的形式传输的。为此,发送方就必须将要发送的Java对象序列化为字节流,接收方则需要将字节流再反序列化还原得到Java对象,才能实现正常通信。

只要Java应用允许对用户输入的不可信数据进行反序列化处理,那么攻击者就可以通过构造恶意输入来使反序列产生非预期的Java对象,在产生过程中就可能带来任意代码执行问题,这就是Java反序列化漏洞的产生原理。其根源在于:

(1)ObjectInputStream类在进行反序列化操作时,不会调用构造函数对生成对象的类型进行任何校验;

(2)CommonsCollections组件中对于集合的操作存在可以进行反射调用的方法。

正因为Java反序列化漏洞是因Java自身设计缺陷所致,所以才广泛存在于各种基于Java开发的应用中。只要Java应用的Class Path包含Apache Com⁃mons Collections的jar包,无论源码是否使用了Apache Commons Collections中的类,都有可能导致远程代码执行。

2 漏洞利用方法及工具

基于Java反序列化漏洞的原理,要利用该漏洞,首先需要在目标Java应用中找到一个接受外部输入的序列化对象的反序列化接收点。可以通过两种方式寻找:

(1)对应用源码中关于调用反序列化函数的部分进行审计;

(2)对应用交互流量进行抓包,查看是否包含以“ac ed 00 05”标记开头的序列化数据。成功找到接收点后,再检查目标应用的Class Path中是否包含Apache Commons Collections库,如果包含,就可以使用Java反序列化漏洞利用工具生成反序列化pay⁃load,通过传入对象方式进行注入,触发ObjectInput⁃Stream的反序列化操作,并通过反射调用Runtime.getRunTime.exec,实现对漏洞的利用。

目前几款常见的Java反序列化漏洞利用工具如表1所示。

表1 Java反序列化漏洞利用工具Tab.1 Tools of Java deserialization vulnerability exploitation

ysoserial是由国外人员开发的最早的Java反序列化漏洞利用工具,运行于命令行窗口;WebLog⁃ic_EXP是专门针对WebLogic开发的Java反序列化漏洞利用工具。该工具具有图形化使用界面,支持本地命令执行并回显,连接目标主机后可通过文件上传、执行CMD语句等方式验证目标服务器Web⁃Logic是否存在Java反序列化漏洞;JBOSS_EXP是专用于JBoss的Java反序列化漏洞利用工具;Java反序列化终极测试工具是集成了JBoss、WebLogic和WebSphere的反序列化漏洞利用工具,支持纯内网环境检测、https数据传输、文件目录列表等功能。上述四款工具是目前使用较为普遍的Java反序列化漏洞利用工具。

3 利用漏洞获取系统权限实例

Weblogic在国内的应用范围比较广,支撑着很多企业的核心业务,以下通过一个实例介绍如何探测存在Java反序列化漏洞的WebLogic服务器,进而利用漏洞获取服务器主机系统控制权限的方法步骤。利用漏洞获取系统权限的主要流程如图2所示。

图2 利用漏洞获取系统权限流程图Fig.2 Flow chart of acquiring the privilege of system by vulnerability exploitation

以图2为依据,给出主要步骤的详细描述如下。

(1)端口扫描

选择功能强大的“啊D网络工具包”端口扫描工具进行扫描。设置一段IP地址范围,端口设置为WebLogic默认端口7001,如图3所示。

图3 端口扫描Fig.3 Port scanning

(2)连接测试

对上一步扫描发现的所有开放7001端口的IP列表,利用WebLogic_EXP工具逐一验证是否可连接。经过大量手工测试,发现某一IP的WebLogic服务器可成功连接,如图4所示。

图4 利用WebLogic_EXP成功连接WebLogic服务器Fig.4 Successfully connect to WebLogic server by using WebLogic_EXP

(3)添加用户

第一步,在CMD栏输入“whoami”并点击Execute执行;

第二步,运行“net localgroup administrators”查看管理员组;

第三步,运行“net user test test/add”添加一个账户名和密码均为“test”的用户;

第四步,再运行“net localgroup administrators test/add”将该用户加入到管理员组中;

第五步,再次运行“net localgroup administrators”可见管理员组列表新增了“test”用户。如图5所示,表明操作系统用户创建成功。

图5 利用WebLogic_EXP向WebLogic服务器主机成功添加用户Fig.5 Successfully add a user to WebLogic server host by using WebLogic_EXP

(4)远程连接

最后,利用上一步创建的test/test远程连接某一地址实现成功登录,如图6所示。可完全访问和控制该服务器中的任何文件,达到渗透目的。

图6 成功远程登录WebLogic服务器主机Fig.6 Successful remote login to WebLogic server host

以上利用Java反序列化漏洞快速成功实现渗透的案例充分表明,该漏洞极易被利用,且能造成十分严重的后果。因此,凡是部署了基于Java的Web应用的主机都应警惕Java反序列化漏洞,并及时进行相应的安全加固工作,以避免产生恶性信息安全事件。

4 漏洞防范与修复

对于自行开发的Java应用程序,Java反序列化漏洞的防范需要开发者对Java语言进行安全性检查与安全加固。随着Java类库的功能不断更新、扩展,某个类只要实现了序列化接口,就有可能成为Java反序列化漏洞的载体。因此,针对漏洞成因,开发者应着重关注软件中用到的可序列化类,在反序列化操作之前进行安全性检查,同时进行代码安全加固,这样可以简单有效地提高安全性,有效降低漏洞爆发所造成的威胁程度。

对于通用Java应用程序,可针对主流中间件、框架的Java反序列化漏洞采取以下修复加固方法。

(1)Apache Common Collections在3.2.2及以上版本中专门针对Java反序列化漏洞进行了安全处理,即对不安全的Java类的序列化支持增加开关,并默认设置为关闭状态,因此使用官方提供的高版本commons-collections.jar替换Java应用程序lib目录的原有库可规避漏洞风险;

(2)使用NibbleSecurity公司开发的修复补丁Se⁃rialKiller替换进行序列化操作的ObjectInputStream类。该方法为临时解决方案,能快速封堵漏洞利用途径,但对应用产生的其他影响未知;

(3)在不影响正常业务的前提下,删除com⁃mons-collections.jar中的InvokerTransformer.class文件,对于JBoss,还需同时删除InstantiateFactory.class和InstantiateTransformer.class文件;

(4)将Java应用程序升级至最新版本或者不在影响范围内的版本。

5 结语

国网智研院信息安全实验室于2015年底Java反序列化漏洞公开后第一时间发布了风险预警单,对全国电力信息系统开展漏洞隐患排查,足以说明这一新漏洞的出现引起了广泛关注与重视。本文通过对漏洞的分析与利用展示,为该漏洞的挖掘探测提供了一定实践依据。文中提到的修复防范措施已在湖北电力系统中得以应用,有效提高了企业信息系统安全防护水平。

(References)

[1]郭瑞.Java反序列化漏洞研究[J].信息安全与技术,2016,7(3):27-30.GUO Rui.Research on Java deserialization vulnera⁃bility [J].Information Security and Technology,2016,7(3):27-30.

[2]Breg F,Polychronopoulos C D.Java virtual machine support for object serialization[J]. ACM Java Grande-ISCOPE (JGI2001)Conference,2001,15(3-5):263-275.

Analysis on Java Deserialization Vulnerability and Research on the Methods to Fix It

XU Jiangpei,WANG Jie,CAI Youmin,LIU Chang
(State Grid Hubei Electric Power Research Institute,Wuhan Hubei 430077,China)

In order to avoid the use of Java deserialization vulnerability to influence core busi⁃ness of the enterprise,to generate fignificant information security incidents,the background,princi⁃ple,exploit method and tool of Java deserialization vulnerability are introduced in this paper.De⁃tailed steps have been given through a specific example which exploits the vulnerability to ac⁃quirethe privilegeof a server host system,and a variety of methods to fix the vulnerability have been proposed.

Java deserialization vulnerability;vulnerability exploitation;information security

TP393

B

1006-3986(2016)11-0047-004

10.19308/j.hep.2016.11.011

2016-10-15

徐江珮(1990),女,湖北黄冈人,硕士,助理工程师。

猜你喜欢
序列化漏洞应用程序
漏洞
基于FlatBuffers的机车通信数据序列化方法应用研究
如何建构序列化阅读教学
删除Win10中自带的应用程序
谷歌禁止加密货币应用程序
三明:“两票制”堵住加价漏洞
漏洞在哪儿
Java 反序列化漏洞研究
高铁急救应补齐三漏洞
作文训练微格化、序列化初探