SYN Cookie
Syn cookie란 ?
TCP 3-way-handShake
TCP로 세션이 생성 되려면 아래와 같은 기본적인 3-way-handshake를 거친다.
3-way-handshake 과정
SYN Flooding 공격
SYN Flooding 공격은 3-way-handshake의 취약점을 이용한 공격으로 공격대상 시스템의 TCP연결 자원(backlog queue)을 소진시켜 외부로부터 TCP 연결 요청을 받을 수 없는 상태로 만드는 서비스 거부 공격기법 이다. 경우는 아래와 같다.
SYN Flooding 공격과정
공격자가 SYN 패킷을 보내면 서버는 SYN/ACK 패킷을 보내고 SYN패킷에 대한 세션을 생성하고 응답을 기다린다. 따라서 공격자가 수많은 SYN패킷으를 보내면 수만은 세션을 생성하고 기다리게되고, 정상적인 사용자가 서버와 세션을 맺으려고 하면 이미 세션 리소스가 모두 사용되어 서비스를 이용하지 못하게 되는 것이다. (L4역시 서버와 똑같이 세션 테이블 리소스를 모두 사용하고 장애상태에 빠짐)
SYN Cookie
SYN Cookie는 클라이언트의 SYN패킷에 대한 SYN/ACK패킷을 전송할 때 ISN(Initial Sequence Number)에 Cookie 값을 넣어 전송하는 방법이다. 상대방 응답시 ACK값을 Cookie값과 비교하여 연결 유효성을 확인 후 TCP연결을 맺는다.
따라서 SYN Cookie방식이 설정된 장비에 SYN Flooding 공격을 할 경우 다음과 같다.
SYN Flooding공격 방지
공격자가 SYN패킷을 계속 보내어 서버의 세션 리소스를 소진시키려 하지만, 중간에서 L4(방화벽 또는 Anti-DDOS 장비)에서 SYN Cookie방식이 설정 되어 있기 때문에, L4와 서버 사이에 세션을 생성하지 않고 중간 차단시킨다.
또, SYN Cookie 방식이 설정되면, Cookie 값 않에 사용자가 응답 패킷으로 사용해야 하는 sequence 정보를 모두 포함하고 있기 때문에 L4에서도 세션 테이블을 생성하지 않고 L4는 Cookie로 응답하고 해당 요청에 대해 대기하지 않고 잊어버린다.
이러한 일련의 동작들은 대부분 kernel이나 Hardware ASIC단에서 이루어지기 때문에 매우 많은 양의 공격도 효율적으로 방어가 가능하다.
정상적인 세션 연결과정
1. Client의 SYN패킷 수신
2. Server는 응답으로 SYN/ACK패킷의 Sequence Number필드에 Cookie값을 넣어 Client에 송신
3. Client는 SYN/ACK에 대한 응답으로 Acknowledgement Number필드에 Cookie+1값을 Server에 송신
4. Server는 수신한 ACK 패킷의 Acknowledgement Number값의 -1한 값이 Cookie 값과 일치하면 TCP Connection을 설정
(=Server는 정상적인 Client로 부터 timestamp내에 응답이 오면 해당 Client에 대한 원래의 Cookie값을 알아낼수 있으므로 그 값을 비교할 수 있다.)
이처럼 정상적인 연결에 경우 SYN Cookie값에 대한 연결 유효성이 확인 되었기에 L4(방화벽 또는 Anti-DDOS장비)에서 서버로 세션을 맺어 중간다리 역할을 해준다.
SYN Cookie 상세정보
TCP Packet header정보에는 아래와 같은 정보가 포함된다.
1. Port정보, Sequence Number정보, Header길이
2. Flag정보
3. Checksum 정보
4. Option(40Byte) 정보
SYN Cookie는 이중 4번 Option 최대 40Byte중에 3bit를 제외한 나머지 공간을 활용하여 sequence값을 인코딩한 정보를 이부분에 포함하여 Client로 보낸다. Client는 이 이코딩된 정보를 받아서 자신이 다시 응답해야할 패킷을 생성한다.
정리하면
최초 사용자가 Syn flag를 가진 패킷으로 세션을 만들기 위한 시도를 하면, L4가 Cookie 정보에 사용자가 다시 응답시에 필요한 정보를 미리 포함하여 사용자에게 던지고는 L4는 해당 내용에 대해 잊어 버린다.
정상적인 사용자라면 해당 정보를 잘 분석해서 재응답 패킷을 만들어 보낼 것이고, 이 패킷의 cookie 값을 분석하여 정상적인 세션 연결 응답이라고 L4가 판단을 하면 그때 정상적인 세션 프로세스를 거친다는 방식이다.