웹 상에서의 악성코드는 대부분 HTML과 자바스크립트로 이루어져 있다. 특히 JavaScript Malware에 관해서는 이미 상당한 연구가 진행되어 있다.


StackExchange의 Security 그룹에 2016년에 재미있는 질문글이 올라와있다. 요지는 악성 자바스크립트들의 어떤 공통점을 알 수 있다면, 이를 이용해서 어떤 임의의 페이지가 악성인지 아닌지를 확신할 수 있는 일종의 판별식을 제시할 수 있는지에 대한 것이다.


사실 질문자체는 판타지에 가까운 발칙한 상상이라 할 수 있다. 대부분의 사람은 그저 코웃음을 치고 넘어가겠지만, 놀랍게도 친절한 익명의 학자(로 추정)가 장문의 답변을 통해 질문자를 계몽시켜주었다. 일단 그런 요술상자같은 방법은 없으며 만약 그런 방법이 있었다면 웹 악성코드는 몇십년전에 진작 박멸되었을 것이라는 것이다. 


우선, 자바스크립트 악성코드와 관련된 연구가 현시점에 얼마나 많이 진행되었는지, 또 눈에 띌만한 선행연구는 무엇이며 그 분야와 각각의 범위에 대해 가늠하는 것이 중요하다. 특히 예술의 경지(The state of the art)라 불리는 최선의 방책으로는 무엇이 있는지 살펴보는 것이 선행되어야 한다. 그의 글을 대략적으로 요약하자면 다음과 같다.



1. Server side polymorphism

다형성(polymorphism)은 말 그대로 ‘다양한 형태를 띄는’ 것을 의미한다. 이러한 방법을 사용하는 이유는 시그니처 기반의 악성코드 탐지를 회피하기 위한 전략이다. 이러한 기법은 주로 악성코드의 여러 변종을 생성해내는 엔진이 웹서버에 탑재된 채로 운영될 때 발생하며, 이를 서버측 다형성(server side polymorphism)이라고 명명한다. 관련하여 1990년대 초 SMEG ver 1.0엔진이 컴퓨터 바이러스에 대한 다형성 개념을 보여준 최초의 사례이다.


2. Code obfuscation

자바스크립트로 된 악성코드의 대부분이 기본적으로 선택하는 방법은 코드 난독화(obfuscation)이다. 이는 기본적으로 어렵고 복잡하게 보이도록 코드를 섞어찌개로 만들어버리는 것이다. 이는 꼭 악성코드가 아니라 일반 자바스크립트 개발에서도 자신의 코드 구현을 감추고싶을 때 종종 사용되는 방법이다. 코드 난독화 역시 다형성과 마찬가지로 백신 프로그램의 탐지를 우회할 때 널리 이용된다. 난독화에 관해서는 string reversing, Unicode, Base64 인코딩, string splitting이나 DOM interaction 등의 수많은 기법들이 있다.


3. Code unfolding

코드 언폴딩(unfolding)은 기존에 존재하지 않던 코드가 run-time 상황에서 생성되도록 하는 메커니즘이다. 자바스크립트의 경우 document.write()와 eval() 등의 함수를 통해 난독화된 코드나 실행하는 방법으로 새로운 함수를 생성한뒤 바로 실행시킨다.


4. Heap spray

이 공격은 웹 브라우저를 표적으로 삼는다. 공격자가 원격 실행코드를 통해 희생자의 컴퓨터에 침투하여 메모리 영역의 취약한 부분에 접근하고, 힙을 손상시킬 수 있다.


5. Drive-by download

드라이브 바이 다운로드 공격은 사용자의 동의없이 악성 프로그램을 몰래 다운로드하고 실행 또는 설치하는 형태이다. 이러한 공격은 브라우저의 취약점, ActiveX 컨트롤 또는 Acrobat Reader 및 Adobe Flash Player와 같은 널리 사용되는 프로그램의 최신 보안업데이트가 패치되지 않았을 때 이를 악용하여 발생한다.


6. Multi execution paths

다중 실행 경로(Multi Execution Path)는 특수한 상태의 조건이 충족될 때에만 촉발되도록 하는 방식이다. 예를 들어 특정한 날짜가 도래하거나, 어떤 파일이 시스템에 생성되는 순간 악성코드가 이를 인지하고 활동을 개시하게 된다. 조금 더 향상된 케이스의 경우에는 봇넷에 연결된 노드의 갯수가 임계치를 상회할 때 공격을 퍼부어서 서비스 거부(Denial of Service)를 유발시키는 방법 등이 있다.


7. Implicit conditionals

이 기법은 주로 동적분석을 통한 탐지에서 활용된다. 핵심적인 아이디어는 해당 악성코드를 촉발시키는 선행조건을 의도적으로 숨기고 일련의 명령어 동작을 실행해보는 것이다.



이상에서 설명한 기법들과 전략들이 JavaScript 악성코드에서 일반적으로 발견되는 것들이다. 만약 이러한 종류의 악성코드를 탐지할 수 있는 방법을 연구하려면, 기본적으로 이러한 연구동향 정도는 파악하고 있어야할 듯 하다. 이를 방어하기 위한 수단에 대한 연구도 이어서 계속해야 할듯..

CPUU님의 창작활동을 응원하고 싶으세요?