작성일 :

프로토콜의 취약점

Part 1에서 암호화의 원리를, Part 2에서 TLS와 인증서를 살펴보았습니다. 이번 글에서는 네트워크 계층별 공격과 방어를 다룹니다.


네트워크 통신의 원리 시리즈에서 살펴본 프로토콜들은 대부분 1970~80년대에 설계되었습니다. 당시 인터넷은 소수의 신뢰할 수 있는 연구 기관들만 사용했기 때문에 보안은 설계 목표가 아니었습니다.

그 결과 많은 프로토콜에 근본적인 취약점이 있습니다:

  • ARP: 응답에 대한 인증 없음
  • DNS: 응답에 대한 인증 없음 (DNSSEC으로 보완 가능)
  • BGP: 경로 광고에 대한 인증 없음 (RPKI로 보완 가능)
  • IP: 출발지 주소 검증 없음

공격의 분류

네트워크 공격은 크게 세 가지로 나뉩니다.


도청(Eavesdropping): 통신 내용을 몰래 엿봅니다. 비밀번호, 개인정보 등이 유출될 수 있습니다.

위조(Spoofing): 자신을 다른 존재로 속입니다. 신뢰할 수 있는 서버나 사용자인 척하여 피해자를 속입니다.

서비스 거부(Denial of Service): 정상적인 서비스를 방해합니다. 서버에 과부하를 주어 정상 사용자가 접속하지 못하게 합니다.


도청: 패킷 스니핑

네트워크 트래픽은 경로상의 장비에서 볼 수 있습니다. 이를 패킷 스니핑(Packet Sniffing)이라 합니다.


허브 환경: 허브는 받은 패킷을 모든 포트로 복사합니다. 같은 허브에 연결된 누구나 모든 트래픽을 볼 수 있습니다.

스위치 환경: 스위치는 목적지 MAC 주소의 포트로만 패킷을 전달합니다. 직접 도청은 어렵지만, 뒤에서 설명할 ARP 스푸핑으로 우회할 수 있습니다.

Wi-Fi: 무선 신호는 공기 중으로 퍼집니다. 암호화되지 않은 공개 Wi-Fi는 누구나 도청할 수 있습니다. 비밀번호가 있는 Wi-Fi(WPA2)도 같은 비밀번호를 아는 사용자는 다른 사용자의 트래픽을 복호화할 수 있습니다.


방어: Part 2에서 살펴본 TLS 같은 엔드-투-엔드 암호화가 근본적인 해결책입니다. 네트워크 경로 어디에서 도청당해도 내용은 보호됩니다.


ARP 스푸핑: 로컬 네트워크 공격

같은 네트워크에서 데이터를 주고받으려면 IP 주소뿐 아니라 MAC 주소도 알아야 합니다. ARP(Address Resolution Protocol)는 IP 주소로 MAC 주소를 알아내는 프로토콜입니다. “192.168.1.10은 누구야?”라고 네트워크에 질문하면, 해당 IP를 가진 기기가 자신의 MAC 주소를 알려줍니다.

문제는 응답을 검증하지 않는다는 것입니다. 공격자가 “192.168.1.10은 나야”라고 거짓 응답을 보내면, 질문한 기기는 이를 그대로 믿습니다.


ARP 스푸핑 공격:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
정상 상태:
게이트웨이 ◄─────────────────► 피해자
              (직접 통신)

                 공격자
                   │
       ┌───────────┴───────────┐
       ▼                       ▼
  "게이트웨이 MAC은       "피해자 MAC은
   내 것이야"              내 것이야"
       │                       │
       ▼                       ▼
    피해자                 게이트웨이

공격 후:
게이트웨이 ◄────► 공격자 ◄────► 피해자
            (모든 트래픽이 공격자를 거침)

피해자가 인터넷에 접속하려면 게이트웨이를 거쳐야 합니다. 공격자가 양쪽에 거짓 ARP 응답을 보내면, 피해자와 게이트웨이 사이의 모든 트래픽이 공격자를 거치게 됩니다. 공격자는 도청, 변조, 차단을 모두 할 수 있습니다.


