tool primarily used in malware research and detection
오늘의 주제는 YARA이다. 당장 이전 주제인 CTI에서도 CTI analyst가 갖춰야 할 소양 중 하나로 다뤘던 도구이며, 구름 프로그램에서도 지나가듯 몇번 접한 적 있다. 오늘은 이 YARA에 대해서 알아보고, YARA Rule에 대해서도 한번 본격적으로 공부해보려 한다.
YARA는 "Yet Another Ridiculous Acronym"의 약자로, 악성코드(멀웨어) 식별 및 분류를 위한 오픈소스 기반의 패턴 매칭 도구이다. 악성코드 분석가는 YARA를 통해 파일의 바이너리 혹은 텍스트 구조에서 특정 문자열, 바이너리 패턴, 조건 등을 탐지하는 규칙(YARA rule)을 정의함으로써, 알려진 악성코드의 시그니처를 찾아내거나 특정 행위 패턴을 기준으로 새로운 변종을 탐지할 수 있다.
YARA의 주요 목적은 다음과 같다:
악성코드 분류 및 탐지: 시그니처 기반의 룰을 사용하여 수천 개의 파일을 빠르게 스캔하고, 특정 조건을 만족하는 악성 샘플을 식별할 수 있다.
행위 기반 탐지: 단순히 해시 값 일치에 의존하지 않고, 공통된 문자열, 코드 구조, 명령어 시퀀스 등을 바탕으로 변종 악성코드도 탐지할 수 있도록 설계되어 있다.
악성코드 자동 분석 도구와 연계: YARA는 다양한 분석 플랫폼(Cuckoo Sandbox, VirusTotal, MISP 등)과 통합되어 위협 인텔리전스 분석과 대응에도 활용된다.
즉, YARA는 보안 분석가가 "어떤 파일이 어떤 조건을 만족하면 악성으로 간주된다" 는 논리를 직접 코드 형태로 작성하고, 그 룰을 수많은 샘플에 적용함으로써 자동화된 분석 체계를 구축하는 데 핵심적인 역할을 한다.
YARA는 2009년, 당시 멀웨어 분석가였던 Victor Alvarez (VirusTotal 소속) 에 의해 개발되었다. 당시의 악성코드 분석 현장에서는 샘플 수가 급증하고 있었고, 단순 해시 기반 탐지 방법이나 수동 분석으로는 변종 및 난독화된 악성코드를 판별하기 어려운 상황이었다.
YARA의 개발 배경은 다음과 같다:
YARA는 처음에는 단순 문자열 탐지 도구로 시작했지만, 이후 조건부 표현식, 정규표현식, 외부 모듈(PE, ELF 분석) 등 다양한 기능이 추가되며 전문 악성코드 분석 및 APT 탐지에까지 널리 사용되게 되었다. 현재는 VirusTotal, Google, FireEye, Kaspersky 등 유수의 보안 기업에서 내부 및 공개 룰셋을 사용하거나 배포하고 있다.
YARA는 단순한 악성코드 탐지 도구를 넘어, 보안 운영 전반에 걸쳐 광범위하게 활용되는 핵심 분석 도구로 자리 잡고 있다. 다음은 실무에서의 주요 활용 분야이다:
즉, YARA는 보안 대응, 위협 탐지, 자동화 시스템, 위협 인텔리전스 통합 등 다양한 분야에서 가볍고 효율적이며 확장 가능한 탐지 도구로 널리 활용되고 있으며, 사이버 위협에 선제적으로 대응하기 위한 필수 기술로 간주되고 있다.
YARA는 명시적이고 읽기 쉬운 룰 기반 언어를 제공하여, 사용자가 직접 악성코드 탐지 규칙을 작성하고 관리할 수 있도록 한다. YARA 룰은 본질적으로 하나의 규칙(rule) 안에 문자열, 메타정보, 탐지 조건을 포함하며, 간결한 문법으로 매우 유연한 탐지 로직 구성이 가능하다.
YARA 룰은 기본적으로 다음과 같은 구조를 따른다.
rule RuleName {
meta:
key1 = "value1"
key2 = "value2"
strings:
$a = "malicious_string"
$b = { 6A 40 68 00 30 00 00 }
condition:
$a or $b
}
YARA 룰은 항상 rule
키워드로 시작하며, 규칙 이름을 지정한 후 중괄호 {}
내부에 meta, strings, condition 세 섹션이 위치한다. 각 요소는 선택적으로 생략 가능하지만, condition
섹션은 필수이다.
rule
이름_
사용 가능. 숫자로 시작하거나 공백은 불가.rule apt_phishing_2023
meta:
섹션meta:
author = "student_researcher"
description = "Detects phishing campaign using specific string patterns"
date = "2024-02-14"
reference = "https://example.com/threat/phish"
tags
rule
선언과 함께 공백으로 나열한다.rule ransom_family_A : ransomware malicious {
...
}
strings:
섹션은 룰이 탐지할 대상 문자열을 정의하는 공간이다. 문자열은 반드시 식별자(예: $a
, $name
, $code
)로 시작한다.
$a = "This program cannot be run"
ascii
, wide
, nocase
등의 옵션 지정 가능.$b = "malicious" nocase wide
$c = { 6A 40 68 ?? ?? 00 00 }
??
는 와일드카드 바이트(아무 값이나 허용).$d = /[A-Z]{4}-\d{3}/
/
)로 감싸야 하며, Perl 스타일 regex 사용.nocase
, fullword
같은 플래그를 붙일 수 있음.$e = /cmd\.exe/i
condition:
섹션은 룰이 어떤 조건에서 탐지를 수행할 것인지를 지정한다. 이 섹션은 룰 실행의 핵심으로, 반드시 존재해야 한다.
YARA는 C 스타일의 논리 연산자와 제어 구조를 지원한다:
and
, or
, not
==
, !=
, >
, <
, >=
, <=
$a or $b
all of them
any of ($a, $b, $c)
$a at entrypoint
$a in (0..100)
#b > 5 // $b가 파일 내에 5번 이상 등장할 때
condition:
filesize < 1MB and (any of ($a, $b, $c)) and not $d
$dns = /(?:[a-z0-9-]+\.)+(com|net|org)/
$code = { 55 8B EC ?? ?? 8B 45 ?? }
[]
를 사용하여 바이트 집합 정의 가능$a = { 6A [2-4] 68 00 30 00 00 }
[-]
는 바이트 수 간격을 허용 (슬라이딩 윈도우처럼 사용)$b = { E8 ?? ?? ?? ?? [4-20] 90 90 }
condition:
($a and #b > 10) or ($c and filesize < 500KB)
아래는 악성코드에 흔히 포함된 문자열을 기반으로 탐지하는 YARA 룰의 기본적인 형태다.
rule simple_malware_signature
{
meta:
author = "student_analyst"
description = "Detects basic malware by known string"
date = "2025-04-19"
strings:
$a = "This program cannot be run in DOS mode"
$b = "cmd.exe"
$c = "powershell -nop -w hidden"
condition:
1 of ($a, $b, $c)
}
$a
, $b
, $c
: 악성코드에서 자주 발견되는 문자열1 of (...)
: 정의된 문자열 중 하나 이상 발견되면 탐지이 구조는 빠르게 룰을 테스트하거나 특정한 정황을 식별할 때 유용하다.
단순 문자열 외에도 Hex 문자열과 정규표현식을 적극 활용하는 것이 중요하다. 이는 탐지 우회를 시도하는 변형 샘플에 대응하는 데 효과적이다.
rule shellcode_pattern
{
strings:
$a = { 6A 40 68 ?? ?? 00 00 6A 14 8D 91 }
condition:
$a
}
??
: 와일드카드로서 가변 값을 허용rule suspicious_domains
{
strings:
$dom = /[a-z]{5,10}\.duckdns\.org/
condition:
$dom
}
rule wide_and_case_insensitive
{
strings:
$cmd = "powershell" wide nocase
condition:
$cmd
}
wide
: UTF-16 문자열까지 탐지nocase
: 대소문자 무시YARA 룰이 정확해야 실무에서 사용 가능하다. 특히 오탐(False Positive) 을 방지하기 위한 전략이 필수적이다.
rule accurate_detection
{
strings:
$a = "cmd.exe"
$b = "powershell"
$c = "Invoke-Expression"
condition:
all of ($a, $b, $c)
}
rule filter_by_size
{
strings:
$a = "UPX0"
condition:
filesize < 500KB and $a
}
filesize
조건을 통해 일반 실행파일 범위를 좁힘rule pe_entrypoint_pattern
{
strings:
$a = { 55 8B EC 83 EC ?? }
condition:
$a at entrypoint
}
at entrypoint
: 실행 시작 지점에서만 탐지하여 정확도 향상파일 포맷에 대한 이해는 정교한 룰 작성에 핵심적이다. YARA는 pe
, elf
, mach_o
등의 모듈을 통해 실행파일의 내부 구조를 조건으로 활용할 수 있다.
import "pe"
rule packed_pe_file
{
condition:
pe.number_of_sections > 5 and
pe.sections[1].entropy > 7.0
}
import "pe"
rule suspicious_resource
{
condition:
pe.has_resource and pe.resources[0].language == 0x409
}
논리 연산자는 탐지 정밀도와 유연성을 극대화한다. YARA는 and
, or
, not
뿐만 아니라 any of
, all of
, none of
구문도 지원한다.
rule complex_condition
{
strings:
$a1 = "cmd.exe"
$a2 = "powershell"
$b1 = { 68 ?? ?? 00 00 6A }
condition:
(any of ($a*)) and $b1 and not $a2
}
$a*
: $a1
, $a2
를 모두 포함하는 와일드카드 표현not $a2
: 특정 조건 제외rule runtime_loader
{
strings:
$import = "LoadLibraryA"
$getproc = "GetProcAddress"
condition:
pe.imports("kernel32.dll", "LoadLibraryA") and
$import and $getproc
}
pe.imports()
함수는 특정 DLL과 함수의 존재 여부를 검사YARA는 다양한 운영체제에서 활용 가능한 유연한 도구이며, 명령줄에서 직접 실행하거나 Python과 연동하여 자동화된 분석 도구로 활용할 수 있다. 본 장에서는 YARA의 설치부터 명령줄 인터페이스 사용법, Python 통합, 그리고 실제 악성코드 샘플을 대상으로 한 분석 예시까지 전반적인 실무 환경 구성 방법을 다룬다.
YARA는 오픈소스로 GitHub([https://github.com/VirusTotal/yara)](https://github.com/VirusTotal/yara\) 에서 소스를 제공하며, 대부분의 플랫폼에서 컴파일 또는 패키지 설치 방식으로 이용할 수 있다.
sudo apt update
sudo apt install yara
또는 최신 버전이 필요할 경우, 소스 컴파일을 진행
git clone https://github.com/VirusTotal/yara.git
cd yara
./bootstrap.sh
./configure
make
sudo make install
choco install yara
yara.exe
실행Homebrew
패키지 매니저를 통해 간편하게 설치할 수 있다.brew install yara
설치 후에는 yara
명령어를 통해 룰을 적용하여 파일 또는 디렉토리를 분석할 수 있다.
yara [options] rule_file target_file
옵션 | 설명 |
---|---|
-r | 디렉토리 전체를 재귀적으로 스캔 |
-d var=value | 룰 내 변수 값을 외부에서 정의 |
-s | 문자열 매칭 상세 정보 출력 |
-w | 일치한 룰만 요약 출력 (무출력 시 탐지 없음) |
-g | 문자열의 일치 오프셋 표시 |
-f | 실행을 멈추지 않고 오류 무시 |
yara -r -s malware_rules.yar /home/user/suspicious_files/
이 명령은 malware_rules.yar
에 정의된 룰을 이용해 지정된 디렉토리의 모든 파일을 재귀적으로 검사하며, 문자열 매칭 정보를 함께 출력한다.
yara-python
모듈)YARA는 Python과의 연동을 공식적으로 지원하며, 이를 통해 자동화된 악성코드 분석이나 정적 분석 파이프라인을 구성할 수 있다.
pip install yara-python
import yara
rules = yara.compile(filepath='example_rule.yar')
matches = rules.match('/path/to/target/file.exe')
for match in matches:
print(f"[+] Detected rule: {match.rule}")
for s in match.strings:
print(f" Offset: {s[0]}, Identifier: {s[1]}, Data: {s[2]}")
이 코드는 특정 YARA 룰을 로드한 후 지정된 파일에서 탐지를 수행하고, 일치한 문자열의 위치와 내용을 출력한다.
rule_text = """
rule dummy_rule {
strings:
$a = "test"
condition:
$a
}
"""
rules = yara.compile(source=rule_text)
이번엔 실제로 의심스러운 실행 파일을 대상으로 YARA 분석을 수행하는 과정이다.
sample.exe
파일 내부에 "cmd.exe"
, "powershell"
, "LoadLibraryA"
문자열이 존재하는 경우 탐지하는 룰을 작성해보자.
rule detect_exec_payload
{
strings:
$cmd = "cmd.exe"
$ps = "powershell"
$lib = "LoadLibraryA"
condition:
2 of ($cmd, $ps, $lib)
}
yara detect_exec_payload.yar sample.exe
sample.exe
내의 조건과 일치함을 의미detect_exec_payload sample.exe
yara -s -g detect_exec_payload.yar sample.exe
detect_exec_payload [sample.exe]
0x4020:$cmd: cmd.exe
0x50b0:$ps: powershell
import yara
rule_text = """
rule simple_check {
strings:
$s1 = "system"
$s2 = "administrator"
condition:
any of them
}
"""
rules = yara.compile(source=rule_text)
result = rules.match('/home/user/suspicious.exe')
if result:
print("Suspicious pattern found!")
else:
print("No match.")
이 스크립트는 CI 파이프라인, 이메일 첨부 파일 분석기 등에 자동 연동이 가능하다.
지금까지 살펴본 바, YARA는 단순한 문자열 매칭 도구를 넘어, 사이버 위협 분석, 악성코드 식별, 그리고 침해지표(IOC) 확산에 있어 핵심적인 역할을 수행하는 정적 분석 도구이다. 본 장에서는 실제 보안 실무에서 YARA가 어떻게 활용되는지를 중심으로, 다양한 분석 대상과 연동 환경에서의 적용 사례를 구체적으로 설명한다.
YARA는 특정 악성코드 패밀리의 고유한 문자열, 함수명, 코드 구조를 식별해 동일 계열의 변종을 탐지하는 데에 강력하게 활용된다.
악성코드 분석을 통해 공통적으로 발견되는 API 호출(CreateRemoteThread
, VirtualAllocEx
, URLDownloadToFileW
등), 암호화 키, C2 주소 문자열 등을 기반으로 룰을 정의.
예를 들어, Emotet 악성코드의 경우 DLL 내부에 존재하는 고유한 section name
, RC4 키 문자열, 또는 메타데이터 등을 기반으로 탐지 가능.
rule emotet_detection
{
meta:
author = "analyst_name"
family = "Emotet"
strings:
$s1 = "Software\\Microsoft\\Windows\\CurrentVersion\\Run"
$s2 = { 68 ?? ?? ?? ?? E8 ?? ?? ?? ?? 83 C4 04 } // API call pattern
$s3 = "emotet_module"
condition:
1 of ($s*) and filesize < 500KB
}
YARA는 전통적인 IOC 중심 탐지를 넘어, MITRE ATT&CK 기반의 Tactics, Techniques, Procedures (TTP) 탐지에도 사용된다.
특정 APT 그룹이 사용하는 악성 도구, 또는 침투 시 사용되는 PowerShell 스크립트, 웹셸 패턴 등을 룰로 정의.
예: APT28의 Sednit
툴셋에 포함된 Dropper는 고정된 RC4 암호화 키를 사용하며, 특정 PE 섹션 이름을 통해 탐지 가능.
rule apt28_sednit_dropper
{
strings:
$rc4_key = { 89 45 FC 8B 45 FC 83 EC 04 }
$section = "SEDB"
condition:
$rc4_key and $section
}
T1059 (Command and Scripting Interpreter), T1027 (Obfuscated Files or Information) 등 특정 기법에 대한 룰 작성이 가능.
이는 EDR과 결합하여 행위 기반 탐지에서 정적 정황 보강 수단으로 활용된다.
보안 실무에서 YARA는 악성 이메일 첨부파일(특히 Office 문서, PDF, JS/HTA 파일 등) 분석에 광범위하게 사용된다.
autoopen
, Shell.Application
, CreateObject
등 VBA에서 자주 사용되는 악성 API 호출 문자열을 기반으로 룰을 작성한다.rule office_macro_malware
{
strings:
$a = "CreateObject"
$b = "Shell.Application"
$c = "autoopen"
condition:
any of ($a, $b, $c) and filesize < 2MB
}
WScript.Shell
, run
, XMLHttpRequest
)을 대상으로 룰을 구성한다.YARA는 위협 인텔리전스 생태계에서 중심적인 역할을 하며, 특히 대규모 악성코드 저장소 및 위협 피드와의 연계를 통해 위력을 발휘한다.
rule vt_retro_example {
strings:
$s1 = "powershell -enc"
condition:
$s1
}
자동화된 YARA 룰 생성을 지원하는 도구는 일반적으로 악성코드 샘플 분석을 통해 고유 패턴을 추출하고 이를 기반으로 YARA 문법에 맞는 룰을 자동 생성해주는 기능을 수행한다. 대표적인 도구는 다음과 같다:
yarGen
imphash
, ssdeep
등 해시 기반 조건도 포함 가능.python yarGen.py -m /malware/samples/ -o generated_rules.yar
yarGen
은 SIGMA
, PEStudio
, VirusTotal
, NSRL
DB와의 통합도 지원한다.YaraMate
/ YARASignator
Sigma는 SIEM을 위한 탐지 규칙의 표준화된 YAML 포맷이다. 이를 통해 다양한 보안 로그를 구조화하고, 다양한 포맷(Splunk, ELK, QRadar 등)으로 변환할 수 있다. Sigma는 YARA로의 변환도 가능하다.
sigmac
sigmac
는 Sigma 룰을 다양한 백엔드 포맷으로 변환해주는 도구.sigmac -t yara path/to/sigma_rule.yml > output_rule.yar
condition
)을 조정해야 더욱 정밀한 룰이 된다.CTI 및 악성코드 관리 플랫폼과의 연계는 룰의 지속적 확장과 최신 위협 반영에 효과적이다.
# MISP API 사용 예시 (YARA 추출)
https://<misp-instance>/events/restSearch/download/yara/eventid:<event_id>
viper > open <sample>
viper sample > yara --generate
분석 중인 샘플에서 고유한 문자열, 섹션 이름, 컴파일 타임 등을 기반으로 자동 룰 생성 가능.
YARA 룰은 개별적으로 활용할 수도 있지만, 실무에서는 수천 개의 룰셋을 지속적으로 관리하고 최적화해야 한다. 이에 따라 다음과 같은 관리 전략이 필요하다.
목적별로 룰을 카테고리화:
malware_families/
apt_groups/
packer_detect/
document_exploits/
Git을 기반으로 룰 버전 관리 수행.
유명 공개 저장소(Florian Roth’s signature base, rules from CERT-PL 등)와 로컬 저장소를 구분하여 운영.
yarac
를 사용한 룰 컴파일로 문법 오류 사전 점검:yarac all_rules.yar compiled_rules.yarc
condition
문에서 any of ($s*)
를 남용할 경우 검사 속도 저하 가능.--fast-scan
등 최적화 옵션 적용 고려.cron
이나 CI/CD 파이프라인을 통해:
yarac
로 컴파일 후 탐지 엔진에 반영내부 룰 작성자들의 기여를 위한 리뷰/PR 체계 마련 필요
YARA는 단순한 문자열 기반 탐지를 넘어, 정형화된 바이너리 분석, 행위 기반 조건 구성, 그리고 외부 분석 도구와의 연동을 통해 매우 유연하고 강력한 규칙 기반 탐지 플랫폼으로 발전해왔다. 이번에는 외부 모듈(import)을 통한 확장 기능과, 특정 실행 파일 포맷에 특화된 분석 모듈, 그리고 최신 버전에서 제공되는 고급 기능(YARA-X 포함)에 대해 상세히 알아보자.
YARA는 특정 파일 포맷이나 기능에 대한 고급 분석을 위해 외부 모듈(External Modules)을 import
지시어를 통해 활용할 수 있다. 이는 rule 내에서 일반 문자열 탐지를 넘어 다양한 메타데이터 기반 조건을 구성할 수 있게 해준다.
import "pe"
rule check_packer {
condition:
pe.number_of_sections > 5 and
pe.overlay.offset > 0
}
모듈 이름 | 설명 |
---|---|
pe | PE(Portable Executable) 형식 분석 |
elf | ELF(Executable and Linkable Format) 형식 분석 |
cuckoo | Cuckoo 샌드박스 동적 분석 결과 활용 |
math | 수학 함수 제공 (e.g., 평균값, 분산 등) |
hash | MD5, SHA1, SHA256 등 해시 계산 |
dex | Android DEX 파일 분석 |
dotnet | .NET 메타데이터 분석 |
cuckoo
, dotnet
등)은 기본 빌드에는 포함되지 않으며 수동 컴파일 또는 특정 패키지 설치가 요구된다.pe
모듈PE 모듈은 Windows 실행 파일 구조를 기반으로 탐지 조건을 구성할 수 있도록 한다. 주요 필드는 다음과 같다:
pe.sections[n].name
, pe.sections[n].entropy
, pe.sections[n].size
pe.number_of_sections
, pe.imports("KERNEL32.dll", "CreateFileA")
pe.overlay.offset
, pe.signature
예시: 패커 사용 여부 탐지
import "pe"
rule packed_file {
condition:
pe.sections[0].entropy > 7.0 or
pe.overlay.offset > 0
}
elf
모듈ELF 모듈은 Linux/Unix 시스템에서 사용되는 ELF 바이너리를 분석한다. 제공 기능은 다음과 같다:
elf.segments[n].type
, elf.sections[n].name
, elf.machine
elf.entry_point
, elf.is_64
예시: 64비트 ELF 실행 파일 탐지
import "elf"
rule detect_64bit_elf {
condition:
elf.is_64 and elf.entry_point > 0x400000
}
cuckoo
모듈Cuckoo는 동적 분석 시스템으로, YARA는 해당 분석 결과를 조건으로 사용할 수 있다.
import "cuckoo"
rule keylogger_behavior {
condition:
cuckoo.network.http.count > 10 and
cuckoo.behavior.api("GetAsyncKeyState")
}
YARA-X는 2023년 발표된 차세대 YARA 구현체로, Rust 기반으로 개발되었으며 속도, 안정성, 확장성에서 기존 Python-C 기반 YARA보다 뛰어난 성능을 보인다. 또한 YARA 4.x 버전에서도 많은 고급 기능이 도입되었다.
yara-x rule.yar /path/to/samples/
for ... of ...
표현의 향상된 범위 지정pe.sections[i]
)rule complex_check {
strings:
$a = "This program cannot be run"
$b = { E8 ?? ?? ?? ?? 83 C4 04 }
condition:
$a at entrypoint + 100 and
for any i in (0..pe.number_of_sections - 1) :
( pe.sections[i].name == ".text" and pe.sections[i].entropy > 6.5 )
}
YARA 기반 탐지에서 가장 빈번하게 직면하는 문제는 오탐(False Positive) 및 누락(False Negative) 이다. 탐지율을 높이려다 보면 무해한 파일도 악성으로 판단하게 되고, 반대로 너무 엄격하게 조건을 구성하면 악성코드를 놓칠 수 있다. 이러한 문제는 탐지 룰셋의 신뢰성과 실용성을 직접적으로 좌우하며, 보안 운영 환경에서의 실효성 확보에 있어 반드시 해결해야 할 핵심 과제이다.
YARA 룰의 탐지력을 객관적으로 평가하기 위해서는 실제 또는 유사 환경에서 다음과 같은 절차로 테스트를 수행해야 한다.
유형 | 설명 |
---|---|
악성 샘플(Malicious) | 실제 수집된 악성코드 바이너리 (ex. VirusShare, MalwareBazaar 등) |
정상 샘플(Benign) | 운영체제 파일, 상용 프로그램, 오픈소스 바이너리 등 |
회피 샘플(Evasive) | 코드 난독화, 패커 등으로 위장된 악성코드 |
Tip: 샘플을 분류할 때, 확실한 레이블링(ground truth)을 확보한 데이터셋을 활용해야 한다. 가능하다면 VirusTotal이나 샌드박스 분석 결과 기반의 정량 평가가 바람직하다.
지표 | 계산 방법 | 의미 |
---|---|---|
TP (True Positive) | 악성 샘플을 정확히 탐지한 수 | 탐지 성공 |
FP (False Positive) | 정상 샘플을 악성으로 잘못 탐지한 수 | 오탐 |
TN (True Negative) | 정상 샘플을 정상으로 판단한 수 | 탐지 회피 성공 |
FN (False Negative) | 악성 샘플을 탐지하지 못한 수 | 탐지 누락 |
오탐은 실무에서 가장 빈번하고 치명적인 문제다. 오탐률이 높으면 보안팀의 피로도 증가, 자동 대응 시스템의 오류, 정상 파일 차단 등 운영 장애로 이어질 수 있다.
원인 | 설명 |
---|---|
너무 일반적인 문자열 | 단순 API 호출, 자주 쓰이는 문자열 ("This program cannot be run" , "WinExec" ) |
상용 소프트웨어 패턴과 유사 | Visual Studio, UPX, InstallShield 등도 악성코드와 유사한 구조 가짐 |
정규식/HEX 표현의 과도한 범용성 | 너무 넓은 범위로 설정된 패턴 ({ 6A ?? 68 ?? ?? ?? ?? E8 } ) |
루틴 메타정보 기반 탐지 | 타깃 악성코드의 컴파일러/링커 정보가 정식 툴체인과 동일할 수 있음 |
string $a = "winexec"
→ $a at entrypoint + 200
룰셋은 단일 룰의 조합이 아니라, 전체 구성의 상호 보완성, 효율성, 유지보수 용이성까지 고려되어야 한다. 다음은 실질적인 품질 향상 방안이다.
yara --syntax-check rules/
for f in samples/malicious/*; do
yara rules/index.yar "$f" >> result.log
done
도구 | 역할 |
---|---|
yarGen | 악성코드 샘플에서 자동 룰 추출 |
yarAnalyzer | 룰셋 내 중복, 무효, 충돌 조건 탐지 |
vigrid | YARA 룰의 검증 자동화 및 결과 리포팅 지원 도구 |
YARA는 고도로 유연한 탐지 엔진인 만큼, 정교하고 실전에서 검증된 룰셋을 활용하는 것이 분석의 정확도와 효율성을 크게 높이는 핵심이다. 실무에서는 개별 보안팀이 자체 룰을 작성하기보다는, 공개된 룰셋을 기반으로 커스터마이징하거나, 신뢰도 높은 소스의 룰을 참고하여 악성코드 탐지 체계를 수립하는 경우가 많다고 한다.
Florian Roth는 실전 위협 인텔리전스와 악성코드 탐지 분야에서 가장 활발히 활동 중인 보안 전문가 중 한 명으로, Sigma
, yarGen
, Loki
, Thor
등의 탐지 도구 개발자로도 유명하다.
yara/
디렉토리 하위에 수천 개의 .yar
파일이 존재하며, APT
, RAT
, Ransomware
, Tool
, Webshell
, Document Exploit
등으로 분류됨.# 저장소 전체 클론
git clone https://github.com/Neo23x0/signature-base.git
cd signature-base/yara/
# 특정 디렉토리 전체 탐지
yara -r index.yar /path/to/scan/
meta
와 description
, reference
필드가 잘 정리되어 있어 관리가 편리함yarGen
을 통해 자동 생성된 룰 외에도 핸드메이드 고급 룰이 다수 포함보안 벤더 및 인텔리전스 기업들도 자사 분석 리포트와 함께 YARA 룰을 공개하는 경우가 있다. 다음은 자주 인용되는 주요 출처다.
벤더/기관 | 특징 |
---|---|
Cisco Talos | Threat Advisory와 함께 제공되는 정제된 룰셋 |
CrowdStrike | 블로그 및 리포트 내에서 공격자별 탐지 룰 공유 |
Kaspersky GReAT | 특정 악성코드 캠페인에 대한 YARA 룰 공개 (APT, Bootkit 등) |
CERT Polska | 구조 기반 정밀 룰을 포함한 GitHub 저장소 운영 |
Tips: 이들 룰은 즉시 사용보다는 참고용으로 활용되며, 환경에 맞게 조건을 수정하거나 샘플 분석 후 커스터마이징하여 적용하는 것이 일반적이다.
많은 연구자, 기관, 오픈소스 커뮤니티들이 GitHub를 통해 YARA 룰셋을 공유하고 있으며, 실무에서 매우 유용한 참고 자료가 된다. 다음은 대표적인 GitHub 기반 저장소 목록이다.
YARA-Rules
프로젝트 (community 기반)TheHive-Project/yara
TheHive
및 Cortex
분석 환경과 함께 사용할 수 있는 룰셋 제공저장소 | 설명 |
---|---|
Sentinel-One/yara-toolkit | 정규식 및 문자열 추출 자동화 도구 포함 |
rule-hub | 다양한 기여자들이 업로드한 범용 룰셋 모음 |
stvemillertime/malware_yara_rules | 학습용으로 구성된 다양한 예제 룰 |
집안일이 겹쳐 다소 일정이 늘어진 것도 있지만, 새로이 공부할 것들이 굉장히 많아 조사, 정리에 시간을 엄청 써버린 주제였다. Daily CS 최초로 3일에 걸쳐서 작성한 글인데, 솔직히 말하자면 아직도 완벽히 학습했다고 보기 힘든 것 같다. 아무래도 조만간 악성코드 분석 프로젝트에 겸해서 YARA Rule을 활용해볼 수 있는 활동을 조금 넣어봐야겠다.