해커들은 백신을 어떻게 피하는가? 초급편과 고급편

해커들은 백신을 어떻게 피하는가? 초급편과 고급편

압축하고 암호화하는 등 고유 식별자 변형시키고
정상 프로세스나 프로그램에 덧붙어 눈속임하고

[보안뉴스 문가용 기자] 백신은 우리가 현재 보유한 사이버 방어 도구 중 가장 오래되고 가장 성숙한 것 중 하나라고 볼 수 있다. 그럼에도 새롭게 등장하고 있는 멀웨어들 중 백신이 무서워서 벌벌 떨었다거나, 백신이 커다란 재앙을 막았다는 소식은 좀처럼 접할 수가 없다. 워너크라이가 모든 헤드라인을 접수한 바로 그날, 세계 최고라고 불리는 백신 엔진들은 초기 진압에 전부 실패했다. 시그니처 업데이트를 하나 둘 진행하고 나서야 겨우 대응이 가능해졌는데, 이 업데이트가 빠르게는 수 시간, 느리게는 수주까지 걸렸다. 시그니처에 기반한 방어의 단점이 고스란히 드러난 사례라고 할 수 있다.

[이미지 = iclickart]

그렇다고 시그니처 기반의 백신 소프트웨어가 이미 알려진 위협들에 대해 무적인 것도 아니다. 현재 백신 산업을 통틀어 매일 발견되는 새로운 멀웨어 변종은 하루에 3십만 개에서 1백만 개로 추산되는데, 이 숫자만큼 공격자들이 새로운 뭔가를 부지런히 만들어내는 게 아니다. 정말 새롭다고 느껴지는 변종은 이 중 많아봐야 수천에서 수만 정도일 뿐이다. 그렇다면 이 30만~1백만이라는 숫자의 정체는 뭘까?

바로 멀웨어들이 장착하고 있는 속임수 기술이다. 멀웨어 제작자들은 지난 세월 동안 여러 가지 방법을 개발해 멀웨어가 ‘새 것처럼’ 보이게 만들어왔다. 새 것처럼 보이면 새 멀웨어에 약한 백신을 따돌릴 수 있기 때문이다. 그런 기술들은 크게 초급과 고급으로 나눌 수 있는데, 오늘은 이를 한 번 짚어보고자 한다.

헌 멀웨어를 새 것처럼 : 기초편
패커
패커는 실행이 가능한 파일을 압축해 원래 용량보다 더 작게 만들어주는 프로그램이다. 또한 압축된 실행파일을 압축 해제시키기 위해 필요한 코드들로 한 겹 더 포장이 들어간다. 그러므로 패커를 사용해 압축하면 실행파일의 본 모습이 변형된다. 시그니처에 기반을 둔 탐지 솔루션, 분석가, 혹은 자동화 시스템은 이미 알려진 멀웨어 파일들의 해시나 바이너리에서 패턴을 찾아 고유의 식별자를 수집하는데, 패커를 사용하면 이 식별자까지도 바뀐다. 그래서 백신은 이미 알려진 멀웨어라고 하더라도 패커가 한 번 손을 본 것이면 알아보지 못할 가능성이 높다.

그렇다고 패커 자체가 악성 행위자들의 전유물인 것은 아니다. 정상적인 기능을 가진 실행파일의 용량을 줄이거나, 코드를 리버스 엔지니어링해서 복제하는 일을 방지하기 위해서도 패커를 사용하는 경우가 종종 있다. 다만 이를 멀웨어 제작자들이 활발하게 악용하고 있는 것이 문제고, 실제로 백신을 우회하는 데에 효과적이라는 것이 문제다.

