文档章节

【技术分享】JAVA反序列化安全实例解析

Oscarfff
 Oscarfff
发布于 2016/10/31 07:55
字数 1208
阅读 159
收藏 0

http://bobao.360.cn/learning/detail/3142.html

什么是序列化

序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

简单来说:

序列化: 将数据结构或对象转换成二进制串的过程

反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程

http://p6.qhimg.com/t019c3c164997ef5740.png

下面是将字符串对象先进行序列化,存储到本地文件,然后再通过反序列化进行恢复的样例代码:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

public static void main(String args[]) throws Exception {

    String obj = "hello world!";

    // 将序列化对象写入文件object.db中

    FileOutputStream fos = new FileOutputStream("object.db");

    ObjectOutputStream os = new ObjectOutputStream(fos);

    os.writeObject(obj);

    os.close();

    // 从文件object.db中读取数据

    FileInputStream fis = new FileInputStream("object.db");

    ObjectInputStream ois = new ObjectInputStream(fis);

    // 通过反序列化恢复对象obj

    String obj2 = (String)ois.readObject();

    ois.close();

}

 

反序列化漏洞原理

反序列化漏洞的本质就是反序列化机制打破了数据和对象的边界,导致攻击者注入的恶意序列化数据在反序列化过程中被还原成对象,控制了对象就可能在目标系统上面执行攻击代码。Java序列化应用于RMI JMX JMS 技术中。

 

漏洞危害

http://p3.qhimg.com/t010356b3efcba6aaa4.png

案例一:Apache ActiveMQ 5.12.0 远程代码执行漏洞(JMS)

Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序未能限制可在代理中序列化的类。远程攻击者可借助特制的序列化的Java Message Service (JMS) ObjectMessage对象利用该漏洞执行任意代码。

http://p5.qhimg.com/t0135ba820c94abf99b.png

http://p1.qhimg.com/t0192f8cfc6e0f1cf9f.png

http://p4.qhimg.com/t016dc6527cc22d3a25.png

受到影响的消息系统如下

Apache ActiveMQ 5.12.0 and earlier

HornetQ 2.4.0 and earlier

Oracle OpenMQ 5.1 and earlier

IBM Websphere MQ 8.0.0.4 and earlier

Oracle Weblogic 12c and earlier

Pivotal RabbitMQ JMS client 1.4.6 and earlier

IBM MessageSight MessageSight V1.2 JMSClient and earlier

SwiftMQ JMS client 9.7.3 and earlier

Apache ActiveMQ Artemis client 1.2.0 and earlier

Apache Qpid JMS client 0.9.0 and earlier

Amazon SQS Java Messaging Library 1.0.0 and earlier

案例二:JBoss 反序列化漏洞(JMX)

Jboss利用的是HTTP协议,可以在任何端口上运行,默认安装在8080端口中。JMX是一个java的管理协议,在Jboss中的JMXInvokerServlet可以使用HTTP协议与其进行通话。这一通信功能依赖于java的序列化类。

本地构造恶意的序列化对象

http://p8.qhimg.com/t01fb4925819b7f5adc.png

构造恶意的序列化对象发送给目标主机:

http://p4.qhimg.com/t01193fd609436cc6a5.png

执行系统命令

http://p5.qhimg.com/t0173b19dfe98061b94.png

RedHat发布JBoss相关产品的解决方案:

https://access.redhat.com/solutions/2045023

受影响的JBoss产品有:

Environment

Red Hat JBoss A-MQ 6.x

Red Hat JBoss BPM Suite (BPMS) 6.x

Red Hat JBoss BRMS 6.x

Red Hat JBoss BRMS 5.x

Red Hat JBoss Data Grid (JDG) 6.x

Red Hat JBoss Data Virtualization (JDV) 6.x

Red Hat JBoss Data Virtualization (JDV) 5.x

Red Hat JBoss Enterprise Application Platform 6.x

Red Hat JBoss Enterprise Application Platform 5.x

Red Hat JBoss Enterprise Application Platform 4.3.x

Red Hat JBoss Fuse 6.x

Red Hat JBoss Fuse Service Works (FSW) 6.x

Red Hat JBoss Operations Network (JBoss ON) 3.x

Red Hat JBoss Portal 6.x

Red Hat JBoss SOA Platform (SOA-P) 5.x

