Slowloris 공격이란?

Slowloris 공격은 매우 적은 대역폭 만으로도 웹 서버의 연결 자원을 고갈시키는 대표적인 저대역폭(LoBW) Resource Exhaustion Attack이다.
일반적인 DoS 공격이 대량의 트래픽을 보내 서버를 압도하는 방식이라면, Slowloris는 그 반대 방향으로 움직인다. 트래픽을 거의 사용하지 않고, 요청의 미완성 상태를 오래 유지시켜 서버 내부 자원(스레드, 소켓, 파일 디스크립터)를 점점 잠식한다.
결국 서버는 정상 사용자의 요청을 처리할 여유가 사라지고 결국 서비스가 매우 느려지거나 완전히 중단될 수 있다.
단 한 대의 클라이언트라도 지속적이고 미세한 패킷 조작만으로 서버를 응답 불가능 상태로 만들 수 있다는 점에서, 오랜 시간이 지난 지금까지도 실무에서 자주 언급되는 공격 기법 중 하나이다.
등장 배경
Slowloris 공격이 등장한 배경은 초기 웹 서버 구조의 근본적인 한계에서 시작되었다.
2000년대 후반까지 널리 사용되던 웹 서버, 특히 Apache 계열은 요청당 스레드 혹은 프로세스를 1개 씩 할당하였다.
서버는 클라이언트가 연결되면 모든 HTTP 헤더가 도착할 때까지 하나의 스레드(또는 프로세스)를 할당한다. 이 스레드(또는 프로세스)는 모든 HTTP 헤더가 도착할 때까지 해제 되지 않는다.
만약 요청이 매우 천천히 도착한다면 서버는 이를 네트워크 지연 같은 정상적인 상황으로 인식하고 연결을 유지하게 된다. Slowloris는 바로 이 ‘정상적인 배려’를 악용하여 의도적으로 헤더를 아주 천천히 일정 간격으로 보내어 서버는 스레드와 소켓을 지속적으로 유지하게 되고 결국 정상적인 서버 운영이 어려워지게 된다.
그 결과, Slowloris는 “트래픽 없이 서버를 죽이는 방법”으로 주목을 받았고 2009년 이란 대선 이후 발생한 시위 등에서 사용되었다.
전체 구조
등장 배경에서 설명했다 싶이 Slowloris 공격의 핵심 전략은 서버의 연결 자원을 가능한 오래 점유하여, 정상 사용자가 사용할 수 있는 여유를 점차 줄여 나가는 것에 있다.
이 과정은 대규모 트래픽을 필요 하지 않으며 오히려 매우 작은 데이터를 아주 긴 시간 동안 보내는 방식으로 이루어진다.
이를 현실 상황으로 비유하면 다음과 같다.
당신이 식당을 운영한다고 가정한다. 손님이 자리에 앉으면 직원은 주문을 받을 준비를 하고 기다린다. 손님이 메뉴를 고르는 데 시간이 조금 걸리는 것은 흔한 일이기 때문에, 직원은 자리를 오래 비우지 않고 계속 주의를 기울이며 손님이 주문을 끝내기만을 기다린다.
이 대기 상태는 손님이 “메뉴 다 정했습니다”라고 말하기 전까지 유지된다.
문제는 악의적인 손님이 나타날 때 시작된다. 이 손님은 테이블을 차지한 뒤, 주문서를 한 줄씩 천천히 읽는 척하며 계속 시간을 끌기만 한다. 직원이 다가와도 “조금만 더요”, “아직 메뉴 고르는 중이에요”라고 말하며 끝내 주문을 확정하지 않는다.
이렇게 악의적인 손님이 여러 명 들어와 식당의 자리를 모두 차지하게 되면, 실제로 식사를 하러 온 정상 손님들은 자리가 없어 들어오지 못하게된다.
전반적인 구조는 다음과 같다.
- 공격자는 target 서버로 여러 개의 TCP 연결을 생성
- HTTP 요청을 의도적으로 미완성 상태로 유지
- 서버는 각 연결마다 스레드, 소켓 등 자원을 계속 유지
- 공격자는 자원 해제를 막기 위해 주기적으로 유지 신호 전송
- 서버의 연결 한계에 도달시 정상 사용자의 요청 차단
파이썬 슬로우리스 공격 실습하기 (작성예정)