【问题标题】:What are the security risks in the serialization of a lambda expression?lambda 表达式的序列化有哪些安全风险?
【发布时间】:2016-08-22 11:52:18
【问题描述】:

刚刚回顾了 Streams 和 Java 8 Lambda 功能,以及对原本不言自明的 Oracle 文档 Lambda Expressions 的最后评论指出:

你可以序列化一个 lambda 表达式,如果它的目标类型和它的 捕获的参数是可序列化的。然而,像内部类一样, 强烈建议不要对 lambda 表达式进行序列化。

检查这个我发现了 SO 问题

How to serialize a lambda?

OP 正在处理来自客户端代码的序列化 lambda 表达式。

如果我有一个 web 服务并且其中一个参数是 lambda 表达式,它似乎可能包含恶意代码,这些代码可以执行诸如文件系统访问或导致堆栈溢出之类的事情 - 所以相信它是非常愚蠢的.

我是不是夸大了安全风险,还是对序列化表达式可以包含的内容有限制?

【问题讨论】:

  • 请参阅this question 以获取示例。正如您在引用中已经指出的那样,内部类可能会引发类似的问题。不过,我不太确定如何在 Web 服务的上下文中传输 lambda 表达式。
  • 为了清楚起见,序列化 lambda 表达式并不会序列化表达式内部的代码;只有捕获的参数之类的东西。

标签: java serialization lambda java-8


【解决方案1】:

让我们这样说吧:Java 对象序列化(在一定程度上)无论如何都是一场安全噩梦(例如,参见 here)。

换句话说:序列化本身就是一个需要真正深思熟虑的话题。因此,您是否谈论序列化 lambda 或任何其他类型的序列化对象并不重要。

因此,例如,您要确保了解并支持相应的规则,例如来自CERT

【讨论】:

    【解决方案2】:

    Oracle Secure Coding Guidelines for Java SE 中的建议之一是

    Guideline 8-3 / SERIAL-3: View deserialization the same as object construction

    本质上,应用于构造函数参数的相同验证检查也应应用于传入的反序列化数据。通过提供执行验证的readObject 方法,可以对普通对象执行此操作。但是,不能为序列化 lambda 提供 readObject 方法,因此无法对 lambda 的序列化数据执行任何验证。

    序列化 lambda 与普通对象的序列化共享所有安全风险,但在这方面,序列化 lambda 遭受比普通可序列化对象更广泛的安全风险。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 2018-09-09
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多