The origins of the Idle Scan

Salvatore Sanfilippo

Idle 스캔의 기원

원문은 Salvatore Sanfilippo님이 에 게재했습니다. 이 블로그 구독하기

Idle 스캔은 1998년 말에 고안되었으며, 이는 이메일들로 입증된다. 나는 그 몇 달 전 밀라노로 이주했는데, 기억이 맞다면 9월부터 그곳에 있었고 새로운 아이디어로 가득했지만 그 도시에서의 체류가 그리 길지 않을 줄은 몰랐다. 여름은 시칠리아 해변에서 보냈고, 주로 Seclab 사람들(대부분 David)이 추천해 준 많은 책들을 읽으며 지냈다. 하지만 그 독서에는 촉매가 필요했다. Idle 스캔은 이론적 사색에서 태어난 공격이지만, 그 생각의 흐름은 지극히 현실적인 계기에서 비롯되었다. 나는 얼마 전 Hping이라는 툴을 만들었는데, 로고는 Nutella 로고에서 빌려온 것이었다. 이 점을 언급하는 이유는 당시 내 작업이 얼마나 진지했는지를 강조하기 위해서다 — 결국 나는 스물한 살에 불과했고 이미 북부 이탈리아에서 정규직을 맡고 있었으니, 어느 정도는 너그럽게 봐줄 필요가 있었다.

Hping은 TCP/IP 프로토콜을 위한 스위스 아미 나이프였다. 초기 용도는 대부분 탐색적이고 연구 목적이었다. Hping을 이용하면 TCP, UDP, ICMP 패킷을 가장 기괴한 방식으로 조립하고, 마찬가지로 별난 IP 패킷에 담아 — 조각내고 필드를 비정상적인 값으로 설정하여 — 보낼 수 있었다. 이렇게 만든 패킷들을 여기저기 보내 다양한 운영체제의 네트워크 스택 응답을 관찰하는 것이었다.

Idle 스캔이 시작된 지점이 바로 여기다. Hping을 단 몇 분만 가지고 놀아도 (나에게는) 놀랍지만 이미 잘 알려진 사실 하나가 드러났다. 응답 패킷에는 일정한 값만큼 계속 증가하는 ID 필드가 있었다. 당시에는 내가 나중에 공개할 공격들이 아직 알려지지 않았기 때문에 이 ID 필드의 동작은 아무런 우려도 불러일으키지 않았다. 운영체제는 IP 패킷을 내보낼 때마다 먼저 카운터 하나를 증가시킨 뒤(카운터는 2의 16제곱 빼기 1이라는 최댓값에 도달하면 0으로 리셋됐다), 그 카운터 값을 ID로 설정해 패킷을 전송했다. 이 카운터는 모든 외부 발송 패킷에 공통으로 적용되는 전역 카운터였다. 이를 이용하면 우선 네트워크에 연결된 임의의 컴퓨터의 발신 트래픽을 추정할 수 있었다. 이 정보 유출은 내게 충격으로 다가왔고, 나는 이를 우려스러운 이상 현상으로 보았다. 나는 이 문제를 지적하는 글을 BUGTRAQ에 처음 올렸다. 답글 중에는 인터넷계의 거물, TCP/IP 프로토콜의 핵심 RFC를 작성한 인물의 답변이 있었다. 그는 그렇다, 알고 있는 사실이며 잘 알려진 내용이라고 했다. 요컨대, 이 특성을 트래픽 추정에 이용할 수는 있지만 대부분은 위험이 없다고 본다는 것이었다. 그리고 사소하다고 여겨진 그 문제를 해결하려면 운영체제를 대대적으로 뜯어고쳐야 했다. 그럴 가치는 없다는 것이었다.

하지만 나는 그 문제 때문에 잠을 이루지 못했고, 내게 그것은 결코 부차적인 일이 아니었다. 증가하는 ID 필드가 제공하는 정보를 아직 완전히 파악하지는 못했지만 다른 요소들과 결합하면 훨씬 더 심각한 공격을 만들 수 있으리라 확신했다. 나는 이 이야기를 Lorenzo Cavallaro와 나눴다. Lorenzo는 몇 달 전 내게 raw socket 기법을 소개해 주었고, 나는 그것을 활용해 Hping을 작성했다. 그는 나의 단골 대화 상대이자 소중한 친구가 되어, TCP/IP와 관련된 고민이 있으면 그와 의논하곤 했다. 이 새로운 아이디어를 그에게 이야기할 때는 어쩔 수 없이 두루뭉술하게 말할 수밖에 없었다. 일부러 그런 것이 아니라 아직 최종적인 공격 형태를 완전히 조합하지 못했기 때문이었다. 모호한 설명에도 불구하고 그는 꽤 관심을 보이는 듯했다.