크립터
크립터는 패커와 비슷한데, 추가적인 난독화 기술이나 암호화 기술을 한 겹 더 입힌다. 패커와 마찬가지로 바이너리 등에서부터 추출될 수 있는 고유 식별자를 변화시킴으로서 시그니처 기반의 탐지 기술을 우회하는 것이 본연의 목적인 것은 동일하다. 하지만 원래의 실행파일을 암호화 알고리즘을 가지고 암호화하는 추가 과정이 도입된다. 가장 흔한 알고리즘은 XOR 사이퍼인 것으로 추정된다. 사이퍼는 최종적으로 스텁(stub)이라는 것을 생성하는데, 스텁이란 압축을 해제시키고 실제 페이로드를 실행하는 데에 필요한 모든 것이 담겨져 있는 프로그램이다.

XOR라는 사이퍼를 사용할 때 키를 바꿔가면서 엔코딩을 하면 같은 프로그램을 가지고도 무궁무진한 ‘새 변종’을 만들어낼 수 있다. 물론 진정한 의미에서의 새 것이 아니라, 백신을 속이기 위한 새 것을 말한다. 지하의 암시장에서도 범죄자들끼리는 이런 크립터를 활발히 거래하고 있다. 무료도 많은데 대표적인 것이 베일-이베이젼(Veil-Evasion)이라는 프레임워크다.

그러나 패커와 크립터라고 해서 문제가 없는 건 아니다. 예를 들어 두 가지 기술 모두 정적인 분석에서는 멀웨어를 보호하는 데에 큰 위력을 가지고 있지만 동적 분석에서는 그렇지 못하다. 정적 분석은 멀웨어 탐지 기술 중 하나로 아직 실행되지 않은 파일에 대하여 실행하는 것이다. 멀웨어가 제대로 시동이 걸리기 전에 막고 싶은 것이 보안 솔루션의 기본 목표이므로, 백신 제품들은 네트워크를 통과한 파일이 시스템에 복제되기 전에 파일을 스캔한다. 즉, 가동되고 움직이는 파일을 멈춰 세워놓은 상태에서 분석하는 것이 정적 분석이고, 백신들이 주로 하는 방식이라는 것이다. 그러나 멈춰놓은 상태에서는 해당 파일의 면모를 모두 알아낼 수가 없다.

반대로 동적인 분석이란 파일이 실행되고 움직이며 돌아다닐 때 분석하는 것으로, 멀웨어 코드가 메모리에 있을 때나 실제 실행하는 기능 자체를 파악할 수 있게 해준다. 패킹 되거나 크립터가 적용된 프로그램도 결국 악성 페이로드가 실행되려면 패킹과 크립터가 다 해제되어야 한다. 동적 분석은 이때를 기다렸다가 탐지 기술을 발휘하는 것이므로 패킹과 크립터를 무용지물로 만들 수 있다. 동적 분석이 아니더라도, 백신 업체에서 특정 패킷이나 스텁에 대해 분석을 마치고 업데이트를 통해 엔진에 적용시킨다면, 정적 분석을 통해서도 배커와 크립터를 막을 수 있다.

물론 패커와 크립터 기술도 갈수록 발전하고 있어 이렇게 단순한 원리로만 백신에게 덜미를 잡히지만은 않는다. 최근 멀웨어 제작자들은 페이로드의 일부만을 패킹한다든가, 메모리 내 페이로드의 작은 부분만을 골라내어 순차적으로 암호화하는 식으로 백신 엔진이 가진 감시의 눈을 피해가고 있다.

다형성 멀웨어(polymorphic malware)
다형성 멀웨어란, 패킹과 크립팅 기술을 반복적으로 사용해서 자신의 모습을 다각도로 변화시킬 줄 아는 멀웨어다. 다만 일반 크립터들처럼 정적 키(static key)를 사용하는 것이 아니라 보다 복잡한 암호화 알고리즘과 랜덤 키, 변수, 디코더를 함께 사용하는 것이 다형성 멀웨어의 특징이다. 게다가 이런 다형성 멀웨어는 한 번 복제될 때마다 자기 자신을 변형시키기도 한다. 범죄자들은 자신들이 만든 멀웨어와 그 변종들이 자동 공격할 수 있도록 서버를 구축하곤 하는데, 그 서버의 설정을 만져서 멀웨어가 매번 자동으로 변할 수 있도록 만들 수 있다. 이를 서버사이드 다형성 멀웨어라고 하는데, 현재 멀웨어를 사용하는 범죄자들 사이에서 가장 인기가 높다.

