Idle Scan의 기원
Idle scan은 1998년 말에 고안되었다. 이메일 기록이 그 증거로 남아 있다. 나는 그 몇 달 전 밀라노로 이주한 참이었다. 정확히 기억한다면 9월부터 그곳에 있었는데, 새로운 아이디어로 가득했고 그 도시에서의 생활이 그리 오래가지 않으리라는 사실은 알지 못했다. 그해 여름은 주로 시칠리아 해변에서 보냈고, Seclab 사람들(대부분 David가 추천해 준)이 권해 준 책들을 읽으며 지냈다. 하지만 그 독서에는 촉매가 필요했다. Idle scan은 이론적인 궁리 끝에 탄생한 공격이었지만, 그 생각의 흐름은 꽤 현실적인 계기에서 비롯되었다. 나는 얼마 전 Hping이라는 도구를 만들었는데, 그 로고는 Nutella 로고에서 빌려온 것이었다. 이 이야기를 꺼내는 건 당시 내 작업이 얼마나 진지했는지를 강조하려는 뜻이다. 어쨌든 나는 겨우 스물한 살이었고, 이미 북이탈리아에서 전일제 일을 맡고 있었다. 어느 정도는 이해해 줘야 하지 않겠는가.
Hping은 TCP/IP 프로토콜을 위한 스위스 아미 나이프였다. 초기에는 주로 탐색과 연구 용도로 쓰였다. Hping으로는 TCP, UDP, ICMP 패킷을 가장 기괴한 형태로 조립할 수 있었고, 이를 다시 단편화되고 여러 필드 값이 비정상적으로 설정된 기묘한 IP 패킷에 캡슐화할 수도 있었다. 이렇게 만든 패킷들을 여기저기 보내 다양한 운영체제의 네트워크 스택이 어떻게 반응하는지 관찰하는 것이었다.
바로 여기에서 Idle scan이 시작된다. Hping을 몇 분만 가지고 놀아도 잘 알려진, 그러나 (당시 내게는) 놀라운 사실을 발견할 수 있었다. 응답 패킷의 ID 필드가 일정한 값만큼 계속 증가하고 있었던 것이다. 당시에는 내가 나중에 공개할 공격들이 아직 알려지지 않았던 때라, 이 ID 필드의 동작은 아무런 우려도 낳지 않았다. 운영체제는 IP 패킷을 내보낼 때마다 먼저 카운터를 하나 증가시키고(카운터는 2의 16제곱 빼기 1, 즉 65535에 도달하면 0으로 초기화되었다), 그 카운터 값을 ID로 삼아 패킷을 전송했다. 카운터는 모든 발신 패킷에 공통으로 적용되는 전역 카운터였다. 이를 이용하면 우선 네트워크에 연결된 임의의 컴퓨터가 내보내는 트래픽 양을 추정할 수 있었다. 이 정보 유출은 내게 충격으로 다가왔다. 분명히 우려스러운 이상 현상으로 보였다. 나는 BUGTRAQ에 첫 글을 올려 이 문제를 지적했다. 답글 중 하나는 인터넷의 저명인사, TCP/IP 프로토콜의 핵심 RFC를 직접 작성한 사람에게서 왔다. 그는 그렇다, 이미 알고 있는 잘 알려진 사실이라고 했다. 요컨대 이 특성이 트래픽 추정에 악용될 수는 있지만 대부분은 위험하다고 보지 않는다는 것이었다. 그리고 하찮다고 여겨지는 이 문제를 고치려면 운영체제를 대대적으로 뜯어고쳐야 하니 그럴 가치가 없다는 것이었다.
하지만 나는 잠을 이루지 못했다. 내게는 결코 사소한 문제가 아니었다. 증가하는 ID 필드가 제공하는 정보가 아직 완전히 파악하지 못한 다른 요소들과 결합되면 훨씬 더 심각한 공격을 만들 수 있다고 확신했다. 나는 이 이야기를 Lorenzo Cavallaro와 상의했다. Lorenzo Cavallaro는 몇 달 전 내게 raw 소켓 기법을 알려 준 사람으로, 나는 그 기법을 이용해 Hping을 만들었다. 그는 나의 단골 대화 상대이자 소중한 친구가 되었고, TCP/IP와 관련해 고민이 생기면 그와 의논하곤 했다. 이 새로운 아이디어를 그에게 털어놓았을 때는 일부러가 아니라 아직 최종적인 공격 형태를 다 짜지 못했기 때문에 어쩔 수 없이 두루뭉술하게 말할 수밖에 없었다. 그럼에도 그는 꽤 관심을 보였다.
이틀 뒤, 나는 그와 다시 이야기를 나눴다. 마침내 Idle scan(아직 그런 이름은 붙지 않았던)에 대해 좀 더 완전한 설명을 해줄 수 있었다. 종이 위에 논리를 정리해 본 것이었고, 실제로 시험해 볼 방법은 없었다. 정확히 기억나는 건 아니지만 Hping에 필요한 기능 중 일부가 빠져 있었던 것 같다. 이 부분은 장담할 수 없다. 벌써 25년이 지났으니 말이다. 글을 쓰다 보니 기억이 조금씩 또렷해진다. 아마 발신 TCP 패킷의 플래그를 정확히 지정할 수 없었던 것 같다. 어쨌든 기억하기로 Hping을 고치는 데는 그리 오랜 시간이 걸리지 않았고, 덕분에 내 이론을 실제로 시험해 볼 수 있었다. Idle scan은 정말로 동작했다. 실제 환경에서 그 작동을 증명하는 일은 무척 흥분되는 경험이었다. 누가 처음 그런 비유를 들었는지는 기억나지 않지만, 본질적으로 그것은 눈에 보이지 않는 천체의 움직임을 다른, 더 쉽게 관측할 수 있는 천체에 미치는 중력 효과만을 측정해 간접적으로 관찰하는 것과 같았다. 마치 명왕성이 발견된 방식처럼 말이다.
남은 일은 이 공격을 공개하는 것뿐이었다. 문제는 영어로 긴 이메일을 써야 한다는 생각만으로 겁이 났다는 것이다. Idle scan이 흥미로운 아이디어라는 걸 알고 있었기에, 허술한 글로 발표를 망칠까 봐 두려웠다. 공격 자체가 복잡하기도 했고, 잘못 설명하면 아예 이해할 수 없는 글이 되어 버릴 수도 있었다. 나와 Lorenzo는 늦은 밤, 내 집에서 그 이메일을 함께 썼다. 분명히 취해 있었다. 혼자 쓰는 것보다는 나았다. Lorenzo의 영어가 내 것보다는 조금이나마 나았으니까. 마침 Seclab의 동료이자 공동 창업자 중 한 명인, 내가 정보 보안 분야의 진정한 천재라 여기는 사람이 에밀리아 출신 외식업 집안 출신이었다. 어느 날 저녁 그가 내 집에 가방을 들고 나타났다. 가방 안에는 내가 본 적도, 맛본 적도 없는 고급 숭어 어란이 들어 있었다(나중에는 내가 가장 좋아하는 음식 중 하나가 되었다). 요리사이자 해커인 그는 우리 모두를 위해 파스타를 만들었고, 우리는 함께 먹고 마시며 충분히 즐겼다. 저녁이 끝날 무렵 다른 사람들(요리사-해커 말고도 한 명이 더 있었다)은 떠났지만, Lorenzo는 조금 더 남아 있었다.
그날 밤, 제법 취기가 오른 나와 Lorenzo는 무모하게도 지금이 Idle scan 발표 메일을 쓸 때라고 생각했다(그 메일은 아직도 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 scan은 고전적인 공격으로 자리 잡았고, 흔히 말하듯 나머지는 역사다.
글을 무작위로 읽기