HTTP/2 CVE-2019-[9511~9518]

HTTP/2 Denial of Service 공격

8개의 취약점 모두 DoS(Denial of Service) 공격으로, 소수의 낮은 대역폭의 악성 세션을 가지고 일부 요소에게 장애를 일으키는 공격이다.

공격 과정

공격은 다음과 같은 과정을 통해서 이뤄진다.

  1. 악성 클라이언트가 서버에게 요청하여 응답을 만듬
  2. 여기서 클라이언트가 응답을 읽지 않는다면, 서버의 대기열 관리 코드가 발동
  3. 대기열을 제대로 처리되지 않는다면, 서버가 메모리와 CPU의 자원을 많이 소모
  4. 위의 과정이 반복되며 DoS 상태를 유발

원인

HTTP/1.1과 HTTP/2의 차이 중 헤더 압축과 여러 스트림에서의 데이터 다중 전송 같은 새로운 기능이 있다. 기능들을 구현하기 위해서 아래와 같은 복잡성이 추가 되었다.

  • DATA는 Binary Frame에서 전송
  • 전송할 수 있는 데이터의 양을 정의하는 Connection과 Stream 별 윈도우 존재
  • HTTP/2 연결 계층에서 Ping, Reset, Settting Frame과 같은 ICMP와 유사한 제어 메세지 존재
  • 스트림 우선순위 제어

RFC 7540 Section 10.5의 보안 고려 사항을 일반적으로 다루지만, 비정상적인 접근에 대해서는 명확한 가이드라인이 존재하지 않았다.
이로 인해 여러 구현체에서는 다양하게 HTTP/2 기능을 구현하려고 하였다. 이러한 부분에서 취약점이 생겨날 수 있었다.

HTTP/2 Diagram

공격은 대부분 HTTP/2 전송 계층에서 작동하게 되는데, 위의 도식화한 레이어를 보면 TLS 레이어와 요청 컨셉 사이에 존재한다. 따라서 0개 혹은 1개의 요청으로도 이러한 공격을 실행할 수 있다.

초기의 HTTP는 Request 중심으로 작성되고 발전해왔지만, HTTP/2의 경우에는 로그나 Rate limit, 클라이언트의 HTTP/2 연결 계층에서 행동 기반으로 진행하기 때문에 이 부분을 탐지하는 도구와 기술이 많지 않다. 따라서 빠르게 찾아내고 차단하는데 많은 어려움을 겪을 수 있다.

CVE-2019-9511 - HTTP/2 Data Dribble

공격자가 서버에 대량의 데이터를 요청하고, 응답 데이터를 최대한 천천히 소비하여 서버의 리소스를 고갈시키는 방식으로 작동한다.
이는 서버가 데이터를 1바이트 단위로 전송하게 만들어 CPU와 메모리를 과도하게 사용하게 하며, 결과적으로 DoS 상태를 유발할 수 있다.

CVE-2019-9512 - HTTP/2 Ping Flood

서버에 대량의 PING 프레임을 전송하여 서버의 자원을 고갈시키는 공격이다. PING 프레임은 연결의 살아있음(liveness)을 확인하기 위해 사용되며, 공격자는 이를 악용하여 서버의 처리 능력을 초과하는 요청을 보내 리소스를 소모시킨다.

CVE-2019-9513 - HTTP/2 Resource Loop

공격자가 여러 요청 스트림을 만들고 이들 스트림의 우선 순위를 지속적으로 변경함으로써 우선 순위 트리에 큰 부하를 가하고, 서버의 자원을 고갈시키는 공격으로, 이로 인해 서버의 CPU 사용량이 급증하게 된다.

CVE-2019-9514 - HTTP/2 Reset Flood

RST_STREAM 프레임의 대량 전송을 통해 서버의 자원을 고갈시키려는 공격이다. 공격자는 연속적으로 RST_STREAM 프레임을 보내 서버의 메모리와 CPU를 과도하게 소모시키게 만든다.

CVE-2019-9515 - HTTP/2 Settings Flood

SETTINGS 프레임의 대량 전송을 통해 공격이 진행되며, 이는 서버가 각 SETTINGS 프레임에 응답하기 위해 리소스를 소모하게 만든다. 공격자는 SETTINGS ACK 프레임을 보내지 않고, 서버의 리소스를 고갈시키기 위해 계속해서 SETTINGS 프레임을 전송한다.

CVE-2019-9516 - HTTP/2 0-Length Headers Leak

공격자는 길이가 0인 헤더 이름과 값으로 구성된 헤더를 전송하여, 일부 서버 구현에서 메모리 누수를 유발한다. 이 메모리는 세션이 종료될 때까지 해제되지 않아, 공격자가 지속적으로 이러한 요청을 보내면 서버의 메모리가 고갈될 수 있다.

CVE-2019-9517 - HTTP/2 Internal Data Buffering

공격자가 TCP 창을 닫은 상태에서 HTTP/2 창을 열어 서버로부터 데이터를 전송받지만 실제로는 데이터를 소비하지 않는 상황을 만들어, 서버의 내부 큐에 데이터가 쌓이게 만든다. 이로 인해 서버의 메모리 및 CPU가 과도하게 사용되게 된다.

CVE-2019-9518 - HTTP/2 Request Data/Header Flood

서버에 대량의 데이터 또는 헤더 요청을 전송하여, 서버가 해당 요청들을 처리하려고 할 때 과도한 리소스를 소모하게 만드는 공격이다. 이는 서버의 리소스를 급속도로 고갈시키고, 결국에는 DoS 상태를 유발한다.

ref

이 시리즈의 게시물

댓글