成都网站建设设计

将想法与焦点和您一起共享

JAVA与Android世界级序列化危机与应对方案-创新互联

JAVA序列化危机

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

北票ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18980820575(备注:SSL证书合作)期待与您的合作!
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 安全但开销更大。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前文章:JAVA与Android世界级序列化危机与应对方案-创新互联
URL网址:http://chengdu.cdxwcx.cn/article/dohigc.html