방어:

  • 고정 ARP 항목: 게이트웨이의 MAC 주소를 수동으로 설정하면 거짓 응답을 무시함
  • DAI(Dynamic ARP Inspection): 스위치가 ARP 응답과 실제 IP-MAC 매핑을 비교하여 거짓 응답 차단
  • TLS: ARP 스푸핑 자체는 막지 못하지만, 트래픽이 암호화되어 있으면 도청해도 내용을 볼 수 없음

DNS 스푸핑: 이름을 속이다

DNS(Domain Name System)는 도메인 이름을 IP 주소로 변환합니다. ARP와 마찬가지로 응답에 대한 인증이 없어서 공격자가 위조된 응답을 보낼 수 있습니다.


DNS 스푸핑 공격:

같은 네트워크에 있는 공격자가 DNS 질의를 감시하다가 정상 응답보다 먼저 위조된 응답을 보냅니다.

1
2
3
4
5
6
7
8
9
10
11
사용자 ──── "google.com의 IP는?" ────► DNS 서버
   │                                      │
   │     공격자가 질의를 감시하고          │
   │     위조 응답을 먼저 보냄             │
   │                                      │
   │ ◄─── "1.2.3.4야" (공격자, 먼저 도착)  │
   │                                      │
   │      "142.250.196.110이야" (늦게 도착, 무시됨)
   │
   ▼
1.2.3.4 (악성 서버)에 접속


DNS 캐시 포이즈닝:

DNS 서버는 한 번 받은 응답을 캐시에 저장해두고, 같은 질의가 오면 저장된 답을 돌려줍니다.

위의 DNS 스푸핑은 한 명의 사용자만 속일 수 있지만, DNS 서버의 캐시를 오염시키면 해당 서버를 사용하는 모든 사용자가 영향을 받습니다.


2008년 Dan Kaminsky는 DNS 캐시 포이즈닝을 쉽게 만드는 취약점을 발표했습니다.

DNS 클라이언트는 요청을 보낼 때 무작위 숫자(트랜잭션 ID)를 포함합니다.

응답에 같은 숫자가 들어있어야 정당한 응답으로 인정합니다.

공격자는 이 숫자를 모르지만, 16비트라서 경우의 수가 65536가지뿐입니다.

공격자가 0부터 65535까지 모든 숫자로 위조 응답을 빠르게 보내면 하나는 맞습니다.


방어:

  • DNSSEC: DNS 응답에 디지털 서명을 추가하여 위조 여부를 검증
  • DNS over HTTPS/TLS: DNS 쿼리 자체를 암호화하여 공격자가 내용을 볼 수 없게 함
  • 무작위 소스 포트: 트랜잭션 ID(65536가지) 외에 소스 포트(65536가지)도 맞춰야 하므로 경우의 수가 약 40억 가지로 증가

IP 스푸핑: 출발지 위조

IP 패킷의 출발지 주소는 쉽게 위조할 수 있습니다. IP 프로토콜 자체가 출발지를 검증하지 않기 때문입니다. 공격자 추적이 어려워지고, 뒤에서 설명할 증폭 공격에 악용됩니다.


BCP 38 (Ingress Filtering):

KT나 SK 같은 인터넷 회사(ISP)가 출발지 위조를 막는 방식입니다.

예를 들어 KT 고객에게 203.100.x.x 대역이 할당되었다면, 이 고객이 보내는 패킷의 출발지는 203.100.x.x여야 합니다. 만약 출발지가 8.8.8.8처럼 다른 주소라면 위조된 것이므로 KT가 차단합니다.

모든 ISP가 BCP 38을 구현하면 IP 스푸핑이 어려워집니다. 하지만 아직 전 세계적으로 완벽히 적용되지는 않았습니다.


서비스 거부 공격: 가용성 파괴

