악성코드 샘플은 많은 문자열 또는 바이너리 구분자를 포함할 수 있다. 고유 악성코드 샘플 또는 악성코드 군을 인식하면 악성코드 분류에 도움이 된다. 경우에 따라 악성코드를 일반적인 특성에 따라 분류하기도 하지만, 보통 바이너리에 나타나는 고유 문자열과 바이너리 구분자를 기준으로 악성코드를 분류한다.

YARA는 악성코드를 식별하고 분류하는 강력한 도구다. 악성코드 샘플에 포함된 텍스트 또는 바이너리 정보를 기반해 YARA 규칙을 생성할 수 있다. 이 규칙은 로직을 결정하는 문자열과 Boolean expression의 집합으로 구성된다. YARA 규칙을 작성하면 YARA 유틸리티 또는 yara-python 을 사용해 작성한 도구로 파일을 스캐닝할 때 해당 규칙을 이용할 수 있다.


YARA 규칙 기초

YARA 설치 완료 후에는 YARA 규칙을 생성한다. 이 규칙들은 일반적이거나 매우 구체적일 수 있으며, 일반 텍스트 편집기로 작성 가능하다. 다음은 파일에서 의심 문자열을 찾는 간단한 YARA 규칙이다.

rule suspicious_strings
{
strings:
	$a = "Synflooding"
	$b = "Portscanner"
	$c = "Keylogger"

condition:
	($a or $b or $c)
}

YARA 규칙은 다음 컴포넌트로 구성된다.

  • 규칙 식별자(rule identifier): 규칙을 설명하는 이름이다(위의 예에서의 suspicious_strings). 영문자, 숫자, 밑줄을 포함할 수 있지만, 첫 번째 문자로 숫자는 불가하다. 대소문자를 구분하고 128자를 초과할 수 없다.
  • 문자열 정의(string definition): 규칙의 일부인 문자열이 정의되는 섹션이고 규칙이 문자열에 의존하지 않을 경우 생략 가능하다. 각 문자열은 연속된 영문자, 숫자, 밑줄이 뒤따르는 a, c는 값을 포함하는 변수이다. 이 변수들은 조건 섹션에서 사용한다.
  • 조건 섹션(condition section): 규칙의 로직이 위치하는 곳이다. 규칙이 일치하거나 일치하지 않는 조건을 지정하는 Boolean experession을 포함해야 한다.

YARA 실행

규칙을 준비하면 다음 단계는 yara 유틸리티를 사용해 YARA 규칙에 따라 파일을 스캔하는 것이다. 앞선 예제에서 규칙은 의심 문자열 3개(b, $c)를 찾았으며, 조건에 따라 세 문자열 중 하나라도 파일에 존재하면 규칙에 일치했다. 규칙은 suspicious.yara 로 저장된 후 악성코드 샘플을 포함한 디렉토리를 대상으로 yara를 실행해 규칙에 일치하는 악성코드 샘플 2개를 반환했다.

$ yara -r suspicious.yara samples/
suspicious_strings samples//spybot.exe
suspicious_strings samples//wuamqr.exe

기본적으로 앞선 YARA 규칙은 ASCII 문자열을 매칭하고 대소문자를 구분해 매칭을 수행한다. ASCII와 유니코드 문자열을 탐지하는 규칙을 원한다면 문자열 옆에 ascii와 wide 수식어를 지정한다. nocase 수식어는 대소문자를 구분하지 않는 매칭을 실시한다.

rule suspicious_strings
{
strings:
	$a = "Synflooding" ascii wide nocase
	$b = "Portscanner" ascii wide nocase
	$c = "Keylogger" ascii wide nocase
condition:
	($a or $b or $c)
}

위 규칙을 실행하면 ASCII 문자열을 포함한 실행 파일 2개를 탐지하고, 유니코드 문자열을 포함한 문저 역시 찾아낸다.

$ yara suspicious_yara samples/
suspicious_strings samples//test.doc
suspicious_strings samples//spybot.exe
suspicious_strings samples//wuamqr.exe

앞선 규칙은 정의한 ASCII와 유니코드 문자열을 포함한 모든 파일을 찾아낸다. 탐지된 문서는 문서 내용에 해당 문자열을 포함한 정상 문서다. 실행파일에 국한해 문자열을 찾고자 한다면 다음과 같이 규칙을 작성할 수 있다. 다음 규칙에서 조건에 포함한 $mz at 0 은 YARA가 파일이 시작되는 곳에서 4D 5A 시그니처를 찾도록 지정한다. 이렇게 하면 PE 파일에 대해서만 시그니처가 동작한다. 텍스트 문자열은 큰 따옴표로 묶는 반면 16진수 문자열은 $mz 변수와 같이 중괄호로 묶는다.

rule suspicious_strings
{
strings:
	$mz = {4D 5A}
	$a = "Synflooding" ascii wide nocase
	$b = "Portscanner" ascii wide nocase
	$c = "Keylogger" ascii wide nocase
condition:
	($mz at 0) and ($a or $b or $c)
}

이제 실행 파일만 탐지한다.

$ yara suspicious_yara samples/
suspicious_strings samples//spybot.exe
suspicious_strings samples//wuamqr.exe

YARA의 애플리케이션

다음 YARA 규칙은 내장 마이크로소프트 오피스 문서를 포함한 실행 파일을 탐지한다. 이 규칙은 16진수 문자열이 파일의 1024바이트 이후의 오프셋에서 발견할 경우 동작하며, filesize는 파일의 끝을 의미한다.

rule embedded_office_document
{
meta:
description = "Detects embedded office document"

strings:
	$mz = { 4D 5A }
	$a = {D0 CF 11 E0 A1 B1 1A E1}
condition:
	($mz at 0) and $a in (1024.filesize)
}

위 YARA 규칙을 실행하면 내장 엑실 문서를 포함한 샘플만을 탐지한다.

$ yara -r embedded_doc.yara samples/
embedded_office_document samples//5340.exe

다음은 전자 인증서의 일련 번호를 사용하는 9002 RAT 라 불리는 악성코드 샘플을 탐지한다. RAT 9002 는 일련번호 45 6E 96 7A 81 5A A5 CB B9 9F B8 6A CA 8F 7F 69 를 사용하는 전자 인증서를 사용했다. 일련 번호는 동일한 전자 인증서를 사용하는 샘플을 탐지하는 시그니처로 사용할 수 있다.

rule mal_digital_cert_9002_rat
{
meta:
	description = "Detects malicious digital certificates used by RAT 9002"
	ref = "http://blog.cylance.com/another-9002-trojan-variant"

strings:
	$mz = { 4D 5A }
	$a = { 45 6e 96 7a 81 5a a5 cb b9 9f b8 6a ca 8f 7f 69 }

condition:
	($mz at 0) and ($a in (1024.filesize))
}

이 규칙을 실행하면 동일한 전자 인증서를 가진 모든 샘플을 탐지했으며, 이들 모두는 RAT 9002 샘플로 밝혀졌다.

yara -r digi_cert_9002.yara samples/
mal_digital_cert_9002_rat samples//ry.dll
mal_digital_cert_9002_rat samples//rat9002/Mshype.dll
mal_digital_cert_9002_rat samples//rat9002/bmp1f.exe