Red Hat JBoss Web Server (JWS) 3.x

案例三:

Jenkins Remoting的相关API是用于实现分布式环境中master和slave节点或者master和CLI的访问,API没有身份认证并且支持序列化对象。CVE-2016-0788通过Jenkins Remoting巧妙地开启JRMP,JRMP触发反序列化操作,从而进行漏洞的利用。作者已经提供了完整利用POC:

在远程服务器开启JRMI端口

http://p6.qhimg.com/t01c04d1258f2ec690a.png

连接远程服务端口,发送恶意序列化数据包

http://p4.qhimg.com/t012f481d7e180a1182.png

这样在Jenkins的根目录就会生成一个pwned文件。

受影响的版本

All Jenkins main line releases up to and including 1.649

All Jenkins LTS releases up to and including 1.642.1 

 

漏洞防御

1、反序列化对象白名单控制,在resolveClass方法中校验对象名字。

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

public class LookAheadObjectInputStream extends ObjectInputStream {

   public LookAheadObjectInputStream(InputStream inputStream)

         throws IOException {

      super(inputStream);

   }

   /**

    * Only deserialize instances of our expected Bicycle class

    */

   @Override

   protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException,

         ClassNotFoundException {

      if (!desc.getName().equals(Bicycle.class.getName())) {

         throw new InvalidClassException(

               "Unauthorized deserialization attempt", desc.getName());

      }

      return super.resolveClass(desc);

   }

}

2、序列化数据采用对称加密进行传输,接口调用增加身份认证。(此种方法仅仅能提升攻击成本)

3、因为序列化机制不能保证数据的完整和和保密性,如果类中存在敏感数据并且那么这个类还需要序列化,需要在特定对象的一个域上关闭serialization,在这个域前加上关键字transient即可。

更多关注携程安全应急响应中心公众号(CSRC)

本文转载自:http://bobao.360.cn/learning/detail/3142.html

Oscarfff
粉丝 74
博文 816
码字总数 97116
作品 0
崇明
后端工程师
私信 提问
Java序列化技术即将被废除!!!

我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术。Java序列化技术正是将对象转变成一串由二进制字节组成的数组,可以通过将二进制数据...

Java技术栈
2018/05/30
0
0
Jackson工具类使用及配置指南、高性能配置(转)

Jackson使用工具类 通常,我们对JSON格式的数据,只会进行解析和封装两种,也就是以及。 public class JsonUtils { Logger for this class } 将json string反序列化成对象 @param json @par...

easonjim
2018/02/16
0
0
Java序列化与JSON序列化大比拼

一、背景 有项目需要传输Map结构的数据,有人倾向用Java序列化来做,有人倾向用JSON的序列化来做。所以我们还是比比吧。 Java观点:Object2Object,使用时简单快速。 JSON观点:JSON格式与语...

NoahX
2013/03/10
0
20
有效选择七个关于 Java 的 JSON 开源类库

有效选择七个关于Java的JSON开源类库 April 4, 2014 By Constantin Marian Alin 翻译:无若 (英语原文:http://www.developer.com/lang/jscript/top-7-open-source-json-binding-providers-......

溪边九节
2014/04/19
12.5K
14
Serializable & Parcelable

对象序列化的简单介绍 所谓对象的序列化其实就是把JVM运行过程中生成的对象通过特殊的处理手段转换为字节形式的文件。转换之后就可以将其永久保存到磁盘中,或者以字节流进行网络传输。 在A...

吴七禁
2017/12/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring系列教程八: Spring实现事务的两种方式

一、 Spring事务概念: 事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。...

我叫小糖主
今天
5
0
CentOS 的基本使用

1. 使用 sudo 命令, 可以以 root 身份执行命令, 必须要在 /etc/sudoers 中定义普通用户 2. 设置 阿里云 yum 镜像, 参考 https://opsx.alibaba.com/mirror # 备份mv /etc/yum.repos.d/CentO...

北漂的我
昨天
3
0
Proxmox VE技巧 移除PVE “没有有效订阅” 的弹窗提示

登陆的时候提示没有有效的订阅You do not have a valid subscription for this server. Please visit www.proxmox.com to get a list of available options. 用的是免费版的,所以每次都提示......

以谁为师
昨天
3
0
Java设计模式之外观模式(门面模式)

什么是外观模式   外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口...

须臾之余
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部