다운로더, 드로퍼, 단계별 로딩
최근의 멀웨어들은 스테이징(staging)이라는 기법을 활용한다. 단계별로 멀웨어를 조금씩 전송해 별개의 기능을 수행하게 한다든가, 피해자 시스템에서 퍼즐조각 맞추듯 멀웨어를 완성시키는 것인데, 여기서 핵심은 드로퍼나 다운로더다. 이 둘은 제일 먼저 침투해 해당 시스템이 어떤 환경을 갖추고 있는지 정찰부터 한다. 섣부르게 악성 페이로드가 실행되다가 발각되는 일이 없도록 하기 위함이다.

그래서 드로퍼나 다운로더는 보안과 관련된 프로세스를 찾아 종료시키거나 가상 기기 내에서 돌아가고 있는 건 아닌지 확인부터 한다. 혹은 두 번째 페이로드를 다운로드 받되 암호화된 채널을 통하기도 한다. 네트워크 탐지 기술을 피하기 위해서다. 잘 알려진 윈도우 프로세스 자체에 멀웨어를 주입시키기도 한다.

이 방법의 큰 단점은 백신 업체들이 드로퍼나 다운로더에 대한 시그니처를 찾아내 엔진을 업데이트 시킬 수 있다는 것이다. 실제 현대의 백신 프로그램들은 드로퍼나 다운로드는 꽤나 잘 찾아내는 편이기도 하다.

이 네 가지 방법들은 공격자들이 멀웨어 탐지 기능을 회피하기 위해 사용하는 기본적인 전술이며 기술들이다. 기본적이긴 하지만 효과도 좋고, 비교적 사용이 쉬워서 실제 공격에 많이 활용되고 있으니 알아둘 필요가 있다. 하지만 이게 다가 아니다. 멀웨어 개발자들은 훨씬 더 고급스러운 기술들을 개발해내고 있으며, 이에 대해 보안 전문가들도 파악하고 분석해 알아낸 것들이 있다. 그런 고급 기술들도 뒤이어 소개하고자 한다.

헌 멀웨어를 새 것처럼 : 고급편
안티디스어셈블리(antidisassembly)와 디버거(debugger) 막기
멀웨어 제작자들은 멀웨어 방어자들이 어떤 식으로 작업하고 연구하는지 알고 있다. 그러므로 어떤 도구가 사용되고 있는지, 그 도구들이 어떤 원리로 작동하는지도 알고 있다. 예를 들어 멀웨어 분석가들이나 프로그래머들은 디스어셈블러(역어셈블러) 툴이나 디버거를 자주 사용해 특정 코드가 하는 일을 파악한다.

그런데 이 디스어셈블러와 디버거를 탐지해내는 툴과 기술들은 굉장히 많이 존재한다. 윈도우에 기본 탑재된 기능들만 활용해도 이는 가능하다. 디스어셈블러와 디버거 탐지를 가능케 한 것은 소프트웨어 해적 행위를 막기 위해서였다. 그런데 이를 멀웨어 제작자들이 오히려 자기들 멀웨어의 분석을 막기 위해 사용하게 되었다. 즉 멀웨어가 지금 디스어셈블러나 디버거 환경에서 돌아가고 있는 건지 아닌지를 미리 파악하는 게 대단히 간단히 가능해진다는 뜻이다. 만약 디스어셈블러나 디버거가 발견되었다, 그러면 멀웨어는 엉뚱한 기능을 발휘해 분석을 힘들게 만든다.