DoS(Denial of Service)는 정상 사용자가 서비스를 이용하지 못하게 하는 공격입니다. DDoS(Distributed DoS)는 여러 출처에서 동시에 공격하여 방어가 더 어렵습니다.


공격 유형:

볼륨 기반 공격: 회선이 감당할 수 없을 만큼 대량의 트래픽을 보냅니다. 1Gbps 회선에 10Gbps 트래픽이 들어오면 정상 트래픽도 전달되지 못합니다.

프로토콜 공격: 서버가 관리하는 연결 정보를 가득 채웁니다. 다음에 설명할 SYN Flood가 대표적입니다.

애플리케이션 공격: 서버의 CPU나 메모리를 소진시킵니다. 처리 비용이 큰 요청(검색, 로그인 등)을 대량으로 보냅니다.


SYN Flood: TCP의 약점

TCP 연결은 3-way 핸드셰이크로 시작합니다. 서버는 SYN을 받으면 SYN-ACK를 보내고, 클라이언트의 ACK를 기다리는 동안 연결 정보를 메모리에 저장합니다. 이 “대기 중인 연결”을 저장하는 공간은 한정되어 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
정상 연결:
클라이언트 ─── SYN ───► 서버 (대기 중인 연결 저장)
클라이언트 ◄── SYN-ACK ── 서버
클라이언트 ─── ACK ───► 서버 (연결 완료, 대기 목록에서 제거)

SYN Flood:
공격자가 출발지를 1.1.1.1로 위조하여 SYN 전송
                    │
                    ▼
                  서버 (대기 목록에 저장)
                    │
                    ▼
         SYN-ACK를 1.1.1.1로 전송
                    │
                    ▼
         1.1.1.1은 요청한 적 없으므로 무시
                    │
                    ▼
         서버는 ACK를 계속 기다림 (타임아웃까지)

이것을 수천~수만 번 반복하면 대기 목록이 가득 참
→ 정상 사용자의 연결 요청도 거부됨


방어:

SYN Cookies: 대기 목록에 저장하지 않는 방식입니다. 서버가 SYN-ACK를 보낼 때 시퀀스 번호에 연결 정보를 암호화하여 넣습니다. 정상 클라이언트가 ACK를 보내면 그 안에 이 정보가 포함되어 있으므로 연결을 복원할 수 있습니다. 위조된 주소로는 ACK가 돌아오지 않으므로 서버 자원을 소모하지 않습니다.

SYN Proxy: 방어 장비가 서버 대신 핸드셰이크를 처리합니다. 핸드셰이크가 완료된 정상 연결만 서버에 전달합니다.


증폭 공격: 적은 비용으로 큰 피해

앞서 설명한 IP 스푸핑을 활용한 공격입니다. 공격자가 출발지를 피해자 IP로 위조하여 요청을 보내면, 응답은 피해자에게 갑니다. 이때 응답이 요청보다 훨씬 크면 공격이 증폭됩니다.

1
2
3
4
5
6
7
공격자: 출발지를 피해자(5.5.5.5)로 위조하여 요청 전송
                         │
                         ▼
                    취약 서버
                         │
                         ▼ (응답)
                    피해자 (5.5.5.5)

공격자가 100바이트 요청을 보내고 취약 서버가 5000바이트 응답을 보내면, 증폭률은 50배입니다. 공격자는 적은 대역폭으로 피해자에게 큰 트래픽을 보낼 수 있습니다.


증폭에 사용되는 프로토콜:

작은 요청에 큰 응답을 보내는 프로토콜이 악용됩니다.

프로토콜 증폭률
memcached 50000배
NTP 556배
DNS 28~54배

memcached는 캐시 서버로, 짧은 명령 하나로 저장된 데이터 전체를 요청할 수 있어서 증폭률이 극단적으로 높습니다. 2018년 GitHub에 대한 1.35Tbps 공격이 memcached 증폭을 사용했습니다.


방어:

증폭 공격은 두 가지를 막으면 됩니다.

