BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

从Java 9反向移植对象反序列化过滤器

| 作者 Abraham Marín Pérez 关注 8 他的粉丝 ,译者 谢丽 关注 9 他的粉丝 发布于 2017年3月31日. 估计阅读时间: 3 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

JEP 290让开发人员可以在反序列化对象时对传入数据进行过滤。该提案最初是针对Java 9提出的,但现在已经反向移植到Java 6、7、8。该特性提供了一种机制,可以在处理对象输入流时过滤传入数据,并且可以帮助预防反序列化漏洞。前不久,这种漏洞曾影响了Apache Commons及其他库。

反序列化不可信任数据是开放Web应用安全项目(OWASP)和CERT Oracle Coding Standard for Java(尤其是规则SER12-JSER13-J)等所列出的一个众所周知的风险。软件开发人员应该总是检查通过ObjectInputStream传入的数据是否有效,不过,借助JDK中现有的工具,这有时候并不容易实现。JEP 290改变了这种情况,它提供了一种方法过滤传入数据,而且不需要扩展ObjectInputStream。这是通过多种机制实现的,取决于相关开发人员的需要。

一般来说,开发人员可以通过编辑系统属性jdk.serialFilter或者conf/security/java.properties中的安全属性jdk.serialFilter配置默认的ObjectInputFilter。这些属性可以接受一种或多种模式,用于查找类(使用类似Ant文件模式的语法),或者设置对反序列化对象属性的限制:


// 拒绝反序列化任何属于untrustedmodule的类,
// 以及任何元素数超过500的数组
jdk.serialFilter=!untrustedmodule/.**;maxarray=500 

// 包com.myorg.trusted的白名单类,
// 但不一定是来自子包
jdk.serialFilter=com.myorg.trusted.* 

如果需要更大的灵活性,那么开发人员可以指定自己的动作和检查,实现自己的ObjectInputFilter,然后使用setObjectInputFilter应用到已有的ObjectInputStreamObjectInputFilter可以使用ObjectInputFilter.FilterInfo提供的信息确定当前正在反序列化的对象是可以接受还是需要拒绝,或者该过滤器并没有提供足够的决策信息;在后一种情况下,自定义的过滤器可以将状态置为“不确定”,并委托另一个用户定义的过滤器或者默认的系统过滤器进行决策。

最后,如果开发人员希望在所有的反序列化过程中都使用自己的机制,就可以使用ObjectInputFilter.Config.setSerialFilter将一个用户定义的过滤器指定为系统默认的过滤器。

如本文开头所言,开发人员不需要等到Java 9才开始应用序列化过滤器;Java 8 update 121、Java 7 update 131、Java 6 update 141均提供了JEP 290。

查看英文原文Object Deserialisation Filters Backported from Java 9

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT