IT Info

(network) SYN Flooding 공격이란? 대응 방법은?

Jan92 2024. 11. 5. 23:59
반응형

(network) SYN Flooding 공격이란? 대응 방법은?

리눅스 관련 공부 중 DoS, DDoS 공격의 일종인 'SYN Flooding Attack'에 대한 개념을 접하게 되었는데요.

흥미 있는 내용이라 SYN Flooding 공격이란 무엇인지, 또 대응 방법은 무엇인지에 대해 정리해 보게 되었습니다.

 

/*

DoS(Denial of Service, 서비스 거부) 공격은 시스템 또는 네트워크의 구조적인 취약점을 이용하거나 대량의 트래픽을 통해 타겟 시스템이 정상적인 서비스를 하지 못하도록 마비시키는 악의적인 시도를 말합니다.

 

DDoS(Distributed Denial of Service, 분산 서비스 거부) 공격은 DoS 공격의 업그레이드된 형태로, DoS 공격이 단일 장치에서 단일 타겟(1:1)에 대해 시도되는 것이라면 DDoS 공격은 여러 대의 장치에서 하나의 타겟(N:1)에 대해 공격을 시도하는 것을 말합니다.

DDoS 공격에 사용되는 여러 대의 장치는 봇넷에 포함되는 경우가 많은데, 봇넷이란 컴퓨터 등의 장치가 맬웨어에 감염되어 개별 공격자에게 원격으로 통제되는 것을 의미합니다.

*/

 


TCP 3-Way Handshake

TCP 3-Way Handshake

'TCP 3-Way Handshake'는 TCP/IP 프로토콜을 이용하여 통신하는 애플리케이션이 데이터를 전송하기 이전에 정확한 전송을 보장하기 위해 통신하려는 타겟과 사전에 논리적인 세션을 수립하는 과정을 의미하는데요.

 

SYN Flooding 공격은 TCP 프로토콜 연결 과정의 취약점을 악용한 공격 방식으로 해당 공격을 이해하기 위해서는 TCP 프로토콜의 3-Way Handshake에 대한 이해가 필요하며, 큰 흐름은 아래와 같습니다.

 

1. Client는 Server에 접속을 요청하는 SYN 패킷을 전송합니다.

2. Client의 SYN 패킷 요청을 받은 Server는 요청을 수락한다는 ACK 패킷을 전송하며, 동시에 클라이언트에게 연결을 요청하는 SYN 패킷을 전송합니다.

3. Server의 SYN + ACK 패킷을 받은 Client는 요청을 수락한다는 ACK 패킷을 전송하며, 연결이 완료되는 시점부터는 Client와 Server가 서로 데이터를 주고받게 됩니다.

 

 


SYN Flooding 공격이란?

SYN Flooding 공격은 반개방(half-open) 공격이라고도 하며, 접속을 요청하는 'SYN 패킷'을 서버에 계속적으로 보내면서 의도적으로 서버의 'SYN + ACK 패킷'에는 응답하지 않는 것인데요.

(Network 관점에서는 Transport Layer 공격)

 

여기서 다시 위 3-Way Handshake의 2번째 단계에 주목해 보면, Server는 Client에게 'SYN + ACK' 패킷을 전송한 뒤 Client가 다시 ACK로 응답하기를 기다리는 SYN-RCVD 상태(= half-open)가 됩니다.

그리고 이 상태로 일정 시간 후에 ACK 요청이 오지 않으면 해당 연결을 초기화하게 되는데, 초기화되기 전까지 이 연결은 메모리 공간인 백로그 큐(Backlog Queue)에 계속 쌓이게 되는 것인데요.

(백로그 큐는 SYN 패킷들이 임시로 저장되는 'SYN Backlog'와 서버가 SYN + ACK 패킷을 클라이언트에게 보내고 응답이 오기를 기다리는 'Listen Backlog'로 나뉩니다.)

 

때문에 공격자가 SYN 패킷만 계속 서버로 보내고 SYN + ACK 패킷에 응답하지 않으면 결국 백로그 큐(정확하게는 SYN Backlog)가 가득 차게 되고, 정상적인 요청이 들어왔을 때 새로운 Connection을 생성하지 못하면서 DoS 상태를 유발하게 되는 것입니다.

 

 

