I. 서론
일반적으로 컴퓨터 바이러스(Computer Virus)는 컴퓨터의 정상적인 사용환경을 방해하는 악성코드의 일종이다. 인터넷의 급성장과 더불어 컴퓨터 통신 이용률의 폭발적인 증가를 통해 이러한 컴퓨터 바이러스가 네트워크를 통해 감염되는 웜의 특징이 결합되어 웜바이러스의 형태로 발전되었다. 안철수연구소가 발간한 악성코드 연간 동향보고서에 따르면 악성코드 탐지 건수가 2005년도에 2만여건에서 2010년도에는 무려 2900만건으로 분석되었다[1]. 인터넷의 발달로 인한 악성코드의 전파력 증가 및 백신프로그램의 악성코드 탐지 성능 향상에 기인했다고 볼 수 있다.
악성코드수의 증가와 함께 최근에는 중요자료 및 통신데이터 보호 등의 목적으로 사용되는 암호기술이 발전하면서 Cryptovirus와 같이 암호기술을 역이용하는 악성코드가 등장하였다. 특히, 윈도우즈에서 사용중인 정상적인 CAPI(Crypto API)를 사용하여 악성코드의 행위를 암호화시켜 놓거나 감염된 PC에 보관된 개인파일 등을 암호화하기 때문에 백신프로그램에서는 악성코드로 분류하여 탐지하는데 한계가 있다. 게다가 암호화된 파일을 네트워크를 통해서 전송시키는 경우에는 IPS(Intrusion Prevention System) 등 정보보호시스템마저도 무용지물이 되고 만다.
본 논문에서는 Cryptovirus 뿐만 아니라 윈도우즈 CAPI를 이용한 악성코드의 행위를 감시할 수 있는 방안에 대해서 연구하고 이와 관련된 Hooking 도구를 직접 구현하여 테스트한 결과를 제시한다.
II. CAPI 사용 악성코드
2.1 Cryptovirus
1996년 Yung과 Young에 의해서 처음 소개된 개념으로 불법적인 접근을 방지하기 위한 방어개념의 암호기술을 악의적으로 바이러스에 이용하여 공격에도 활용될 수 있음을 제시하였다[2, 3]. 이와같이 암호기술을 이용한 바이러스를 일반적으로 Cryptovirus라 부르며 이에 대한 연구를 Cryptovirology라 한다. Cryptovirus의 구조는 다음 [그림 1]과 같다.
[그림 1] Cryptovirus 구조
Cryptovirus의 공격과정은 다음과 같이 4단계로 나타낼 수 있다[8].
· 1단계: 공격자는 공개키 암호 알고리즘을 사용하여 공개키와 개인키를 생성한 후, 공개키가 포함된 Cryptovirus를 배포한다.
· 2단계: 배포된 Cryptovirus가 피해자 PC에서 실행시 윈도우즈 CAPI를 이용하여 세션키(대칭키)를 생성한 후, 피해자 PC에 보관된 데이터를 세션키(대칭키)로 암호화한다. 1단계에서 생성한 Cryptovirus내 공개키를 이용하여 세션키(대칭키)를 암호화하고, 결과값을 공격자에게 전송한다. 이후 암호화된 데이터를 제외하고 피해자의 원본 데이터와 세션키(대칭키)는 삭제한다.
· 3단계: 공격자는 세션키(대칭키) 값을 알려주는 대가를 피해자에게 요구하고, 피해자가 이에 응할 경우 공격자가 1단계에서 생성한 개인키로 세션키(대칭키)를 복호화한다.
· 4단계: 피해자는 공격자가 전송해 준 세션키(대칭키)를 사용하여 암호화된 데이터를 복구한다.
[그림 2]는 Cryptovirus 단계별 공격과정을 도식화하여 나타낸 것이다.
[그림 2] Cryptovirus 공격 전체개요도
2.2 GPCODE
2005년 5월경 윈도우즈 탐색기의 취약점을 통해 감염되면 사용자 PC의 문서(XLS, DOC 등)나 그림파일(JPG 등)을 암호화하는 Virus.Win32.Gpcode.b 악성코드가 발견되었는데, 제작자는 악성코드와 함께 해독 프로그램을 구할려면 200달러를 요구하는 메시지가 담긴 ATTENTION!!!.txt[그림 3] 파일을 동시에 배포하였다[4]. 국내에서는 ‘인질범 바이러스’로 불리기도 하였다. 해외 특정사이트를 방문하면 감염이 되며, 감염시 증상은 XLS, TXT, ZIP 등을 암호화시켜 피해자는 자신의 PC에 보관된 문서파일 실행이 불가능하게 된다. 이후 ATTENTION!!!.txt 파일이 피해자 PC 곳곳에 자동으로 생성된다.
[그림 3] ATTENTION!!!.txt 파일 내용
Some files are coded.
To buy decoder mail: n{removed}@yahoo.com
with subject: PGPcoder 000000000032
2.3 Trojan.Zbot.B!inf
2010년 10월 1일 최초 보고된 이 악성코드는 Trojan.Zbot 악성코드의 업데이트 버전으로 확인되었으며, 이 악성코드는 윈도우즈 CAPI를 사용하여 악성코드를 다운로드할 URL을 생성하고 악성코드를 검증하는 용도로 사용되었다[5].
이외에도 윈도우즈 CAPI를 사용하면 목적에 따라 중요자료 절취, 피해 PC 시스템파일 손상 등 다양한 방법으로 활용이 가능하다.
III. CAPI 사용 악성코드 Hooking
CAPI 사용 악성코드는 문자열이나 파일 등을 암호화 또는 복호화하기 위해서 윈도우즈에서 제공하는 암호알고리즘을 사용해야 한다. 본 절에서는 API Hooking 기법을 통해 악성코드가 CAPI에서 제공하는 암호알고리즘, 암호키 등을 호출하는 시점을 감시하여 그 내용을 가로챌 수 있는 방안을 제시하기로 한다.
3.1 악성코드 여부 판별
윈도우즈 CAPI는 암호화 또는 복호화를 위해 각종 프로그램에서 많이 사용되고 있다. 예를 들어 인터넷 뱅킹 키보드 입력정보 암호화나 온라인 게임 아이템정보 암호화 등 인터넷통신이나 중요자료 보호 목적으로 사용되고 있다. 따라서 CAPI를 사용하는 프로그램에 대한 악성코드 여부 판별에 대한 방법은 본 논문에서 제외하기로 하고, CAPI를 사용하는 악성코드로 범위를 제한하여 API Hooking 방안을 제시한다.
3.2 API Hooking
윈도우즈 운영체제에서는 사용자 어플리케이션이 메모리, 파일, 네트워크, 비디오, 사운드 등 시스템 자원을 사용하고 싶을 때 직접적인 접근이 불가능하다. 왜냐하면 윈도우즈 운영체제에서 직접 관리를 하며 안정성, 보안, 효율성 등의 이유로 인해 사용자 어플리케이션의 직접적인 접근을 차단해 놓았기 때문이다. 그래서 사용자 어플리케이션은 Win32 API를 호출하여 시스템 커널에게 시스템 자원 사용을 요청한다.
API Hooking이란 사용자 어플리케이션이 요청한 Win32 API 호출을 중간에 가로채서 제어권을 얻어내는 기법이다[9]. 본 논문에서 소개한 CAPI를 사용하는 악성코드도 사용자 어플리케이션의 일부이기 때문에 API Hooking이 가능하다.
[그림 4]는 악성코드가 advapi32.dll에서 제공하는 각종함수를 정상적으로 호출하는 과정을 도식화한 것이다.
· CryptAcquireContext() : 암호알고리즘 호출 함수
· CryptImportKey() : Key 호출 함수
· CryptDecrypt() : 복호화 함수
[그림 4] 정상적인 API 호출
[그림 5]는 [그림 4]에서 설명한 정상적인 API 호출에 API Hooking 단계를 추가하여 악성코드가 사용하는 함수들을 CAPI Hooker가 중간에 가로채어 제어권을 확보한 후, 악성코드 세부행위를 파악할 수 있는 절차를 도식화한 것이다.
[그림 5] API Hooking
이처럼 API Hooking 기법을 이용하면 CAPI를 사용하는 악성코드가 사용중인 암호알고리즘, 암호키, 암호문 또는 평문 등을 확인할 수 있다.
3.3 CAPI 사용 악성코드 Hooking
소스코드를 이용하여 컴파일된 실행파일들은 바이너리 형태로 존재하기 때문에 소스코드가 공개되지 않고서는 확인이 불가능하다. 본 논문에서 소개한 CAPI를 사용하는 악성코드도 실행파일 형태로 존재한다. 즉, 악성코드가 사용하는 암호알고리즘, 암호키 등을 확인하기 위해 소스코드를 참고하는 것은 불가능하다.
대신에 윈도우즈에서 제공하는 CAPI를 사용하기 때문에 악성코드는 문자열이나 파일을 암호화 또는 복호화 할 때 CAPI에 정의된 함수를 반드시 사용하여야 한다. 악성코드가 CAPI 함수를 호출하는 시점에 API Hooking을 적용하고, 이에 대한 결과값을 추출하면 암호알고리즘, 암호키 등을 확인할 수 있다. 다음에서는 이에 대한 세부방법과 절차들을 제시하기로 한다.
① 암호알고리즘 Hooking
악성코드의 암호알고리즘 사용과정은 [그림 6]과 같이 암호알고리즘 등을 변수로 사용하여 CryptAquireContext() 함수를 호출한다. 호출시점에 API Hooking을 통해 이 함수의 제어권을 넘겨받아 실행시키면 악성코드가 사용하는 암호알고리즘을 확인할 수 있다.
[그림 6] CryptAcquireContext() 함수[8]
CryptAcquireContext(HCRYPTPROV *phProv,
LPCTSTR pszContainer, LPCTSTR pszProvider,
DWORD dwProvType, DWORD dwFlags);
② Key Hooking
악성코드가 암호화 및 복호화에 필요한 Key를 사용하기 위해서는 [그림 7]과 같이 CryptImportKey() 함수를 호출한다. 이때 암호알고리즘 Hooking과 동일한 방법을 사용하면 악성코드의 암호키를 확인할 수 있다.
[그림 7] CryptImportKey() 함수[8]
CryptImportKey(HCRYPTPROV hProv, BYTE *pbData, DWORD dwDataLen, HCRYPTKEY hPubKey, DWORD dwFlags, HCRYPTKEY *phKey);
③ 암호문 또는 평문 내용 Hooking
악성코드가 암호문, 평문을 복호화, 암호화 하기위해서는 [그림 8]과 같이 CryptEncrypt() 또는 CryptDecrypt() 함수를 호출한다. 이때 암호알고리즘 Hooking과 동일한 방법을 사용하면 암호문 또는 평문의 내용을 확인할 수 있다.
[그림 8] CryptEncrypt(), CryptDecrypt() 함수[8]
CryptEncrypt(HCRYPTKEY hKey,
HCRYPTHASH hHash, BOOL Final, DWORD dwFlags,BYTE *pbData, DWORD *pdwDataLen, DWORD dwBufLen);
CryptDecrypt(HCRYPTKEY hKey,
HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen);
IV. CAPI 사용 악성코드 Hooking 도구 구현
본 절에서는 앞서 설명한 CAPI 악성코드 행위에 대한 Hooking 기법을 직접 구현하여 테스트한 결과를 제시한다. 구현한 악성코드와 Hooking 도구는 Windows XP(Service Pack 3) 환경에서 Microsoft Visual C++ 6.0으로 제작하였다.
4.1 CAPI 악성코드 구현
이 소스코드는 본 논문의 연구목적을 보여주기 위해 직접 제작하였기 때문에 확인이 가능하고, 실제로 악성코드는 실행파일로 존재하기 때문에 소스코드 확인은 불가능하다. [그림 9]는 CAPI를 사용하는 악성코드의 소스코드 일부로써 RSA 알고리즘을 사용하여 개인키로 암호화된 문자열이 g_strEncrypt 변수로 정의되어 있다. 또한 악성코드 해독에 필요한 공개키가 Key[0x254] 변수로 정의되어 있다.
[그림 9] 악성코드 소스코드(암호문, Key값 정의)
또한 [그림 10]의 CAPI 악성코드의 소스코드에는 제 3절에서 설명한 CryptAcquireContext(), CryptImportKey(), CryptDecrypt() 함수가 정의되어 있다.
[그림 10] 악성코드 소스코드(CAPI 제공함수 적용)
[그림 11]은 CAPI 악성코드를 Build한 후, 실행파일로 만들어 실행한 화면을 캡쳐하였다. 실행화면에 표시된 “Test it" 버튼을 클릭하면, 악성코드는 내부에 정의된 암호화된 문자열을 복호화하는 작업을 수행한다. 이 과정에서 윈도우즈 CAPI 함수들을 호출한다. 악성코드가 복호화 작업을 수행하는 동한 API Hooking 도구를 이용하여 악성코드가 사용하는 암호알고리즘, 암호키 등을 확인할 수 있다.
[그림 11] CAPI 악성코드 실행화면
4.2 API Hooking
여기서는 API Hooking 도구를 직접 구현하여 앞서 제작한 악성코드가 동작하는 동안 CAPI를 호출하는 부분을 감시하는 과정을 보여주겠다. [그림 12]은 Hooking 도구의 소스코드 일부이다. CAPI 악성코드가 사용했던 암호알고리즘, 암호키, 암호문 등을 호출하는데 필요한 함수들을 마찬가지로 적용하여 함수 호출 시점에 Hooking을 하게 된다.
[그림 12] CAPI 악성코드 Hooking 도구(소스코드)
실제로 Hooking 도구를 실행한 상태에서 앞서 제작한 CAPI 악성코드를 실행한 후, “Test it !!" 버튼을 클릭하면 Hooking 도구에서는 [그림 13]과 같이 악성코드가 사용했던 암호알고리즘, 암호키, 암호화된 문자열의 복호화 결과값을 얻어 낼 수 있다.
[그림 13] CAPI 악성코드 Hooking 도구(실행결과)
V. 결론 및 향후방향
지금까지 API Hooking 기법을 통해서 CAPI를 사용하는 악성코드의 동작을 감시하는 방안과 이와 관련된 도구를 직접 구현하여 테스트한 결과를 제시하였다.
본 논문에서는 비록 암호키나 암호문이 악성코드에 포함된 경우에 대해서 테스트를 했지만, 그 반대의 경우에도 윈도우즈 CAPI를 사용한다면 Key값과 암호문은 변수로 입력이 되기 때문에 API Hooking을 통해서 악성코드의 행위에 대해서 충분히 확인이 가능하다.
향후 이 도구를 응용하면 RSA 뿐만 아니라, DES 등 여타 암호 알고리즘에 대해서도 구현이 가능할 것이다. 또한 윈도우즈에서 실행중인 모든 프로세스에 대해서 Crypto API 사용여부 감시 등 전역적으로 확대하는 도구 제작도 가능하다. 다만, 모든 프로세스를 감시하는 방안을 적용할 경우 제 3절에서 소개한 악성 코드 판별 여부에 대한 연구가 선행되어야 할 것이다.
또한 악성코드에 포함된 암호문 뿐만 아니라, XLS, DOC 등 문서파일 대상으로 수행되는 암호화에 대해서도 사전에 인지가 가능한 프로세스를 추가함으로써 개인자료 훼손 및 유출 등의 피해를 사전에 예방이 가능할 것으로 기대된다.
참고문헌
- http://www.ahnlab.com/kr/site/securit ycenter/asec/asecReportList.do
- A. Young, "Cryptoviral extortion using Microsoft's Crypto API", International Journal of Information Security, pp. 2-3, 2006년.
- 염용진, 배병철, "악성 프로그램의 진화", 정보통신산업진흥원 주간기술동향, 1244호, pp. 32-33,2006년 5월.
- http://articles.yuikee.com.hk/newslett er/2005/05/f.html
- http://www.symantec.com/connect/blo gs/how-trojanzbotbinf-uses-crypto-api, 2010.
- http://msdn.microsoft.com/en-us/libra ry/aa380255(v=vs.85).aspx
- http://www.reversecore.com/65
- A. Young, M. Yung, "An implementation of cryptoviral extortion using microsoft's crypto api", http://www.cryptovirology.com/ cryptovfiles/newbook/Chapter2.pdf, pp. 9-16, 2005
- Greg Hoglund, James Butler, 윤근용, 루트킷 윈도우 커널 조작의 미학, 제4장 전통적인 후킹기술, 에이콘, 2007.