2

最近关于 Java 反序列化攻击的Foxglove Security 文章带有指向主要应用程序服务器以及 Spring 和 Groovy 应用程序的示例代码的链接,引起了很多恐慌。文章指出,这些漏洞利用绕过身份验证,因为对象有效负载在身份验证检查完成之前被反序列化。但是,它没有具体命名或讨论 Spring HttpInvoker,而且我无法在其他地方找到关于此的明确声明。

对于通过 Spring HttpInvoker 公开的远程服务,使用带有基本身份验证的 Spring Security,是否会在反序列化(可能是恶意的)对象负载之前执行身份验证检查?或者文章中关于“身份验证不会保护您免受这种攻击”的断言是否也适用于 HttpInvoker 服务?

4

2 回答 2

3

决定自己测试一下。为了测试处理入站 HTTP Invoker 服务调用的事件序列,我设置了一个简单的小型 Spring Boot 启动应用程序,如下所示:

  • 一项 HelloWorld 服务公开了一个简单的 hello() 方法,该方法将自定义 HelloDto 对象作为输入参数。
  • HelloDto 中的自定义序列化逻辑,用于记录序列化和反序列化。
  • Spring Security Basic 身份验证用于保护服务。

我将 Spring Security 和 Spring Remoting 的日志记录提升到 Debug 级别,然后通过一个简单的 JUnit 测试客户端远程调用 HelloWorldService。我通过控制台日志确认 Spring Security在反序列化发生之前对调用者进行身份验证和授权。

当我仔细考虑事件的顺序时,这是有道理的。Spring Security 实现为过滤器链,而 HTTP Invoker 逻辑由 DispatcherServlet 处理,在过滤器预先执行后逻辑上将获得控制权。

如果任何 Spring 专家都可以确认这是一个准确的解释(或者特别是如果有任何模糊的“边缘情况”,在调用者被验证之前反序列化仍然会咬我们),那将不胜感激。

于 2015-11-12T15:32:20.737 回答
0

我会在谷歌上搜索 ysoserial 有效载荷生成器。使用每个选项创建有效负载,然后使用正确的内容类型集将其卷曲到您的端点。我们在我的工作中做到了这一点,并且很惊讶我们可以在我们的开发服务器上远程执行代码。

于 2015-11-24T23:11:40.603 回答