2009. 9. 9. 18:47

SYN Flooding Attack 방어 (윈도우 환경)

일반적으로 인터넷에 연결된 환경에서는 많은 IP 프로토콜들의 종류가 있지만 적어도 TCP(Transmission Control Protocol:6), UDP(User Datagram Protocol:17), ICMP(Internet Control Message Protocol:1)에 대해서는 익히 들어보았을 것입니다. 이중에서 TCP는 가장 많이 사용되는 프로토콜로 시스템간의 상호 대화하기 위해 사용됩니다.

TCP 프로토콜을 사용하여 두 시스템간의 연결 및 전송이 어떻게 구축되는지 알아보겠습니다. 다음은 TCP 프로토콜에 사용되는 플래그입니다. 이들 플래그를 통해 현재 연결이 시작되는지 종료되는지 에러가 발생하여 재전송 하는지 등의 상태를 나타냅니다.

  • SYN (Synchronization) : 초기 TCP 연결 요청
  • ACK (Acknowledgement): ACK 번호 필드에 값이 타당한지를 알려줌
  • FIN (Finish): TCP연결을 정상적으로 종료
  • RST (Reset): TCP연결을 즉시 종료
  • PSH (Push): 수신측에 가능한 빨리 데이터를 전달
  • URG (Urgent): Interrupt를 처리

따라서, 클라이언트에서 서버로 TCP 연결을 시도하면 다음과 같은 과정을 거쳐 연결이 구축됩니다.

  1. 정상적인 연결 구축 

    • Clinet -> Server : SYN 메시지 전송
    • Server -> Client : SYN-ACK 메시지 전송 ( 여기까지 과정을 수행하게 되면 서버는 스택(Stack)에 진행중인 연결에 대한 정보를 저장한다.)
    • Client -> Server : ACK 메시지 전송

  2. 주로 예상되는 공격 패턴

    • Client -> Server : SYN 메시지 전송
    • Server -> Client : SYN-ACK 메시지 전송
    • Client -> Server : 비정상적인 SYN 메시지 전송

    이러한 방식으로 서버는 스택에 계속 정보를 쌓아두기 때문에 나중에 시스템이 정지하는 일이 발생합니다.

    다음은 정상적인 연결에 사용되는 플래그의 조합과 공격으로 의심이 갈만한 플래그의 조합입니다.

  3. 정상적인 연결

    • SYN, SYN-ACK, ACK은 정상적인 TCP연결을 구축할 때 사용(3 Handshake 방식)
    • 초기 SYN패킷을 제외하면, 연결을 맺은 모든 패킷들은 ACK 비트가 설정되어야만 함
    • FIN ACK, ACK는 연결을 정상적으로 종료할 때 사용
    • RST ACK는 연결을 즉시 종료할 때 사용
    • 연결후에 송수신되는 패킷들은 디폴트로 ACK비트를 포함하고 있다.
    • 연결후 송수신되는 패킷에는 PSH 그리고/또는 URG가 포함될 수 있음

  4. 비정상적인 플래그 조합으로 공격이 의심되는 연결

    • SYN과 FIN을 동시에 수행하는 정상적인 패킷은 없다
    • SYN FIN PSH, SYN FIN RST, SYN FIN RST PSH와 같은 SYN FIN들의 다양한 변형들이 존재
    • 정상적인 패킷은 FIN플래그만을 포함하지 않음(주로 Port Scan, Network Mapping, Stealt에 사용됨)
    • NULL 패킷( 플래그가 설정되지 않은 패킷)
    • 정상적인 패킷들은 출발지 및 목적지의 포트가 0으로 설정되어 사용되지 않음
    • ACK 플래그가 설정되어 있을 때 ACK 번호는 0으로 설정되면 비정상적인 패킷임
    • SYN만 설정된 패킷은 어떤 Data를 포함하고 있지 않으며, 새로운 연결이 시도될 때만 설정된다.
    • TCP 연결은 목적지 주소로서 Broadcast주소(xxx.xxx.xxx.255)를 사용하지 않음

이제부터 어떻게 SYN Attack 을 막을지를 생각해봅시다.
가장 좋은 방법은 스택을 늘리는 것인데, 실제로 가능할지는 몰라도 우리가 구현하는 방법과는 거리가 멉니다. 그래서, MS사가 추천하는 방법을 소개하려고 합니다.