출발지 위조 방지: 앞서 설명한 BCP 38이 적용되면 공격자가 출발지를 피해자 IP로 위조할 수 없습니다.

증폭에 악용되는 서비스 보호: memcached, DNS 서버 등이 인터넷 전체에 열려 있으면 증폭에 악용됩니다. 필요한 네트워크에서만 접근 가능하도록 설정해야 합니다.


봇넷: 분산 공격의 도구

봇넷(Botnet)은 악성코드에 감염된 다수의 기기입니다. 공격자는 C&C(Command and Control, 명령 및 제어) 서버를 통해 감염된 기기들에 명령을 내립니다. “지금부터 이 IP를 공격해라”라는 명령이 내려오면, 수천~수백만 대의 감염된 기기가 동시에 공격합니다.

1
2
3
4
공격자 → C&C 서버 → 감염된 기기들 (수천~수백만 대)
                          │
                          ▼
                       피해자


Mirai 봇넷(2016):

IP 카메라, 라우터 같은 IoT 기기를 기본 비밀번호(admin/admin 등)로 로그인하여 감염시켰습니다. 2016년 미국의 DNS 서비스 업체를 공격하여 Twitter, Netflix, GitHub 등 수많은 서비스가 접속 불가 상태가 되었습니다.


방어:

봇넷의 일부가 되지 않으려면 기기 보안이 중요합니다. 기본 비밀번호를 변경하고, 펌웨어를 최신으로 유지해야 합니다. IoT 기기는 별도 네트워크에 격리하면 감염되더라도 피해를 줄일 수 있습니다.


방화벽: 첫 번째 방어선

방화벽(Firewall)은 네트워크 트래픽을 검사하여 허용된 트래픽만 통과시킵니다.


패킷 필터링 방화벽:

각 패킷을 독립적으로 검사합니다. 출발지/목적지 IP, 포트 번호, 프로토콜을 기준으로 허용하거나 차단합니다.

1
2
3
4
5
규칙 예시:
허용: TCP 목적지 포트 443 (HTTPS)
허용: TCP 목적지 포트 80 (HTTP)
차단: 외부에서 TCP 목적지 포트 22 (SSH)
기본: 그 외 모두 차단

단점은 각 패킷을 따로 보기 때문에 연결의 맥락을 모른다는 것입니다.

예를 들어, 외부에서 SYN-ACK 패킷이 들어왔다고 가정합니다. 이 패킷은 두 가지 경우가 있습니다:

  1. 내부 사용자가 외부 서버에 접속을 요청했고(SYN), 그에 대한 정상 응답(SYN-ACK)
  2. 공격자가 아무 요청 없이 보낸 악성 패킷

패킷 필터링 방화벽은 “내부에서 SYN을 보낸 적이 있는가”를 기억하지 않습니다. 그래서 이 두 경우를 구분하지 못합니다.


상태 기반 방화벽:

연결 상태를 기억합니다. 내부에서 외부로 연결을 시작하면 그 연결의 응답만 허용합니다.

1
2
3
내부 → 외부: SYN 전송 → 방화벽이 "연결 시작"으로 기록
외부 → 내부: SYN-ACK 수신 → 기록된 연결의 응답이므로 허용
외부 → 내부: 갑자기 SYN-ACK → 시작된 연결이 없음 → 차단

내부에서 요청하지 않은 응답은 차단되므로 더 안전합니다.


웹 애플리케이션 방화벽(WAF):

HTTP 요청의 내용까지 검사합니다. “SELECT * FROM users” 같은 SQL 명령이 요청에 포함되어 있으면 SQL 인젝션 공격으로 판단하여 차단합니다.


IDS/IPS: 탐지와 차단

IDS(Intrusion Detection System, 침입 탐지 시스템)는 의심스러운 활동을 탐지하여 관리자에게 알립니다.

IPS(Intrusion Prevention System, 침입 방지 시스템)는 탐지 후 자동으로 차단까지 수행합니다.


탐지 방식:

