Play WS 使用 OAuth 1.0 拒绝服务
日期
2017 年 1 月 20 日
描述
在 Play 的 WS HTTP 客户端中发现了一个拒绝服务 (DoS) 漏洞。这影响了从 2.0.0 到 2.5.10 的所有 Play 版本。
Play WS 通过 Signpost OAuth 集成了 OAuth 1.0,允许 HTTP 请求包含签名的 OAuth 标头与远程服务通信。Signpost OAuth 在后台使用 commons-httpclient4 作为 OAuth 提供程序。
如果 WS 请求使用 OAuth 并且通过 HTTPS 连接,并且服务器没有响应 TLS 握手,那么 HTTP 请求连接将挂起,因为它忽略了 http.socket.timeout。
影响
Signpost OAuth 本身不是多线程的,因此调用本身是阻塞操作。在正确的参数下,这会导致对远程服务的拒绝服务攻击,因为所有 WS 请求处理线程都被耗尽。
此漏洞已登记为 CVE-2015-5262。
受影响的版本
Play 2.0.0 - 2.5.10
解决方法
此漏洞的解决方法是将 HTTPClient 库升级到 4.5.2 版本,该版本没有这些问题。
libraryDependencies += "org.apache.httpcomponents" % "httpclient" % "4.5.2"
修复
升级到 Play 2.5.12 或 2.4.10,或者如果您使用的是以前版本的 Play,则升级库。
致谢
感谢 Denny Ma 报告此问题。