1. 개요
HTTP/2에서는 HTTP/1.1과 달리 단일 TCP 연결에서 여러 개의 steam을 열고 닫을 수 있는 "Stream multiplexing" 기능을 사용합니다. 최근 해당 프로토콜에서 발견된 서비스 거부 공격 (Denial of Service, DoS) 취약점인 CVE-2023-44487에 대해 분석한 내용을 정리하였습니다.
2. 공격 유형
CVE-2023-44487은 HTTP/2 프로토콜을 지원하는 모든 웹 서비스를 대상으로 하며, 보통 로드 밸런서나 프록시의 역할을 하는 서버 혹은 클라우드 서비스를 주 대상으로 다량의 RST_STREAM 요청을 전송하여 해당 서버의 과도한 처리를 유발, 서비스 거부 공격이 가능한 취약점 입니다.
기본적으로 HTTP/2의 경우 스트림 취소 요청인 RST_STREAM을 요청 받은 경우, 우선적으로 HEADER 정보를 읽어 해당 스트림을 half-close 상태로 만들고, 이후 RST_STREAM을 읽어 close 상태가 됩니다.
출처 : https://blog.cloudflare.com/technical-breakdown-http2-rapid-reset-ddos-attack/
다만 클라이언트의 경우 이 RST_STREAM을 제한 없이 계속해서 전송이 가능하고, 응답 데이터가 필요 없기 때문에 스트림의 왕복 시간에도 구애 받지 않는 반면, 서버의 경우 취소된 요청에 대해 새로운 스트림 데이터 구조 할당, 쿼리 구문 분석, 헤더 압축 해제 수행, URL을 리소스에 매핑하는 등 상당한 양의 작업을 수행하게 되면서 서버와 클라이언트 간의 비대칭 현상이 발생하게 됩니다.
결국 클라이언트에 비해 서버가 처리해야 할 작업량이 많기 때문에, 이에 따른 지연 현상이 발생하면서 DoS 공격이 수행됩니다.
해당 공격의 경우 단일 TCP 요청 내에서 발생하는 DoS 공격이기에 CloudFlare와 같이 DDoS 공격을 방지하는 서비스에서도 공격 완화가 되지 않는 점에서 더 위험성이 돋보이는 취약점으로 보여집니다.
또한 해당 원리를 응용하여 스트림을 바로 취소하지 않고 한꺼번에 많은 스트림을 취소하는 방식, 서버 제한보다 더 많은 동시 스트림을 여는 등 다양한 방식으로 공격을 시도하는 방법 또한 관측되고 있습니다.
3. 대응 방안
기본적으로 해당 취약점을 사용하는 것이 감지될 경우 해당 현상이 발생하는 IP를 차단하거나 전체 TCP 연결을 차단하는 방법으로 사후 조치가 가능하고, 사전 조치로는 동시에 접속 가능한 스트림 수의 제한을 강제하도록 설정하는 방법으로 대응이 가능합니다.
또한 해당 취약점 대상이 되는 서비스 및 라이브러리에 대해서 최신 버전으로 업데이트가 필요합니다.
저희 AIWAF 및 AISWG 제품에서는 관련 라이브러리인 nghttp2 라이브러리 업데이트를 진행하고, http2 세션에서 RST_STREAM 개수를 제한하는 기능을 개발하여 제품에 적용 하였습니다.
해당 기능은 AIWAF v5.0.2_2 build 4126부터 사용 가능합니다.
4. 결론
CVE-2023-44487은 HTTP/2 프로토콜의 구조적인 문제로 발생한 취약점이며, HTTP/2를 지원하는 서비스라면 충분히 악용될 가능성이 높아 해당 취약점에 대해 인지 및 대응이 필요합니다.
저희 AIWAF 및 AISWG 제품에서는 해당 취약점 관련 서비스 및 라이브러리를 업데이트 하고, 해당 취약점을 사용하는 DoS 공격에 대한 대응 방안을 수립 및 개발을 진행하여 제품에 반영하는 것으로 대응 하였습니다.