写点什么

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

  • 2017-03-30
  • 本文字数:956 字

    阅读完需:约 3 分钟

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

反序列化不可信任数据是开放Web 应用安全项目(OWASP)和 CERT Oracle Coding Standard for Java (尤其是规则 SER12-J SER13-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

2017-03-30 19:002428
用户头像

发布了 1008 篇内容, 共 390.9 次阅读, 收获喜欢 344 次。

关注

评论

发布
暂无评论
发现更多内容

LeetCode题解:104. 二叉树的最大深度,递归,JavaScript,详细注释

Lee Chen

大前端 LeetCode

从联想ThinkStation工作站,窥见工具文明的新纪元

脑极体

MySQL事务隔离级别

长沙造纸农

MySQL 事务隔离级别 mysql事务 事务 MySQL 运维

内存条的讲解

亚兰—硅的传奇official

原创 内存 硬件 计算机 哔哩哔哩

JDK 中的栈竟然是这样实现的?

王磊

Java 数据结构和算法

关于国际化语言 Intl

西贝

Java 大前端 国际化 格式化

古北水镇的夜

张晓楠

生活 摄影

记一次MySQL日期范围查询优化

李印

MySQL SQL优化

对不起,学会这些 Linux 知识后,我有点飘

苹果看辽宁体育

Linux 后端 操作系统 计算机

建筑行业区块链应用场景是怎样的

CECBC

区块链 行业资讯

架构师训练营第1期第四周作业二

道长

极客大学架构师训练营

架构师作业第三周学习总结

Wee权

java安全编码指南之:lock和同步的正确使用

程序那些事

java安全编码 java安全 java安全编码指南 java编码

区块链教育 丨 首批区块链专业新生正式入学

CECBC

区块链技术 区块链教育

架构1期第四周作业1-大型互联网系统技术梳理

道长

极客大学架构师训练营

“海外同步优惠”与“中国专享折扣”十大必败榜抢先放送

爱极客侠

手把手教你AspNetCore WebApi:Serilog(日志)

AI代笔

ASP.NET Core web api serilog

典型的大型互联网应用系统的技术方案和手段

讲一讲我所认为的「人生三最」,你或许能够参悟到什么

非著名程序员

程序员 个人成长 时间管理 精力管理

2020第十三届(南京)智慧城市技术与应用产品展览会

InfoQ_caf7dbb9aa8a

全屋智能2020第十三届(南京)国际智能家居展览会

InfoQ_caf7dbb9aa8a

Spring Cloud 微服务实践(7) - 日志

xiaoboey

kafka 微服务 Spring Cloud 日志 spring cloud stream

LeetCode题解:111. 二叉树的最小深度,递归,JavaScript,详细注释

Lee Chen

大前端

架构师训练营第 1 期 - 第四周学习总结

Anyou Liu

极客大学架构师训练营

架构师训练营第三周作业

Wee权

快讯2020第十三届亚洲国际物联网展览会-南京站

InfoQ_caf7dbb9aa8a

坚持写技术博客一年能有多少收获!

小傅哥

Java 面试 架构师 编程经验 技术博客

用NOSql给高并发系统加速

架构师修行之路

nosql redis 分布式 微服务

产品分析

时间是一个人最好的证明

产品经理 产品设计

20年开源老司机手把手教你玩开源——openEuler入门指南

openEuler

Linux 开源 系统操作

做好分库分表其实很难之二

架构师修行之路

微服务 分库分表

从Java 9反向移植对象反序列化过滤器_Java_Abraham Marín Pérez_InfoQ精选文章