[하루한줄] 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는 여기서 확인할 수 있습니다.