이틀 뒤, 나는 그와 다시 이야기했다. 마침내 Idle 스캔(당시에는 아직 그런 이름이 붙지 않았다)에 대해 좀 더 포괄적으로 설명할 수 있었다. 실질적으로 테스트할 방법이 없었기 때문에 종이 위에서 논리를 전개해 본 것이었다. 기억이 맞다면 Hping에는 필요한 기능 중 일부가 빠져 있었는데, 이 부분은 장담할 수 없다. 25년이 지났기 때문이다. 글을 쓰다 보니 기억이 조금씩 선명해진다. 아마 발송하는 TCP 패킷의 플래그를 정확히 지정할 수 없었던 것 같다. 어쨌든 기억상으로는 Hping 수정에 그리 오랜 시간이 걸리지 않았고, 덕분에 이론을 실제로도 테스트할 수 있었다. Idle 스캔은 정말로 작동했고, 실제 환경에서 이를 증명하는 일은 무척 짜릿했다. 누가 그런 비유를 했는지는 기억나지 않지만, 본질적으로 그것은 더 쉽게 관측 가능한 다른 천체에 미치는 중력 효과를 측정함으로써 보이지 않는 천체의 움직임을 간접적으로 관측하는 것과 같았다. 마치 명왕성이 발견된 방식처럼.

남은 일은 그 공격을 공개하는 것이었다. 안타깝게도 영어로 긴 이메일을 써야 한다는 생각만으로도 두려웠다. Idle 스캔이 흥미로운 아이디어라는 것을 알고 있었고, 바로 그렇기 때문에拙劣한 발표로 그 공개를 망칠까 봐 두려웠다. 어쨌든 그 공격은 복잡했고, 잘못 설명하면 이해조차 불가능하게 될 수도 있었다. Lorenzo와 나는 늦은 밤, 내 집에서, 확실히 취한 상태로 그 이메일을 썼다. 혼자 쓰는 것보다는 나았다. Lorenzo의 영어는 조금이나마 내 것보다 나았기 때문이다. 마침 Seclab의 동료(창립 멤버 중 한 명이기도 한) 중 한 명이 있었는데, 나는 그를 정보보안 분야의 진정한 천재라고 생각한다. 그는 Emilia 출신의 요식업 집안 출신이었다. 어느 저녁, 그가 가방을 들고 내 집에 나타났다. 가방 안에는 근사한 숭어 어란 한 덩이가 들어 있었는데, 나는 본 적도, 맛본 적도 없는 것이었다(그것은 나중에 내가 가장 좋아하는 음식 중 하나가 된다). 요리사-해커는 우리 모두를 위해 파스타를 만들었고, 우리는 함께 충분히 먹고 마셨다. 저녁이 끝날 무렵 다른 이들은 떠났지만(요리사-해커 외에도 다른 사람이 한 명 더 있었다), Lorenzo는 조금 더 남아 있었다.

그날 밤, 제법 취한 Lorenzo와 나는 무모하게도 Idle 스캔 발표 이메일을 쓸 때가 되었다고 생각했다(그 이메일은 아직도 BUGTRAQ 아카이브에 보존되어 있으며, 오늘날 보면 정말 횡설수설처럼 보인다 [1]). 우리는 내 PC 앞에 앉아 작업을 시작했다. 이메일은 이렇게 시작한다: I have uncovered a new tcp port scan method. Instead all others it allows you to scan using spoofed packets, so scanned hosts can't see your real address. 문법뿐만 아니라 이메일의 단호한 어조조차 완전히 부적절했다. 설상가상으로 우리는 그 공격을 dumb host scan이라 부르자고 제안했지만, 다행히 누군가 금세 더 나은 이름을 찾아냈고, 그것이 공식 명칭이 되었다. 바로 Idle scan이었다. 길게 말할 것 없이, 흠 많은 출발에도 불구하고 Idle 스캔은 고전적인 공격이 되었고, 흔히 그렇듯 나머지는 역사라고 해도 과언이 아니다.

[1] https://seclists.org/bugtraq/1998/Dec/79

이 글은 muse-spark-1.2-contributor 모델을 사용해 번역했습니다.

댓글