JAVA与Android 世界级序列化危机与应对方案
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JAVA与Android 世界级序列化危机与应对方案,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2492字,纯文字阅读大概需要4分钟。
内容图文
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 安全但开销更大。
内容总结
以上是互联网集市为您收集整理的JAVA与Android 世界级序列化危机与应对方案全部内容,希望文章能够帮你解决JAVA与Android 世界级序列化危机与应对方案所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。