写点什么

从 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:002909
用户头像

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

关注

评论

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

剖析Golang Context:从使用场景到源码分析

伴鱼技术团队

源码分析 并发编程 程序语言 Context Go 语言

架构师训练营第一课

Coder的技术之路

第一周总结

LEAF

低调的网易又要上市了

池建强

创业 网易 慢公司

架构师训练营-作业-第一讲

吕浩

极客大学架构师训练营

架构师训练营作业一:食堂就餐卡系统设计

sunnywhy

架构师训练营第一周(总结)

任鉴非

8000字长文让你彻底了解 Java 8 的 Lambda、函数式接口、Stream 用法和原理

古时的风筝

函数式接口 Lambda stream Java 25 周年

食堂就餐卡系统设计

LEAF

食堂就餐卡系统设计

Kiroro

UML作业

王志祥

极客大学架构师训练营

为什么建立自己的规则很重要

Neco.W

自我管理 行动派 执行力

架构师训练营第1周_学习总结

chinsun1

架构总结

Hello World!

东哥

极客大学架构师训练营

架构师训练营 No.1 周作业

连增申

架构师训练营第一周总结

Kiroro

一篇文章快速搞懂 Atomic(原子整数/原子引用/原子数组/LongAdder)

学习Java的小姐姐

Java 并发编程 并发 synchronized Atomic

食堂就餐卡系统架构设计

dj_cd

极客大学架构师训练营

架构师作业一:食堂就餐卡系统设计

李锦

第1周 - 学习总结

大海

聊聊Java中的Thread类

geekymv

线程 Java25周年 Thread Runnable

架构师训练营-学习总结-第一周

ashuai1106

学习 架构师 极客大学架构师训练营

Week1命题作业

星河寒水

部署图 时序图 组件图 用例图

week01 UML 学习总结

李锦

架构建模总结

任鉴非

【架构】— 一个简单系统的UML模型

不二架构

极客大学架构师训练营 UML 架构总结

架构师训练营第一周 - 学习总结

Eric

极客大学架构师训练营

食堂就餐系统设计

Hugo

老当益壮的 Servlet

侯树成

Java Java 25 周年 Servlet

第二章.软件架构设计

西柚

架构师训练营Week1总结

sunnywhy

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