이 방법은 가장 기본적인 방법으로 레지스트리를 편집하는 방법입니다. 다른 방법으로는 보안 툴 또는 IDS(Intrusion Detect System:침입탐지시스템)을 이용할 수 있지만 좀 힘들겠죠 ?

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters

  • SynAttackProtect
    - 형식 : REG_DWORD
    - 범위 : 0 – SynAttack 프로텍션을 사용하지 않음.
    1 – 재전송 시도를 줄이고, TcpMaxHalfOpen 및 TcpMaxHalfOpenRetried 설정이 만족한다면 RCE(route cache entry)를 지연시킴
    2 – 1 기능외에도 Winsock 에 대한 지시(indication)를 지연시킴
    - 기본 : 0
    - 추천 : 2
    - 설명 : SynAttack을 막는 방법은 SYN-ACKs 의 재전송을 줄이는 것입니다. 연결이 구축될때까지 RCE(route cache entry) 자원의 할당을 지연시킵니다. 만약 값 2를 적용한다면 3 handshake가 완료될 때까지 AFD의 연결 indication이 지연됩니다. 또한 TcpMaxHalfOpen 과 TcpMaxHalfOpenRetried 설정과 함께 사용되어야 합니다.

  • TcpMaxHalfOpen
    - 형식 : REG_DWORD
    - 범위 : 100–0xFFFF
    - 기본: 100 (Professional, Server), 500 (advanced server)
    - 추천 : 기본값
    - 설명 : 이 패러미터는 SYN-ATTACK 공격이 동작하기 전에 SYN-RCVD 상태에서 연결되는 개수를 제한합니다. 만약 SynAttackProtect 가 1로 설정되면 이 값은 AFD가 청취하는 보호하려는 포트의 Backlog보다 작은 값이어야 합니다.( Backlog에 대한 자세한 정보는 Backlog Parameters를 참고하세요.)

  • TcpMaxHalfOpenRetried
    - 형식 : REG_DWORD
    - 범위 : 80–0xFFFF
    - 기본 : 80 (Professional, Server), 400 (Advanced Server)
    - 추천 : 기본값
    - 설명 : 이 값은 SYN-RCVD 상태에서 연결되는 개수를 제어합니다. SYN-RCVD는 SYN-ATTACK 방어가 동작하기 전에 적어도 한번의 SYN 플래그를 재전송합니다. 이 값을 적용하기 전에 먼저 충분한 테스트를 거쳐 적절한 값을 얻어야 합니다.

  • EnablePMTUDiscovery
    - 형식 : REG_DWORD
    - 범위 : 0, 1 (False, True)
    - 기본 : 1 (True)
    - 추천 : 0
    - 설명 : 이 값이 1로 설정되면 원격 호스트에 이르는 경로에 MTU 또는 최대 패킷사이즈를 찾으려고 시도합니다. 경로 MTU를 찾고 및 TCP 세그먼트를 이 크기로 제한함으로써 TCP는 다양한 MTU로 연결된 네트워크에 있는 라우터의 분산(fragmentation)을 막을 수 있습니다. Fragmentation은 TCP 처리량과 네트워크 부하에 영향을 미칩니다. 이 값을 0으로 설정하면 로컬 서브넷에 있지 않은 호스트에 연결되는데 MTU를 576바이트로 설정하게 됩니다.

  • NoNameReleaseOnDemand
    - 형식 : REG_DWORD
    - 범위 : 0, 1 (False, True)
    - 기본 : 0 (False)
    - 추천 : 1
    - 설명 : 이 값은 네트워크에서 이름-해제 요청을 받았을 때 컴퓨터가 NetBIOS 이름을 해제할 지 여부를 결정하게 됩니다. 이 값을 설정함으로서 이름-해제(name-release) 공격에 대비할 수 있습니다.

  • EnableDeadGWDetect
    - 형식 : REG_DWORD
    - 범위 : 0, 1 (False, True)
    - 범위 : 0,1 (False, True)
    - 기본 : 1 (True)
    - 추천 : 0
    - 설명 : 이 값을 1로 설정하면 TCP는 dead-gateway 탐지를 수행하게 됩니다. 이 기능을 활성화하면 많은 수의 연결이 어려울 때 TCP는 IP에 백업 게이트웨이로 바꿀 것인지 물을 수도 있습니다. 백업게이트웨이는 TCP 등록정보의 고급 설정부분에서 지정할 수 있습니다.

  • KeepAliveTime
    - 형식 :REG_DWORD - 밀리세컨드
    - 범위 : 1–0xFFFFFFFF
    - 기본 : 7,200,000 (2시간)
    - 추천 : 300,000
    - 설명 : 노는 연결(idle connection)이 keep-alive 패킷을 전송함으로써 계속 유지되는지 확인하려고 할 때 종종 사용됩니다. 만약 원격 시스템에 여전히 도달할 수 있고 동작한다면 keep-alive 전송을 승인합니다. Keep-alive 패킷은 기본적으로 전송되지 않습니다. 이 기능은 애플리케이션에 의해 사용되는 연결에서도 활성화될 수 있습니다.

  • PerformRouterDiscovery
    - 형식 : REG_DWORD
    - 범위 : 0,1,2
    0 (disabled)
    1 (enabled)
    2 ( 만약 DCHP가 router discover option을 전송는 경우에만 활성화됨)
    - 기본 :
    - 추천 : 0
    - 설명 : Windows 2000에서 인터페이스 카드 기반으로 RFC 1256에 해당하는 router discovery 를 수행하게 할지를 제어합니다.

  • EnableICMPRedirects
    - 형식 : REG_DWORD
    - 범위 : 0, 1 (False, True)
    - 기본 : 1 (True)
    - 추천 : 0 (False)
    - 설명 : ICMP는 인터넷프로토콜에서 문제가 생기면 보고해주는 프로토콜로서 예를 들어 네트워크 접속문제인 "Echo Reply", "Destination Unreachable" 혹은 네트워크 라우팅 문제 인 "Redirect" 등을 알려준다. ICMP Redirect메시지는 호스트가 목적지 주소로 연결하고자할 때, 해당 라우터가 최적의 경로임을 호스트에게 알려주기 위하여 라우터로부터 호스트로 보내어진다.


    이상 SYN Attack 의 원리 및 방어에 대해 간략히 알아보았습니다. 실제로 이에 대한 자세한 정보를 알아보려면 아래 참고문서를 보시거나, 그 전에 TCP 의 원리에 관한 책 한권정도는 충분히 숙독하셔야 할 것입니다.
    잘못된 부분이나 번역상 또는 편집상의 오류를 발견하신다면 알려주시기 바랍니다.

    참고 문서 : http://www.certcc.or.kr
    http://www.microsoft.com/TechNet/security/dosrv.asp
    http://www.cert.org/advisories/CA-2000-01.html

    작성자 : 문일준( security@mcse.co.kr)

Trackback 0 Comment 1
  1. Favicon of https://blog.pages.kr 날으는물고기 2009.09.09 18:53 신고 address edit & del reply

    Parameters
    HKLM\SYSTEM\CurrentControlSet\Services\Tcpip
    http://technet.microsoft.com/en-us/library/cc962453.aspx