715. TearDrop (티어드롭) 공격 - 조각난 패킷 오프셋 중복 기만 다운
핵심 인사이트: 1,000피스짜리 직소 퍼즐을 샀다. 1번부터 10번 조각을 맞추고, 설명서에 적힌 대로 다음 11번 조각을 끼우려는데, 해커가 악의적으로 11번이 아니라 '5번 조각'을 다시 집어넣어 보냈다. 컴퓨터는 설명서와 다르게 그림이 자꾸 겹쳐지자 퍼즐을 억지로 쑤셔 넣으려다 뇌정지가 와서 거품을 물고 쓰러져 버렸다. 조각난 패킷의 '순서 번호'를 고의로 꼬아버려 컴퓨터를 미치게 만드는 우아한 공격, 그것이 티어드롭이다.
Ⅰ. TearDrop (눈물방울) 공격의 개념
- 패킷을 작게 조각내는 단편화(Fragmentation) 과정에서, 조각들의 조립 순서 번호(Offset)를 고의로 중복되거나 어긋나게 조작하여 전송함으로써, 타겟 서버가 이를 재조립(Reassembly)하는 과정에서 계산 오류를 일으켜 시스템이 멈추거나 뻗어버리게(DoS) 만드는 공격입니다.
Ⅱ. 공격의 치명적 원리: 오프셋(Offset) 중복 🌟
1. 정상적인 단편화와 조립 과정
- 4,000바이트짜리 거대한 패킷을 보낼 때, 인터넷 도로(1,500바이트)를 지나려면 조각을 내야 합니다.
- 라우터는 조각을 낼 때 겉면에 친절한 조립 설명서를 써줍니다.
- 조각 A: "나는 0번부터 1499번까지의 조각이야."
- 조각 B: "나는 1500번부터 2999번까지의 조각이야."
- 조각 C: "나는 3000번부터 끝까지야."
- 수신자 서버는 이 번호(Offset)를 보고 차곡차곡 테이프를 붙여 원래 그림을 복원합니다.
2. 해커의 오프셋 기만 (조작)
- 해커는 해킹 툴을 써서 이 조립 설명서의 번호표를 악의적으로 겹치게(Overlap) 조작합니다.
- 조각 A: "나는 0번부터 1499번이야."
- 조작된 조각 B: "나는 1400번부터 2999번이야!" (1400~1499 구간이 중복됨)
- 조작된 조각 C: "나는 2500번부터 끝까지야!" (또 중복됨)
- 폭발 (시스템 붕괴): 타겟 서버의 구형 운영체제(네트워크 스택)는 이렇게 겹친 패킷을 받으면, 메모리에 예쁘게 이어 붙여야 하는데 공간이 겹쳐서 당황하게 됩니다. 어떻게든 꿰맞춰보려고 마이너스(-) 길이로 빼기 계산을 시도하다가 메모리 영역을 엉뚱하게 건드리며 운영체제 커널 전체가 패닉(Kernel Panic)에 빠져 블루스크린과 함께 죽어버립니다.
Ⅲ. 관련된 단편화 악용 공격들 (형제들)
티어드롭의 원리를 이용한 다양한 변종 공격들이 있습니다.
- Bonk, Boink 공격: 오프셋을 아예 똑같이 '0번'으로 중복해서 보내거나 조각들을 이상한 순서로 꼬아서 보냅니다.
- Jolt 공격: 아주 작은 패킷을 엄청나게 많이 단편화해서 보냅니다.
Ⅳ. 현대의 방어 대책
Ping of Death와 마찬가지로 오늘날에는 거의 통하지 않는 구시대의 유물입니다.
- 방화벽/IPS 필터링: 최신 IPS 장비나 윈도우 커널은 패킷 조각들이 들어왔을 때, 조립 설명서(Offset)가 1비트라도 겹치거나 음수가 나오면 조립을 아예 시도하지 않고 즉각 그 조각들을 **쓰레기통에 폐기(Drop)**해 버리도록 설계되어 있습니다.
📢 섹션 요약 비유: TearDrop 공격은 이케아 가구를 조립하는 사람에게 '잘못된 번호표가 붙은 나사 부품'을 보내는 장난입니다. 설명서에는 1번 막대기 끝에 2번 막대기를 붙이라고 되어있는데, 해커가 보낸 부품 상자에는 1번 막대기 한가운데에 구멍을 뚫어 2번 막대기를 강제로 관통시키라는 모순된 지시어(중복 오프셋)가 적혀 있습니다. 구형 컴퓨터는 이 모순된 명령을 억지로 따르려다 망치로 자기 손을 내리찍고 기절해 버리는 꼴입니다.