Vulnerability
'man' 명령어에서 루트 익스플로잇을
2017 11 17
  • Facebook
  • Twitter
  • Copy URL

일반적으로 우리가 많이 사용하는 운영체제 화면은 GUI 즉, 그래픽 환경으로 구성된 운영체제다. GUI는 Graphical User Interface의 약자로, 사용자가 컴퓨터를 할 때, 직관적인 조작 방식으로 언어를 몰라도 쉽게 조작할 수 있다.[1][2][3] 반면 GUI 이전에는 UNIX 콘솔이나 도스 시리즈처럼 직접 문자를 입력하여 사용하는 운영체제, CUI(Command-line Interface), CLI (Character User Interface)가 존재했다.[4] 그리고 GUI와 CUI의 그 중간 어디가, TUI(Text-based User Interface)라는 것이 존재하는데, 이는 텍스트 기반 사용자 인터페이스로 CUI와는 다른 또 다른 개념이다. TUI는 문자를 의미의 표현뿐만 아니라 레이아웃의 표현에도 사용되는 일종의 그래픽 사용자 인터페이스이다.[5] 좀 더 얘기하면, CLI는 문자열을 한 버퍼의 단위로 사용되어 화면상에 표시할 때 줄 또는 문자열의 추가가 매우 효율적이다. 반면 TUI는 화면 전체를 한 버퍼의 단위로 사용하기 때문에 버퍼의 용량이 매우 큰 대신 버퍼의 좌표와 화면의 실제 좌표를 1:1로 대응할 수 있다.[6] 사용자 입장에서 가장 크게 와 닿는 차이점은 방향키를 사용할 수 있다는 점이다. 쉽게 말해, 문자를 이용한 그래픽 사용자 인터페이스인 것이다. 왜 뜬금없이 GUI, CUI, TUI에 대한 이야기를 하냐고? 오늘의 이야기가 이 TCU에 해당하는 하나의 명령어에 대해 이야기하려 하기 때문이다. 그것이 무엇이냐면, 최근 우리가 자주 사용하는 man 명령어에서 10년 가까이 된 오래된 루트 익스플로잇이 발견되어 많은 이가 놀랐다는 사실이다.[7]

이미지를 불러오는데 실패했습니다.

‘man’ 명령어는 어디에 쓰일까. 아니, 그 전에 많은 사용자가 LINUX를 공부하며 접하게 되는 것이 TUI 즉, 텍스트 기반의 환경이다. 명령어에는 여러 가지 종류의 여러 명령어가 있는데, 이러한 명령어는 프롬프트 상에서 사용된다.[8] 우리가 영화에서 나오는 해커들을 보면 그들의 컴퓨터는 검은 화면에 여러 글씨가 적혀있는 것을 볼 수 있는데, 그것이 프롬프트 상에서 명령어를 입력하면 나오는 화면들이다. 명령어는 이동할 때 사용되는 ‘cd’, 디렉토리 목록을 확인할 수 있는 ‘ls’, 파일을 복사할 때 ‘cp’, 이동시킬 때 사용하는 ‘mv’ 등 명령어도 다양하다. 이렇게 다양한 명령어 중에서 오늘 이야기할 명령어는 man이다.

man은 리눅스의 명령어 메뉴얼을 확인할 수 있는 명령어로, Manual의 약자다.[9] 즉, 리눅스 명령어의 도움말, 사용법, 각종 옵션, 사용환경, 버그, 제작자 등을 확인할 수 있는 명령어로[10], 리눅스를 사용하는 와중에 잘 사용하지 않았던 명령어에 대해 사용법을 확인할 경우, man 페이지를 통해 사용법을 확인할 수 있는 도움말이다.[11] 예를 들어, 내가 ‘cp에 대해 사용법을 잘 모를 경우, 프롬프트 창에서 ‘man cp’라고 치면 cp에 대한 사용법이 나온다. 아무리 숙달된 리눅스의 사용자라고 하더라도 모든 명령어에 대해 숙지할 수 없으니 man의 명령어는 아마도 상당히 많이 사용될 것이다.