시그니처 기반: 알려진 공격 패턴을 데이터베이스로 저장해두고, 트래픽과 비교합니다. 알려진 공격은 정확히 탐지하지만, 처음 보는 공격은 탐지하지 못합니다.

이상 탐지: 평소 트래픽 패턴을 학습합니다. 평소와 다른 패턴이 나타나면 경고합니다. 처음 보는 공격도 탐지할 수 있지만, 정상 트래픽을 공격으로 오인하는 경우가 있습니다.


IDS와 IPS의 차이:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        ┌─────┐
        │ IDS │ ← 트래픽 사본을 분석
        └──┬──┘
           │ 경고
           ▼
      관리 콘솔

인터넷 ─────────────────────► 내부 네트워크
           (트래픽은 그대로 통과)


인터넷 ───► IPS ───► 내부 네트워크
           │
           │ 의심스러운 트래픽 차단
           ▼
        차단됨

IDS는 트래픽을 복사해서 분석만 합니다. 공격을 발견해도 직접 막지는 못하고 관리자에게 알립니다. IPS는 트래픽 경로에 직접 위치하여 공격을 즉시 차단합니다.


DDoS 완화 전략

대규모 DDoS는 단일 장비로 막기 어렵습니다. 여러 전략을 조합해야 합니다.


트래픽 분산:

같은 서비스를 여러 지역의 서버에서 운영합니다. 서울의 사용자는 서울 서버로, 미국의 사용자는 미국 서버로 연결됩니다. 공격 트래픽도 여러 서버로 분산되므로 한 곳에 집중되지 않습니다.


스크러빙 센터:

모든 트래픽을 먼저 필터링 센터로 보냅니다. 필터링 센터가 악성 트래픽을 걸러내고, 정상 트래픽만 원본 서버로 전달합니다.

1
2
인터넷 ──► 스크러빙 센터 ──► 원본 서버
          (악성 트래픽 제거)

Cloudflare, Akamai 같은 회사가 이런 서비스를 제공합니다.


요청 제한(Rate Limiting):

같은 IP에서 초당 100개 이상의 요청이 오면 차단하는 식으로 제한을 겁니다. 정상 사용자도 영향받을 수 있으므로 적절한 기준 설정이 중요합니다.


CAPTCHA:

“로봇이 아닙니다” 같은 확인을 요구합니다. 봇은 이를 통과하기 어렵습니다. 평소에는 비활성화하고, 공격이 감지될 때만 켭니다.


네트워크 세분화

세분화(Segmentation)는 네트워크를 작은 구역으로 나누는 것입니다. 한 구역이 침해당해도 다른 구역으로 퍼지는 것을 막습니다.


VLAN으로 분리:

스위치(Switch)는 여러 기기를 연결하는 네트워크 장비입니다. 회사나 가정에서 컴퓨터, 프린터, 서버 등을 하나의 네트워크로 묶을 때 사용합니다. 가정용 공유기 뒷면에 있는 여러 개의 LAN 포트가 스위치 역할을 합니다.

VLAN(Virtual LAN)은 하나의 스위치를 여러 개의 독립된 네트워크처럼 나누는 기술입니다.

원래 같은 스위치에 연결된 기기들은 서로 직접 통신할 수 있습니다. 하지만 스위치에서 “1~10번 포트는 VLAN 10, 11~20번 포트는 VLAN 20”처럼 설정하면, VLAN 10의 기기와 VLAN 20의 기기는 같은 스위치에 연결되어 있어도 직접 통신할 수 없습니다.

서버, 직원 PC, IoT 기기를 각각 다른 VLAN에 배치하면, IoT 기기가 감염되어도 서버에 직접 접근할 수 없습니다.

1
2
3
4
5
6
VLAN 10 (서버)     VLAN 20 (직원 PC)     VLAN 30 (IoT)
      │                    │                   │
      └────────────────────┴───────────────────┘
                           │
                    방화벽/라우터
                  (VLAN 간 통신 제어)

