714. Ping of Death (죽음의 핑) - 대형 패킷 단편화 오버플로우 문제
핵심 인사이트: 식당에 피자 1판이 배달 오면 문으로 잘 들어온다. 그런데 악의적인 장난꾸러기가 "피자 100만 판짜리 초거대 상자"를 보냈다. 당연히 문에 낄 테니, 우체국은 상자를 수천 조각으로 잘게 잘라서(단편화) 배달했다. 식당 주인은 이 수천 조각을 주방에서 다시 조립하려다 주방 공간(메모리 버퍼)이 터져버려 식당 운영이 중단되었다. 이것이 핑의 탈을 쓴 악랄한 폭탄, Ping of Death 공격이다.
Ⅰ. Ping of Death 공격의 개념
- 정상적인 통신 확인용 명령어인
Ping(ICMP Echo Request) 패킷의 크기를, 인터넷 규격이 허용하는 최대 크기(65,535바이트)보다 비정상적으로 엄청나게 크게 부풀려서 타겟 서버로 던지는 공격입니다. - 타겟 서버가 이 거대한 패킷 조각들을 받아 다시 하나로 합치는 과정에서, **메모리 허용치(Buffer)를 초과해버려 시스템이 다운되거나 재부팅되는 현상(Buffer Overflow)**을 유발하는 고전적인 DoS 공격입니다.
Ⅱ. 공격의 치명적 원리: 단편화와 재조립 🌟
1. 단편화 (Fragmentation)의 발생
- 우리가 쓰는 이더넷(랜선) 도로의 최대 통과 크기(MTU)는 겨우 1,500바이트입니다.
- 해커가
ping -l 65500 타겟IP라는 명령어로 65,000바이트짜리 비만 패킷을 던지면, 1500바이트짜리 도로를 통과하기 위해 라우터가 이 거대 패킷을 수십 개의 작은 조각(Fragment)으로 강제로 잘게 썹니다.
2. 수신자의 재조립(Reassembly)과 버퍼 오버플로우
- 공격 대상 서버(피해자)는 이 잘게 쪼개진 수십 개의 패킷 조각을 받으면, 램(RAM)의 임시 공간(Buffer)에 차곡차곡 모아두었다가 원래의 65,000바이트 크기로 다시 조립(Reassembly)하려고 시도합니다.
- 폭발 (Buffer Overflow): 옛날 윈도우 95나 구형 리눅스 운영체제들은 이렇게 무지막지하게 큰 ICMP 패킷이 들어올 것이라곤 상상도 못 하고 메모리 공간을 작게 만들어 두었습니다. 예상치를 뛰어넘는 거대한 데이터가 조립되면서 좁은 버퍼 공간을 뚫고 넘쳐흐르게 되고(오버플로우), 옆에 있던 운영체제의 핵심 시스템 메모리 영역까지 침범해 덮어쓰면서 윈도우 블루스크린(BSoD)이 뜨며 뻗어버립니다.
Ⅲ. 현대의 방어 대책
오늘날 이 원시적인 공격에 당하는 서버는 지구상에 거의 없습니다.
- OS 패치: 최신 윈도우, 리눅스 운영체제는 패킷 조립 시 비정상적으로 큰 데이터가 만들어지려 하면, 똑똑하게 이를 눈치채고 버퍼 오버플로우가 나기 전에 그 패킷을 안전하게 쓰레기통에 폐기(Drop)하도록 커널이 패치되어 있습니다.
- 방화벽(IPS) 차단: 방화벽이나 라우터 입구에서 아예 핑(ICMP Echo Request) 패킷의 크기가 정상 범위를 넘으면 무조건 1차선에서 차단해 버리는 규칙(Rule)이 기본적으로 깔려 있습니다.
📢 섹션 요약 비유: Ping of Death는 회사 로비에 '코끼리만 한 초대형 우편물'을 보내는 테러입니다. 코끼리가 문에 안 들어가니 배달부는 코끼리를 100조각으로 잘라서 로비에 내려놓습니다. 로비 직원은 친절하게도 이 100조각을 다시 꿰매어 코끼리 모양으로 조립하려 시도합니다. 하지만 로비 공간(버퍼)보다 코끼리 크기가 훨씬 컸기 때문에, 조립된 코끼리가 로비 유리창과 기둥을 모조리 다 부수고 건물을 무너뜨려 버렸습니다(오버플로우 다운). 요즘 로비 직원(방화벽)은 조각이 너무 많다 싶으면 조립도 하기 전에 쓰레기차를 불러 다 버려버립니다.