SYN Flooding 공격이란?

이러한 SYN Flooding 공격은 단일 장치에서 이뤄질 수도 있지만 대부분 위 이미지와 같이 봇넷 등을 활용하여 분산된 에이전트가 동시에 SYN 패킷을 보내는 DDoS 형태로 많이 발생하며, 동시에 에이전트의 실제 IP가 아닌 스푸핑 IP를 통해 공격의 출처를 추적하고 공격을 완화하는 것을 더 어렵게 만듭니다.

 

 


대응 방법

1. 방화벽 또는 DDoS 장비 설정

방화벽이나 DDoS 장비를 통해 동일한 IP 주소의 SYN 요청에 대한 임계치를 설정하고 임계치를 초과하는 경우 해당 연결 요청을 차단하는 방법이 있습니다.

하지만 해당 방법의 경우 봇넷을 통해 스푸핑 된 IP로 들어오는 분산된 공격을 막기는 어렵다는 문제가 있습니다.

 

 

2. Backlog Queue의 크기를 늘려주는 방법

> sysctl -w net.ipv4.tcp_max_syn_backlog=1024

다음 명령어를 통해 Backlog Queue의 크기를 늘려주어 Queue가 가득 차는 것을 일시적으로 방지할 수 있습니다.

하지만 해당 방법은 임시적인 조치 방법일 뿐 더 많은 SYN 요청이 들어온다면 늘어난 Queue도 금방 가득 찰 수 있기 때문에 근본적인 해결 방법은 될 수 없습니다.

(위 명령어를 통해 backlog 사이즈를 변경하게 되면 재부팅 시 값이 초기화되기 때문에 재부팅 후에도 설정 값을 유지하기 위해서는 /etc/sysctl.conf 파일에 대한 수정이 필요합니다.)

 

 

3. SYN Cookie 설정

syncookies 설정은 클라이언트의 유효성을 확인하는 방법입니다.

서버에 SYN 패킷이 도착했을 때, 요청된 SYN 패킷의 일련번호에 1을 더한 ACK 번호 대신 요청의 출발지와 도착지의 IP 주소, timestamp, mss 등의 값을 가지고 단방향 암호화 해시 함수를 사용해 쿠키(ISN, Initial Sequence Number)를 만들어 SYN + ACK 패킷과 함께 클라이언트에게 보내게 됩니다.

(쿠키가 생성될 때는 SYN 패킷들을 SYN Backlog에 저장하지 않습니다.)

그리고 들어오는 클라이언트로부터 돌아오는 ACK 패킷에서 ISN 정보를 확인 및 검증하고 유효한 경우에만 연결을 맺게 됩니다.

 

> sysctl -w net.ipv4.tcp_syncookies=1

syncookies 설정은 다음 명령어를 통해 활성화할 수 있는데요.

(위 Backlog Queue 크기 설정과 마찬가지로 재부팅 후에도 설정 값을 유지하기 위해서는 /etc/sysctl.conf 파일에 대한 수정이 필요합니다.)

 

설정을 활성화하더라도 SYN Flooding에 의해 SYN Backlog가 가득 찼을 때만 해당 기능이 실제로 동작되기 때문에 일반적으로는 사용되지 않는다는 점은 알아두어야 하는 부분입니다.

 

SYN Flooding 공격으로 syncookies 설정이 활성화되는 경우 Packet header의 Option 부분을 참조할 수 없어지기 때문에 성능상 조금 느려질 수는 있지만 많은 차이는 없다고 하며, 느려진다고 하더라도 서비스가 아예 동작하지 않는 것보다는 훨씬 낫기 때문에 syncookies 설정을 활성화하는 것이 좋다고 생각됩니다.

 

 

 

 

< 참고 자료 >

https://brunch.co.kr/@alden/5#comment
https://sata.kr/entry/DOSDDOS-SYN-Flooding-%EA%B3%B5%EA%B2%A9%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90
https://www.linux.co.kr/bbs/board.php?bo_table=lecture&wr_id=2624

반응형