[하루한줄] CVE-2020-13935: Apache Tomcat Websocket 취약점
URL
DIVING INTO A WEBSOCKET VULNERABILITY IN APACHE TOMCAT
Target
- 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
Explain
해당 취약점은 Apache Tomcat의 WebSocket 프레임에서 payloadLength
에 의해 무한 루프가 트리거 되어 DoS 공격으로 연결될 수 있는 취약점입니다.
RFC6455의 WebSocket 프레임에서 payload length 필드가 127(2진수 1111111)이면 64비트 확장 payload length를 사용합니다. 이 payload length는 64비트 unsigned integer이지만 RFC에서는 최상위 비트가 항상 0이 되도록 요구합니다.
따라서 payload length 필드를 127로 설정해준 후 다음 8바이트의 MSB를 1로 설정해주기만 하면 DoS 공격을 수행할 수 있습니다.
취약점과 관련된 패치는 payloadLength
가 음수가 될 경우 exception을 발생시키도록 패치되었습니다.
// 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")
)
);
}
해당 취약점에 관한 PoC Code는 여기서 확인할 수 있습니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.