JAVA序列化危机

Apache Commons Collection 中的反序列化漏洞在 2016 年撼动了整个Java 生态系统,也影响到了 70 余个其他的 Java 库,甚至还让 PayPal 的服务器遭受影响。
OWASP组织将“不安全的反序列化”列为2017年10项最严重的Web 应用程序安全风险榜的第8位。

Android 反序列化漏洞 CVE-2014-7911

Android <5.0系统中,可以利用ObjectInputStream未校验是否可反序列化的漏洞,恶意传入不可序列化对象将产生类型混淆,成员变量被当成指针向system_server进程注入代码,由于system_server拥有system权限,从而使得注入的代码以system权限执行。

序列化代理模式

由于使用序列化在整个行业的巨大风险,在java取消或使用新的替代品之前,最好对序列化行为进行代理,可以阻止伪字节流***和内部域盗用***,避免造成重大损失。

java的隐藏方法

隐藏方法介绍:
readObject()和writeObject(),可以自定义序列化传输过程,例如在前后添加自定义内容,或者直接修改返回结果;可以在readObject添加保护性代码,校验是否真实结果。

writeReplace():实际序列化的对象将是作为writeReplace方法返回值的对象,而且序列化过程的依据是实际被序列化对象的序列化实现。

readResolve():在类中有多个实例时,可以通过该方法去决定反序列化后的结果。

在Serializable接口定义中并无这些方法,实际是ObjectOutputStream使用了反射来寻找是否声明了这些隐藏方法再进行调用。

使用隐藏方法实现序列化代理模式

参照Effective Java序列化代理模式如下:

public class Interval implements Serializable {    private final Date start;    private final Date end;    public Interval(Date start, Date end) {        this.start = new Date(start.getTime());        this.end = new Date(end.getTime());        if (this.start.compareTo(this.end) > 0)            throw new IllegalArgumentException(start + " after " + end);    }//提供序列化方法    private Object writeReplace() {    return new SerializationProxy(this);    }//禁止反序列化外围类private void readObject(ObjectInputStream ois) throws InvalidObjectException {    throw new InvalidObjectException("Proxy required!");}    public Date getStart() {return new Date(start.getTime());}    public Date getEnd() {return new Date(end.getTime());}    @Override    public String toString() {        return "Interval{" + "start=" + start + ", end=" + end + '}';    }    private static class SerializationProxy implements Serializable {        private static final long serivalVersionUID = 213214124141L;        private final Date start;        private final Date end;        SerializationProxy(Interval interval) {            this.start = interval.start;            this.end = interval.end;        }//转回外围类private Object readResolve() {    return new Interval(start, end);}    }}
注意应用场景和使用的缺陷

1 扩展性差,需要同步修改实例对象和代理对象。
2 如果直接使用代理类,无法调用对象方法,需要转换成实际类使用。
3 安全但开销更大。

更多相关文章

  1. Android统一处理断网
  2. Android应用程序的默认最大内存值以及修改
  3. MTK Android(安卓)紧急号码修改
  4. Android(安卓)如何实现带滚动条的TextView,在更新文字时自动滚动
  5. activity和service之间的相互通信方法
  6. Android(安卓)Handler,Looper,MessageQueue关系(讲解比较透彻的)
  7. Android(安卓)setTag方法的key问题
  8. android Bitmap如何保存成为一个bmp文件
  9. Android(安卓)通知栏Notification的整合 全面学习 (一个DEMO让你

随机推荐

  1. Android(安卓)BLE开发之初识GATT
  2. Android(安卓)Webview 使用小结
  3. Android中Gridview和ViewPager显示图片的
  4. Android的apk安装时签名相同冲突解决
  5. (转)Activity的详解
  6. Git使用规范 Android(安卓)版
  7. 2014-10-25Android学习--------Android应
  8. Android平台入门介绍
  9. 本土企业如何在智能时代的“端云整合”大
  10. Android(安卓)字符串应用浅析