VLAN 간 통신은 방화벽을 거쳐야 하므로, “VLAN 30에서 VLAN 10으로는 접근 불가” 같은 규칙을 적용할 수 있습니다.


마이크로세분화:

더 세밀하게 나눕니다. 같은 VLAN 내에서도 서버 A와 서버 B 사이의 통신을 제어합니다. 데이터센터나 클라우드 환경에서 소프트웨어로 이런 규칙을 관리합니다.


Zero Trust: 신뢰하지 않는다

전통적 보안은 회사 건물에 비유할 수 있습니다. 출입문에서 신분증을 확인하고, 일단 건물 안에 들어오면 자유롭게 돌아다닐 수 있습니다. 네트워크도 마찬가지로, 방화벽을 통과해서 회사 네트워크에 접속하면 내부 자원에 접근할 수 있었습니다.


이 방식에는 문제가 있습니다.

내부자 위협: 건물 안에 들어온 사람이 악의를 품으면 막을 방법이 없습니다. 직원의 PC가 악성코드에 감염되면, 그 PC는 회사 네트워크 “안”에 있으므로 신뢰받습니다.

경계의 소멸: 재택근무자는 집에서 회사 시스템에 접속합니다. 회사 데이터는 클라우드에 있습니다. “회사 네트워크 안”이라는 개념 자체가 모호해졌습니다.


Zero Trust는 “아무도 신뢰하지 말고, 항상 검증하라”는 원칙입니다.

회사 네트워크 안에 있어도 매번 신원을 확인합니다. 한 번 로그인했다고 끝이 아니라, 사용 중에도 기기 상태(백신 설치 여부, 패치 적용 여부)를 계속 확인합니다. 개발자는 개발 서버에만, 회계팀은 회계 시스템에만 접근할 수 있도록 최소한의 권한만 부여합니다. 한 시스템이 뚫려도 다른 시스템으로 퍼지지 않게 설계합니다.


보안은 계층적이다

방화벽 하나로 모든 공격을 막을 수 있을까요? 그렇지 않습니다. 방화벽에 취약점이 있거나, 허용된 포트를 통해 공격이 들어올 수 있습니다.

심층 방어(Defense in Depth)는 여러 겹의 방어선을 두는 전략입니다. 한 겹이 뚫려도 다음 겹이 막습니다.

계층 대책 이 글에서 다룬 내용
물리적 출입 통제, CCTV -
네트워크 방화벽, IDS/IPS, 세분화 방화벽, IDS/IPS, VLAN
호스트 백신, 운영체제 패치 -
애플리케이션 WAF, 입력 검증 WAF
데이터 암호화, 접근 제어 Part 1, 2의 암호화
사용자 보안 교육, 다단계 인증 -


공격자가 방화벽을 우회했다고 가정합니다. 하지만 IDS가 이상 행동을 탐지하여 경고합니다. IDS도 피했다면, 호스트의 백신이 악성코드를 차단합니다. 백신도 우회했다면, 데이터가 암호화되어 있어 읽을 수 없습니다. 공격자는 모든 계층을 뚫어야 목표에 도달할 수 있습니다.


마무리

이 글에서는 네트워크 공격과 방어를 살펴보았습니다.

  • 프로토콜 취약점: ARP, DNS, IP 등 오래된 프로토콜은 인증 없이 설계됨
  • 도청과 스푸핑: 패킷 스니핑, ARP/DNS/IP 스푸핑으로 통신을 가로채거나 속임
  • 서비스 거부 공격: SYN Flood, 증폭 공격, 봇넷을 이용한 DDoS
  • 방어 장비: 방화벽(패킷 필터링, 상태 기반), IDS/IPS(탐지와 차단)
  • 방어 전략: 네트워크 세분화, Zero Trust, 심층 방어

네트워크 보안은 기술만의 문제가 아닙니다. 프로세스, 정책, 사람이 모두 중요합니다.



관련 글

Tags: DDoS, IDS, 네트워크, 방화벽, 보안

Categories: ,