漏洞信息

漏洞名称:
WebSocket Dos Vulnerability in Apache Tomcat (CVE-2020-13935)

漏洞描述:
WebSocket frame中的"负载长度"(payload length)没有被正确地验证.
"无效的负载长度"(Invalid payload lengths)能触发一个"无限循环"(infinite loop). 具有"无效的负载长度"的多个requests能够导致拒绝服务.

触发前提:
tomcat版本在受影响范围内, 且用到了websocket.

Affected Versions:
10.0.0-M1 to 10.0.0-M6
9.0.0.M1 to 9.0.36
8.5.0 to 8.5.56
8.0.1 to 8.0.53
7.0.27 to 7.0.104

diff:
This was fixed with commit 40fa74c7.

Timeline:
2020年6月28日, 这个issue通过Apache Bugzilla实例被公开报告, 其中提到了"高CPU", 但未明确提及DoS.
当天, Apache Tomcat Security Team确定了相关的DoS风险.
该issue于2020年7月14日公开.

漏洞分析

  • 官方信息不够详细, 我们会产生一些疑问:
    • 如何构造无效的"载荷长度"?
    • 发生的是哪种类型的拒绝服务? CPU耗尽? 内存耗尽? 还是一个crash?
    • 在什么情况下应用程序可被攻击? Apache Tomcat什么时候解析WebSocket Messages?
    • 漏洞利用需要大量的带宽或计算能力吗?
    • 无法升级时, 是否有其他的解决方案?

我们通过一些分析来回答这些问题, 这些通常也是渗透测试的一部分.

根据补丁 https://github.com/apache/tomcat/commit/40fa74c74822711ab878079d0a69f7357926723d

看diff 这个漏洞是怎么被修复的.

代码文件: java/org/apache/tomcat/websocket/WsFrameBase.java

代码变更: 增加了校验payloadLength的代码:当 payloadLength < 0 则抛出异常.

line 264-270

// The most significant bit of those 8 bytes is required to be zero
            // (see RFC 6455, section 5.2). If the most significant bit is set,
            // the resulting payload length will be negative so test for that.
            if (payloadLength < 0) {
                throw new WsIOException(
                        new CloseReason(CloseCodes.PROTOCOL_ERROR, sm.getString("wsFrame.payloadMsbInvalid")));
            }

可以看到, 这次代码变更增加了: 对类型为long的"负载长度"(payloadLength)字段的额外检查, 如果值为负值, 则抛出异常.

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