DoS(Denial of Service) , DDoS(Distributed Denial of Service)는 모두 서비스 거부 공격의 형태이다. 특정 인터넷 사이트가 소화할 수 없는 규모의 트래픽을 만들어 서비스를 마비시키는 공격이다.
DoS 공격은 단일 소스에서 실행된다. 즉, 공격을 수행하는 장치나 시스템이 단일 위치나 단일 네트워크에서 직접 공격을 실행한다.
DDoS 공격은 여러 대의 컴퓨터나 장치로부터 동시에 공격이 실행된다. 이들은 분산된 위치에서 공격을 실행하므로 훨씬 더 강력하고 효과적인 공격이 될 수 있다.
그럼 몇가지 주요한 Flooding 공격과 그에 대한 대응책을 알아보자
TCP (전송 제어 프로토콜)의 3-way 핸드쉐이크 과정에서 발생하는 취약점을 이용하는 공격 방법
최초에 서버는 listen() 시스템 콜을 이용해서 소켓을 만들면 커널에서는 SYN backlog, Listen backlog라는 큐를 생성
클라이언트로부터 연결 요청이 들어오면 해당 소켓 정보를 SYN backlog에 저장 후 곧바로 SYN+ACK 패킷을 클라이언트로 전달하고, 소켓은 SYN_RECV 상태
클라이언트가 ACK 패킷을 보내면 해당 소켓에 대한 정보는 Listen backlog로 옮겨지고, 서버에서 accept() 시스템 콜이 호출되며 소켓은 최종적으로 Established 상태가 되며, Backlog 큐에서 빠져 나와 다음 TCP 통신을 위한 준비를 함
SYN Backlog에는 처음 SYN을 받았을 때의 소켓 정보가 쌓이게 되고 설정된 크기 이상으로 들어오게 되면 더 이상 SYN 소켓 정보를 저장할 수 없어 결국 SYN Drop이 발생
SYN Backlog가 가득차면 서버는 더 이상 SYN 패킷을 SYN Backlog에 저장하지 않고, SYN 패킷에 들어 있는 정보(client IP, timestamp, mss 값 등)를 이용해 syncookies를 만들어서 SYN+ACK의 ISN(Initial Sequence Number)에 설정해 클라이언트로 전달
클라이언트가 ACK 패킷을 보내면 서버는 Acknowledge Number를 추출해 자신이 만들었던 숫자가 맞는지 검사하고, 정상적인 패킷이라고 판단되면 Listen Backlog로 넘겨서 커넥션을 맺을 준비를 함
UDP Flooding 공격은 SYN Flooding 공격과는 달리 네트워크 bandwidth 를 소모시키는 것이 목적이다. 따라서, 단일 공격 호스트로는 효과를 볼 수 없기 때문에 DDoS 로 구성해서 공격이 이루어진다.
방화벽을 이용한 패킷 필터링
Threshold 를 이용한 방어
공격자가 정상적인 3-Way Handshake 후 로그인 및 상품 조회 처럼 동일한 동적 컨텐츠(URL)에 대한 HTTP GET 요청(ex. GET /index.jsp HTTP/1.1) 전송을 대량으로 반복 수행함으로써 해당 요청을 처리하기 위해 공격대상 웹서버 및 데이터베이스 서버의 CPU 및 연결자원(커넥션 세션)이
소진 및 고갈 될만큼 과도하게 사용하도록하여 정상적인 사용자가 접속 요청 시 정상적인 요청 처리를 못하게 하는(커넥션 할당 불가능)서비스 거부 공격이다.