1988년 11월, 로버트 모리스가 인터넷의 크기를 알아내려는 의도로 만든 프로그램이 모리스 웜이다. 이는 최초의 웜으로 이 프로그램을 네트워크에 풀어 놓자마자 인터넷을 통해 빠르게 퍼지면서 대량의 유닉스를 감염시키고 네트워크를 마비시켰다. 당시 총 피해액은 10~1천만 달러에 달했으며 웜은 걷잡을 수 없이 퍼져 나가 인터넷을 접속하고 있던 유닉스 시스템 약 6,000대를 감염시켰고 이는 당시 전세계에 있는 모든 유닉스 컴퓨터 중 10%에 해당하는 규모였다.[1]
웜이란 네트워크를 이용하여 전파되는 컴퓨터 바이러스로 스스로를 복제하여 다른 컴퓨터를 감염시킨다. 일반적으로 메모리상에서만 존재하며 독자적으로 자신을 실행시키기 위해 시스템 자원을 자체적으로 사용한다. 옛날에는 컴퓨터 자원을 소모하여 컴퓨터가 느려지게 만드는 것이 주 증상이었다면 요즘은 웜들도 진화하여 위험한 기능을 가진 웜들이 많아 주의 깊게 봐야 하는 컴퓨터 바이러스 중 하나이다. 특히나, 모리스 웜(Morris worm)은 최초의 웜으로 인터넷의 보안 관념을 일깨웠다는 점에서 ‘위대한 웜(Great Worms)’라고도 불린다.[2]
모리스 웜의 아빠, 로버트 E 모리스 주니어(Robert Tappan Morris)는 1965년 11월에 태어나 현재 MIT에서 교수를 하고 있으며 모리스 웜을 만든 사람으로 유명하다. 모리스 주니어의 아빠인 로버트 모리스(Robert Morris)도 Bell Labs에서 컴퓨터 연구가로 근무하면서 Multics(지금은 서비스가 종료된 유닉스 운영체제)와 Unix를 연구하였고 나중에는 NSA의 한 부서인 국립 컴퓨터 보안 센터에서 수석 연구가로 일했었다.[3] 모리스 주니어는 이런 아빠 밑에서 컴퓨터를 꾸준히 해오며 하버드를 졸업해 코넬에서 대학원 과정을 밟던 와중 모리스 웜을 만들었고 네트워크에 엄청난 혼란을 가져왔다.[4] 이 사건으로 모리스는 보호관찰 3년, 사회봉사 400시간, 10,050달러의 벌금 및 보호관찰 비용 지불의 처분을 받았다.[5]
모리스는 순수한 의도로 네트워크에 연결된 컴퓨터가 어느 정도인지 알고 싶은 마음으로 모리스 웜을 만들어 네트워크에 풀었다. 모리스 웜은 유닉스에서만 작동되었는데 그 이유는 유닉스에 있는 취약점을 이용했기 때문이다. 모리스 웜은 감염시킬 컴퓨터에 먼저 일부 코드를 가져와 실행시켰고 이 코드를 통해 나머지 코드를 가져와 컴파일하였다. 모리스 웜이 실행되면 모리스 웜은 서버에 자신이 인터넷에 연결되었다는 사실을 알리고 일정 시간마다 이름도 바꿔가며 네트워크의 다른 컴퓨터도 감염시켰다.[6]
특히나, 컴퓨터를 세는 일인만큼 중복되는 것을 막고자 모리스 웜은 컴퓨터에 들어오면 또 다른 모리스 웜이 실행되고 있는지를 사용자에게 물었고 yes라고 누르면 건너뛰게 했다. 하지만 모리스는 사용자가 그냥 ‘yes’를 누를 수 있는 경우를 생각하고 1/7 확률로 무조건 모리스 웜에 감염되게 하였다. 문제는 1/7 확률이 너무 커서 모리스 웜은 네트워크로 순식간에 퍼져 나갔고 같은 컴퓨터에도 여러 모리스 웜이 상주했다.[7] 이 때문에 모리스 웜은 컴퓨터 자원을 너무 많이 사용하면서 컴퓨터에 무리를 주고 네트워크를 마비시켰다.
뭔가 잘못되어가는 것을 느낀 모리스는 하버드에 다니는 친구에게 연락하여 모리스 웜이 퍼지는 것을 막기 위해 이 웜 바이러스에 대한 경고와 치료 방법을 적은 익명의 메시지를 보냈지만 이미 차단된 게이트웨이 때문에 이 메시지는 전달되지 않았다.[8] 그 사이 전 세계 유닉스 시스템 관리자들은 이런 사태의 문제점을 감지하기 시작했고 그 중 NASA에 근무하던 한 직원이 이 웜 프로그램을 분석하여 텔넷, ftp, 핑거, rsh, SMTP 등 네트워크로 연결되는 통로를 막으라는 임시방편의 메시지를 보냈다. MIT, UC 버클리가 이 프로그램을 이틀 동안 꼬박 분석하여 사건 발생 후 며칠 만에 복구할 수 있었다.[9]
모리스 웜은 sendmail, finger, RSH/rexec(remote execute) 이 세 가지의 유닉스 취약점을 통해 실행되었고 컴퓨터 운영체제인 유닉스에서만 작동하였다. 또한, 무단으로 사용자 계정에 접근하여 연산 자원 시스템을 제어하기 위해 패스워드를 풀어내는 코드가 발견되기도 했다.[10]
모리스 웜에서 사용된 Fingerd 또는 Finger demon 프로그램은 클라이언트와 서로 연결하는 서버 프로그램으로 원격 호스트에 있는 사용자 정보를 검색할 수 있는 프로토콜이다. 초기에는 많이 사용되었지만 악용되는 사례가 많아져 점차 사라지고 지금은 사용되지 않는 기능이다. Fingerd는 서버에 있는 512바이트의 버퍼에서 get()으로 사용자의 정보를 읽고 가져온다. 그러나 512바이트를 넘기는 사용자의 정보를 요구할 때 512바이트의 버퍼 크기를 넘어가 임의의 정보를 기록할 수 있다. 즉, 버퍼오버플로우 취약점을 통해 임의의 코드를 실행시킨 것이다. 모리스 웜은 먼저 512바이트에는 아무것도 없는 내용을 넣었고 24바이트에는 되돌아오는 주소 정보와 무엇을 실행하는지에 대한 정보를 받아오는 코드까지 총 536바이트의 정보를 넣었다. 이후, 무엇을 실행할지가 담긴 내용의 코드와 소켓으로 서버와 연결하는 코드를 추가로 받아 실행시켰다.[11]
패스워드가 걸려있는 시스템을 뚫는 것은 뜻밖에 간단했다. 패스워드를 알아내는 공격으로 거대한 사전을 만들어 이를 차례대로 입력하며 패스워드를 찾아냈다. 모리스 웜은 사용자 이름과 해시(hash)화된 패스워드 내용이 저장된 /etc/passwd를 이용하여 패스워드를 찾아 시스템에 거부되지 않고 접근을 하였다. 해시는 패스워드를 수학적 알고리즘을 이용하여 변환한 것을 말하는데 일반적인 단어를 해시화 하는 것은 쉽지만 이를 역으로 풀어내는 것은 무척 어렵다. 그렇지만 짧고 쉬운 암호일 경우에는 조금이나마 추측할 수 있었고 같은 단어의 패스워드를 해시화할 때 결과가 일치하는 것을 이용하여 패스워드를 알아냈다. 아래에는 모리스가 만든 패스워드 사전이다.
“NULL” password
Username(ex, username: smith, password: smith)
Username Username(ex smithsmith)
Reverse username(ex, htims)
GECOS data, 사용자의 개인정보(passwd에는 별명 같은 사용자의 개인정보도 포함되어 있다.)
Special dictionary(모리스가 만든 432개의 단어)
Extensive dictionary(/usr/dic/words, 유닉스 시스템에서 사용하는 영어 단어)
위와 같은 패턴으로 사전공격을 할 때 찾을 확률이 30%나 더 높다는 연구 결과가 있었다.[12]
모리스 웜에서 사용된 RSH(remote shell)는 원격에서 명령을 실행하는 기능으로 연결된 두 시스템은 /etc/hosts.equiv와 .rhosts로 신뢰관계를 확인한다. 여기에 접근하기 위해서는 패스워드가 필요한데 모리스는 사전 공격으로 패스워드를 찾았고 이 파일에 접근하여 신뢰할 수 있는 연결을 만들었다. 이를 이용하여 모리스 웜을 복제하고 감염시킬 수 있었다.[13]
모리스 웜은 크게 위험한 웜은 아니었다. 단지 컴퓨터를 세는 종류의 바이러스였지만 네트워크를 통해 엄청난 영향을 주었다. 그런 의미로 많은 이들이 이 바이러스가 단순한 바이러스가 아니면 어땠을까라는 상상을 하며 가슴을 쓸어내린다. 그러면서 그들이 모리스 웜을 계속해서 회자하는 것은 인터넷 보안 관념을 잊지 말자는 것이 아닐까 생각이 든다.