앗, 그럼 help와 man의 차이는 뭐지. 살짝 옆길로 새서 잠깐 짚고 넘어가면 help(명령어 --help)는 명령어의 간단한 도움말을 볼 때 사용하는 용도로 명령어 형식과 옵션에 대해 간단한 설명이 나온다. 또한, 이 명령어는 간단한 명령어는 내용이 없을 수 있으며 모든 명령어의 도움말 내용을 가지고 있지 않다. 반면, man(man 명령어)는 명령어에 대해 아주 상세한 도움말을 제공한다. 매우 상세하기 때문에 몇 페이지를 훌쩍 넘어갈 수 있어 보통은 페이지 이동방법을 알아두는 것이 좋다.[12] 즉, 정리해서 help가 명령어에 대한 간단한 도움말이라면, man은 명령어에 아주 상세한 도움말이라고 보면 된다.

그렇다면 man 명령어 어떻길래 오늘 이야기에 대상이 된 것일까. 바로 최근, 이 man 명령어를 사용하여 시스템 문서를 표시하는 데서 루트 공격이 발견되었기 때문이다.[13] 악의적인 man 페이지에서 특정한 키와 따옴표와 같은 특별한 기호인 이스케이프 시퀀스(Escape sequence)[14]를 조합하여 트리거가 되면 ‘man trap exploit’이 실행된다. man trap exploit이 실행되면 화면 버퍼 메모리를 사용하여 로그인 세부 정보를 나타낼 수 있어 루트 공격에 성공할 수 있다는 것이다.[15]

이런 식의 취약점이 있는 손상된 man 페이지는 거의 모든 리눅스 및 BSD 배포판의 핵심 유틸리티에 포함되어 발견되었다. 살짝 다행인 것은 이 같은 공격이 이루어지려면 man 페이지를 처음부터 끝까지 읽어야 한다는 것이 요구되는데 실제로 그런 일은 드물 것으로 생각된다는 점이다.[16] 기억을 잘 떠올려 보면, 우리는 사용할 명령어에 대한 설명과 필요한 옵션 정도만 찾고, 그 페이지에서 나갔던 기억이 더 많을 것이다. 아무튼, 이 때문에 이러한 취약점을 찾은 이나 이를 기사에 내보낸 언론매체에 따르면 실제로 컴퓨팅 역사상 발생한 적도 없고 희생자가 없었지 않았을 거라고 얘기했다.[17] 더불어, 현재 발견된 취약점은 기사에 제보하기 3개월 전에 관리자에게 공개하였고 현재 보안 패치가 이루어진 상태다.[18] 그런 의미로 현 시스템 관리자는 보안 관행에 따라 최신 패치로 업데이트하는 것이 좋을 듯하다.

처음 이 기사를 업로드 한 Sudo Satirical의 기사를 보며 대부분 놀라는 반응이다. Reddit과 twitter에서는 이 글에 대해 여전히 믿을 수 없다는 얘기와 함께 충격적이라는 말의 댓글들이 달렸다.[19][20] 하긴 자신이 잘 사용하고 있던 man 프로그램에 문제가 있다는 것을 알았을 때 가히 그냥 놀라움은 아니었으리라 생각한다. 이에 대한 반응으로 보안 전문가인 Justin Case도 한 마디 덧붙였다. 그는 이 기사의 내용이 상당히 놀랍고 충격적이라고 말했으며 이러한 취약점이 있음에도 오랫동안 발견되지 않았다는 것도 상당히 놀라워했다.[21] 거의 10년 동안 man을 꾸준히 사용하면서 그걸 몰랐으니 기가 막힌 한방이다. 이건 마치 믿었던 기술의 배신 같은 느낌이랄까. 물론 모든 것에 완벽한 보안은 없다고 하지만 이런 발표는 들을 때마다 매번 놀라운 느낌이다. 결론은 이러한 취약점이 발견되었으니 리눅스, 유닉스를 사용하는 사용자는 보안패치를 하길 바란다는 것이다.

 

유성경 yuopboy@grayhash.com