在Lambda表达式序列化中存在哪些安全风险?

9

我正在了解Java 8中的Streams和Lambda功能,而且在Oracle文档Lambda表达式中,最后一条评论如下:

如果一个Lambda表达式的目标类型和其捕获的参数都是可序列化的,则可以对其进行序列化。但是,与内部类一样,强烈不建议序列化Lambda表达式。

查阅相关信息后,我发现了这个SO问题

如何序列化Lambda表达式?

其中OP正在处理客户端代码中的序列化Lambda表达式。

如果我有一个Web服务,并且其中一个参数是Lambda表达式,那么它似乎可能包含恶意代码,例如文件系统访问或导致堆栈溢出 - 因此信任它是非常愚蠢的。

我是否夸大了安全风险,或者序列化表达式的内容存在限制?


1
参见[此问题](https://dev59.com/eF8e5IYBdhLWcg3wucRT)作为一个例子。正如在您引用中已经指出的那样,内部类可能会引起类似的问题。不过,我不太确定在Web服务的上下文中如何传输lambda表达式。 - Holger
1
只是为了明确,序列化lambda表达式并不序列化表达式内部的代码;只有像捕获的参数这样的东西。 - Klitos Kyriacou
2个回答

5
让我们这样说:Java对象序列化 (在某种程度上) 本身就是一个安全噩梦 (例如请参见这里)。
换句话说,序列化本身就是一个需要非常慎重考虑的话题。因此,不管是关于序列化的lambda表达式,还是任何其他类型的序列化对象,都没有什么区别。
例如,您可能希望确保您理解并支持相应的规则,例如CERT的规则。

4

Oracle安全编码指南中的一项建议是:

指南8-3 / SERIAL-3:将反序列化视为对象构造函数

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接