루트킷
루트킷(rootkit)이란 멀웨어가 시스템 안으로 숨어들어가 눈에 띄지 않도록 하는 각종 기술이나 툴들을 조합한 것이라고 정리할 수 있다. 컴퓨터 프로세서들에는 다양한 권한 수준이 존재한다. 이 권한 수준에 따라 할 수 있는 것들이 달라진다. 공격자들은 이 체계를 조작하거나 속이는 방법을 개발해 높은 권한에서만 돌아갈 수 있는 프로그램을 실행시킬 수 있다.

예를 들면 윈도우나 리눅스와 같은 OS의 경우, 사용자 공간과 커널 공간이 존재한다. 권한의 측면에서 간략하게 말하면 커널 공간의 권한 수준이 사용자 공간의 그것보다 높다. 만약 악성 프로그램이 커널 수준의 권한을 갖게 되면 그때부터 사용자 공간에서 돌아가는 프로그램들에게 ‘거짓말’을 할 수 있게 된다. 높은 권한은 거짓말 할 수 있다는 권한이라는 게 재미있다.

아무튼 그래서 사용자 공간에서 파일 시스템을 스캐닝 하는 명령이 프로그램을 통해 들어올 때 커널에서 돌아가는 루트깃이 이 프로그램을 속여 특정 파일에 대한 스캐닝 기능을 무력화시킬 수 있게 된다. 반대로 사용자 공간에 악성 파일이 침투했다면, 커널 루트킷이 “이건 악성 파일이 아니다”라고 시스템을 속일 수 있게 된다. 가상화 층위까지 있는 시스템이라면, 문제가 더욱 복잡해진다. 그래서 현대의 백신들은 커널 모드를 따로 갖추고 있다.

코드, 프로세스, DLL 주입
프로세스 주입이나 DLL 주입이란 쉽게 말해 다른 프로세스가 돌아가는 상황에서 은밀하게 다른 코드를 실행시키는 다양한 기술을 총망라한 말이다. 멀웨어 제작자들은 이러한 기술들을 활용해 멀웨어 코드가 정상적인 윈도우 프로세스 밑에 숨어서 돌아가도록 하는 방법을 사용한다. 예를 들어, explorer.exe나 svchost.exe, notepad.exe 등 정상적인 윈도우 실행파일에 악성 코드나 프로세스를 주입시키는 식이다. 윈도우가 기능을 발휘하는 데 꼭 필요한 프로세스들을 노리면 노릴수록 백신 엔진이 수상한 점을 파악하기가 어려워진다. 파악해도 윈도우 프로세스를 죽일 방법이 없을 수도 있다.

비슷하게 이미 잘 알려진 네트워크 기능에 멀웨어를 주입시켜 악성 트래픽을 가려버리는 방법도 존재한다. 마이크로소프트는 이런 공격 방식에 대해 이해하고 있어, 여러 패치를 통해 프로세스 및 코드 주입 공격을 방어하고 있다. 하지만 공격자들은 이런 새로운 패치들을 연구해 방어를 뛰어넘는 방법들을 계속해서 개발 중이다.

위에 열거한 방법들은 수많은 백신 우회 기술 중 일부일 뿐이다. 정상적인 프로그램에 기생충처럼 덧붙는 기술인 바인딩(binding)도 있으며, 자동 분석 툴이 가동되는 시간에 슬립 모드에 들어가는 멀웨어들도 존재한다. 안티멀웨어나 백신 솔루션들은 이런 기발하고도 늘 바뀌는 우회 기술을 어떻게 타파할 수 있을까? 안타깝게도 ‘쉬운’ 방법은 없다. 이 싸움은 ‘군비 경쟁’과 비슷해 한 쪽이 우세한 기술을 개발하면, 다른 쪽이 그 기술보다 우위에 있는 기술을 개발하는 식으로 끝없이 벌어진다. 다만 최근 백신 개발자들 측에서 엄청난 무기를 손에 넣었는데 바로 행위 기반 탐지법(behavioral detection)이다.

