服务器通过网络使用Java序列化是否存在安全漏洞?
Is it a security vulnerability for the server to use Java serialization over the network?
我正在创建一个带有服务器的多人游戏,并使用序列化对象在服务器和客户端程序之间来回发送消息。这是我的通信代码的 MCVE:
loop: while(true)
try {
Thread.yield();
Object raw = in.readObject();
NTask task = (NTask) raw;
processRequest(task);
} catch (IOException e){
break loop;
} catch (ClassCastException e) {
throw new SecurityWarning("Client is sending erroneous messages. Possible security breach.", raw);
} catch (Throwable e) {
e.printStackTrace();
}
其中 NTask
是一组不同消息类型的超类,processTask
根据类型决定如何处理每个对象。
我的问题是这是否会给我的服务器带来安全漏洞。有人可以编写自己的代码来向我的服务器发送会造成危害的对象,并让它在第 5 行抛出 ClassCastException 之前执行其恶意代码吗?
如果用户向服务器发送一个 class 的对象,而服务器的 class 路径中没有该对象,服务器将无法加载此 class,因此将无法实例化接收到的对象。
用户可以做的是发送一个服务器知道的 class 的对象,但它不遵守 class 的不变量(例如,向您发送一个任务使用空名称,尽管普通用户永远不会发生这种情况。
序列化对象基本上包括发送对象的 class 名称及其状态(即其所有字段的值)。 class 的字节码(即行为)未发送。它是从本地 class 路径加载的。
我正在创建一个带有服务器的多人游戏,并使用序列化对象在服务器和客户端程序之间来回发送消息。这是我的通信代码的 MCVE:
loop: while(true)
try {
Thread.yield();
Object raw = in.readObject();
NTask task = (NTask) raw;
processRequest(task);
} catch (IOException e){
break loop;
} catch (ClassCastException e) {
throw new SecurityWarning("Client is sending erroneous messages. Possible security breach.", raw);
} catch (Throwable e) {
e.printStackTrace();
}
其中 NTask
是一组不同消息类型的超类,processTask
根据类型决定如何处理每个对象。
我的问题是这是否会给我的服务器带来安全漏洞。有人可以编写自己的代码来向我的服务器发送会造成危害的对象,并让它在第 5 行抛出 ClassCastException 之前执行其恶意代码吗?
如果用户向服务器发送一个 class 的对象,而服务器的 class 路径中没有该对象,服务器将无法加载此 class,因此将无法实例化接收到的对象。
用户可以做的是发送一个服务器知道的 class 的对象,但它不遵守 class 的不变量(例如,向您发送一个任务使用空名称,尽管普通用户永远不会发生这种情况。
序列化对象基本上包括发送对象的 class 名称及其状态(即其所有字段的值)。 class 的字节码(即行为)未发送。它是从本地 class 路径加载的。