在博客文章“ 将Google的协议缓冲区与Java结合使用 ”中,我引用了乔什·布洛赫(Josh Bloch)的第三版的有效Java ,他写道:“没有理由在您编写的任何新系统中使用Java序列化。” Bloch建议使用“跨平台结构化数据表示形式”,而不是Java的反序列化。
拟议的JDK 11 API文档将包含有关使用Java反序列化的更强有力的声明, 本文将对此进行简要介绍。
“ Java SE 11(18.9) ( JSR 384 )”规范的第二稿包括一个称为“ API Specification Differences”的“ A2附件”,其中包括对基于Javadoc的java.io软件包的更改。 新的java.io
软件包文档将包含以下高级警告注释:
警告:不信任数据的反序列化本质上是危险的,应避免。 应根据Java SE安全编码指南中的“ 序列化和反序列化 ”部分,仔细验证不可信数据。
在撰写本文时,所引用的Java SE安全编码准则指出其当前为6.0版,并且已“针对Java SE 9更新”。
JDK 11中软件包java.io
的预期软件包级文档还将提供指向以下其他参考的链接(但可能是基于JDK 11的参考):
- Java对象序列化规范 (JDK 10链接)
- 串行过滤最佳实践 (JDK 10链接)
- serialver工具 (JDK 10链接)
以前指向“ Java Object Serialization ”(JDK 8)文档的参考链接将从java.io
的软件包文档中删除。
除了将在JDK 11中更新的与Java反序列化的危险有关的java.io
软件包文档之外, java.io.Serializable接口的Javadoc注释也收到了类似的高级警告消息。
鉴于过去几年中有关Java序列化和反序列化的各种声明,对JDK 11中基于Javadoc文档的这些更改不足为奇。 “ RFR 8197595:序列化javadoc应该链接到安全性最佳实践 ”,特别说明了添加此文档的必要性。 最近的InfoWorld文章名为“ Oracle计划转储有风险的Java序列化 ”和ADT杂志上的文章“ 从Java删除序列化是Oracle的 “ 长期目标” ”引用了Mark Reinhold在Devoxx UK 2018上的声明, 即向 Java添加序列化是“ 1997年的可怕错误”。
之前曾有讨论删除Java序列化。 JEP 154:创建删除序列化的目的是“弃用,禁用并最终删除Java SE Platform的序列化工具。” 但是,JEP的状态现在为“已关闭/已撤回”。 不过,随着有关删除Java序列化的讨论越来越多,为所有新系统考虑Java序列化的替代方法似乎是审慎的做法,这正是Bloch在Effective Java 第三版中的建议 。 所有这些,Apostolos Giannakidis在博客文章“ 序列化已死! 序列化万岁! ”表示“反序列化漏洞不会消失”,因为“ Java的本机序列化不是唯一有缺陷的序列化技术。”
其他参考
- Java对象序列化规范
- JDK 10:序列化过滤
- 从Java中删除序列化是Oracle的“长期目标”
- 序列化已死! 序列化万岁!
- Java的新(有缺陷的)序列化过滤初探
- Java反序列化的风险
- 序列化不是Java的Heartbleed Bug
- Java反序列化安全性常见问题解答
- 幸存的Java反序列化启示录 (OWASP AppSecEU 2016)
- CWE-502:不信任数据的反序列化
翻译自: https://www.javacodegeeks.com/2018/06/beginning-end-java-serialization.html