위에서 언급된 백신 회피 방법들 중 대부분이 멀웨어 코드를 ‘변형시킨다’거나 악성 행위를 뒤에서 ‘숨어서 실행한다’거나 하는 일련의 ‘행위’들을 갖는다. 모양을 바꿔가며 눈속임을 하지만 결국 어느 순간에는 기능을 실행한다는 것이다. 해커들이 목적을 이루기 위해서는 기능이라는 것이 수행되어야 하는데, 그 기능 수행을 행위라고 한다. 행위 기반 탐지법이란 ‘모양에 신경 쓰지 않고, 너희들 목적 성취 방법에 신경 쓰겠다’는 접근법이다.

보통 이러한 솔루션들은 사용자 컴퓨터처럼 기능하는 샌드박스를 만든다. 이 샌드박스 안에는 일반적으로 많은 사람들이 사용하는 소프트웨어들도 설치되어 있다. 이러한 샌드박스 시스템에 새로운, 그러나 수상한 파일이 들어오면 있는 그대로 실행을 일단 시킨다. 모양을 보는 게 아니라 그 행동을 보는 것이다. 그리고 그동안 축적되어 온 수많은 멀웨어들의 행동 및 특성에 대한 데이터베이스와 비교해 상당히 정확하게 해당 파일이 악성인지 아닌지를 판단한다. 이러한 행위 기반 분석 기술은 멀웨어와의 싸움에서 유용하게 활용될 전망이다. 특히 머신 러닝 기술과 합쳐졌을 때 큰 힘을 발휘하리라 예상된다.

그렇다면 이제 범죄자들의 차례다. 이미 그들도 샌드박스란 것에 대해 알고 있다. 심지어 샌드박스 환경을 탐지해내는 기술이나 피해가는 기술도 고안되어 있다. CPU 타이밍 확인이나 레지스트리 점검 등의 기술을 동원해 샌드박스 시스템의 ‘지문을 채취’할 수도 있고, 해당 시스템에 사람이 개입하는지 자동화 시스템이 동원되는지 파악할 수도 있다. 그래서 샌드박스라는 게 거의 확실시되면, 멀웨어는 작동을 멈춘다. 분석을 최대한 어렵게 만들기 위함이다.

이런 샌드박스 탐지 툴은 암시장에서 거래되고 있다. 그런데 재미있게도 이미 이러한 암시장 쪽의 움직임을 고려한, 보다 더 발전한 솔루션들도 이쪽 편에서 나오고 있다. 예를 들어 패키지 상품 설치하듯 가상화 환경을 조성하는 것이 아니라, 전체 시스템 코드 에뮬레이션(full system code emulation) 기법을 사용해 샌드박스 규모를 늘려버리는 방식을 사용하면 악성 프로그램이 물리 CPU나 메모리로 보내는 모든 명령을 하나도 빼놓지 않고 볼 수 있게 된다. 말 그대로 ‘진짜 가시성’이 구현되는 것인데, 이런 최신 기법들은 아직 훼파 방법이 나오지 않았다.

하지만 언젠가 이 기술에 대한 대처를 멀웨어 제작자들은 해낼 것이다. 이 ‘군비 경쟁’ 스타일의 전쟁은 끝이 없다. 그러나 과거의 싸움들을 복기해보는 것은(즉, 이 기사를 읽어내는 것은) 중요하다. 왜냐하면 실제 현장에서는 재래식 무기도 여전히 활용되고 있기 때문이다. 공격자나 방어자나 최신 무기만 갈고 닦는 건 아니다.

글 : 코리 내크라이너(Corey Nachreiner)
[국제부 문가용 기자(globoan@boannews.com)]

[출처] http://www.boannews.com/media/view.asp?idx=56774&mkind=1&kind=1

Loading

Updated: 2017년 9월 3일 — 2:54 오후

댓글 남기기

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.