一、初步确认
1. 了解受影响版本
Apache Tomcat
10.0.0-M1版本至10.0.0-M6版本
9.0.0.M1版本至9.0.36版本
8.5.0版本至8.5.56版本
7.0.27版本至7.0.104版本。
2. 确认版本后确认WebSocket 功能启用
访问:
http://ip:8080/examples/websocket/echo.xhtml
如果显示如下页面:
极大概率存在该漏洞
二、漏洞产生原因分析
1. 概括
CVE-2020-13935 是 Apache Tomcat 中的一个 WebSocket 实现漏洞,具体表现为当 WebSocket 消息的长度字段(Payload Length)的所有位都被设置为 1 时,Tomcat 会错误地处理该消息,导致 CPU 使用率飙升,甚至可能引发拒绝服务(DoS)
2. 具体原因
首先了解WebSocket 消息的长度字段 payload length(负载长度) 的规则
根据图可知道负载长度分成了一下情况:
1、 PL<126时 负载长度用7位表示
2、PL=>126时 负载长度用扩展负载长度来表示
然后当PL==127(即 0b1111111
)时则会使用扩展负载长度的8位表示,然而,Tomcat 在处理扩展长度字段时,没有对长度值进行严格的验证,导致当长度字段的所有位都被设置为 1(即 0xFFFFFFFFFFFFFFFF
)时,Tomcat 会尝试分配一个巨大的缓冲区来存储消息体,且消息长度字段所表示的值远超实际消息的长度,就会导致内部逻辑进入异常状态。
因此复现该漏洞的主要手WebSocket 消息的长度字段 payload length 的所有位都设置为1
即(0xFFFFFFFFFFFFFFFF)