Daily CS) YARA

goldenGlow_21·2025년 4월 23일
0

Daily CS

목록 보기
44/50

YARA

tool primarily used in malware research and detection

오늘의 주제는 YARA이다. 당장 이전 주제인 CTI에서도 CTI analyst가 갖춰야 할 소양 중 하나로 다뤘던 도구이며, 구름 프로그램에서도 지나가듯 몇번 접한 적 있다. 오늘은 이 YARA에 대해서 알아보고, YARA Rule에 대해서도 한번 본격적으로 공부해보려 한다.


1. YARA란 무엇인가

1.1 YARA의 정의와 목적

YARA는 "Yet Another Ridiculous Acronym"의 약자로, 악성코드(멀웨어) 식별 및 분류를 위한 오픈소스 기반의 패턴 매칭 도구이다. 악성코드 분석가는 YARA를 통해 파일의 바이너리 혹은 텍스트 구조에서 특정 문자열, 바이너리 패턴, 조건 등을 탐지하는 규칙(YARA rule)을 정의함으로써, 알려진 악성코드의 시그니처를 찾아내거나 특정 행위 패턴을 기준으로 새로운 변종을 탐지할 수 있다.

YARA의 주요 목적은 다음과 같다:

  1. 악성코드 분류 및 탐지: 시그니처 기반의 룰을 사용하여 수천 개의 파일을 빠르게 스캔하고, 특정 조건을 만족하는 악성 샘플을 식별할 수 있다.

  2. 행위 기반 탐지: 단순히 해시 값 일치에 의존하지 않고, 공통된 문자열, 코드 구조, 명령어 시퀀스 등을 바탕으로 변종 악성코드도 탐지할 수 있도록 설계되어 있다.

  3. 악성코드 자동 분석 도구와 연계: YARA는 다양한 분석 플랫폼(Cuckoo Sandbox, VirusTotal, MISP 등)과 통합되어 위협 인텔리전스 분석과 대응에도 활용된다.

즉, YARA는 보안 분석가가 "어떤 파일이 어떤 조건을 만족하면 악성으로 간주된다" 는 논리를 직접 코드 형태로 작성하고, 그 룰을 수많은 샘플에 적용함으로써 자동화된 분석 체계를 구축하는 데 핵심적인 역할을 한다.

1.2 YARA의 역사와 개발 배경

YARA는 2009년, 당시 멀웨어 분석가였던 Victor Alvarez (VirusTotal 소속) 에 의해 개발되었다. 당시의 악성코드 분석 현장에서는 샘플 수가 급증하고 있었고, 단순 해시 기반 탐지 방법이나 수동 분석으로는 변종 및 난독화된 악성코드를 판별하기 어려운 상황이었다.

YARA의 개발 배경은 다음과 같다:

  • 기존 안티바이러스 엔진의 폐쇄성과 탐지 한계 극복
  • 파일 내부의 구조와 특징을 분석하고 식별하는 능동적인 탐지 기술의 필요
  • 분석가가 직접 룰을 작성하고 공유함으로써 공동 지식 체계를 구축할 수 있는 방식

YARA는 처음에는 단순 문자열 탐지 도구로 시작했지만, 이후 조건부 표현식, 정규표현식, 외부 모듈(PE, ELF 분석) 등 다양한 기능이 추가되며 전문 악성코드 분석 및 APT 탐지에까지 널리 사용되게 되었다. 현재는 VirusTotal, Google, FireEye, Kaspersky 등 유수의 보안 기업에서 내부 및 공개 룰셋을 사용하거나 배포하고 있다.

1.3 주요 활용 분야 및 보안 실무에서의 위치

YARA는 단순한 악성코드 탐지 도구를 넘어, 보안 운영 전반에 걸쳐 광범위하게 활용되는 핵심 분석 도구로 자리 잡고 있다. 다음은 실무에서의 주요 활용 분야이다:

1) 악성코드 사후 분석(Post-Incident Analysis)

  • 디지털 포렌식 과정에서 확보된 파일들의 악성 여부를 신속하게 판단하기 위해 YARA 룰을 적용한다.
  • 특히 APT 그룹의 시그니처나 C2 패턴 등 고유 문자열이 포함된 YARA 룰은, 침해 범위를 좁히고 IOC를 도출하는 데 유용하다.

2) 멀웨어 연구 및 분류 체계 구축

  • 바이러스 연구소나 CERT 팀에서는 수천 개의 샘플을 분석해 악성코드 계열을 분류하고 각 패밀리별로 YARA 룰을 만든다.
  • 이를 통해 지속적으로 업데이트되는 악성코드의 변종도 실시간 대응이 가능하다.

3) 위협 인텔리전스 연계 및 자동 탐지 시스템

  • SIEM, EDR, SOAR 등의 자동화된 보안 시스템에서 YARA 룰을 사용해 의심 파일을 실시간 탐지한다.
  • MISP, ThreatFox 등 위협 인텔리전스 플랫폼에서 공개된 룰을 받아 분석 환경에 적용할 수 있다.

4) 보안 훈련 및 교육

  • 악성코드 분석 입문자나 사이버 보안 트레이닝에서도 YARA는 기본 툴로 사용된다.
  • 실제 악성 샘플을 기반으로 룰을 작성하고 테스트하는 과정을 통해 악성코드의 동작 원리를 실무적으로 이해할 수 있다.

즉, YARA는 보안 대응, 위협 탐지, 자동화 시스템, 위협 인텔리전스 통합 등 다양한 분야에서 가볍고 효율적이며 확장 가능한 탐지 도구로 널리 활용되고 있으며, 사이버 위협에 선제적으로 대응하기 위한 필수 기술로 간주되고 있다.


2. YARA Rule의 구조와 구성 요소

YARA는 명시적이고 읽기 쉬운 룰 기반 언어를 제공하여, 사용자가 직접 악성코드 탐지 규칙을 작성하고 관리할 수 있도록 한다. YARA 룰은 본질적으로 하나의 규칙(rule) 안에 문자열, 메타정보, 탐지 조건을 포함하며, 간결한 문법으로 매우 유연한 탐지 로직 구성이 가능하다.

2.1 기본 문법 개요

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 섹션은 필수이다.

2.2 Rule 헤더: rule 이름, meta, tags

1) rule 이름

  • 규칙의 고유 식별자 역할.
  • 알파벳, 숫자, _ 사용 가능. 숫자로 시작하거나 공백은 불가.
  • 예: rule apt_phishing_2023

2) meta: 섹션

  • 룰에 대한 부가 정보를 설명하는 키-값 쌍.
  • 탐지에는 영향을 주지 않지만 문서화, 분류, 필터링 등에 유용.
  • 일반적으로 작성자, 작성일, 설명, 참조 URL 등을 명시한다.
meta:
    author = "student_researcher"
    description = "Detects phishing campaign using specific string patterns"
    date = "2024-02-14"
    reference = "https://example.com/threat/phish"

3) tags

  • 룰에 태그를 부여하여 카테고리별 검색, 분류를 용이하게 함.
  • rule 선언과 함께 공백으로 나열한다.
rule ransom_family_A : ransomware malicious {
    ...
}

2.3 문자열(Strings) 정의

strings: 섹션은 룰이 탐지할 대상 문자열을 정의하는 공간이다. 문자열은 반드시 식별자(예: $a, $name, $code)로 시작한다.

1) 텍스트 문자열

$a = "This program cannot be run"
  • ASCII 또는 UTF-16으로 정의 가능.
  • 문자열 뒤에 ascii, wide, nocase 등의 옵션 지정 가능.
$b = "malicious" nocase wide

2) 헥사 문자열 (Hex string)

$c = { 6A 40 68 ?? ?? 00 00 }
  • 바이너리 시그니처 탐지에 유용.
  • ??는 와일드카드 바이트(아무 값이나 허용).

3) 정규 표현식 (Regular Expressions)

$d = /[A-Z]{4}-\d{3}/
  • 슬래시(/)로 감싸야 하며, Perl 스타일 regex 사용.
  • 뒤에 nocase, fullword 같은 플래그를 붙일 수 있음.
$e = /cmd\.exe/i

2.4 조건(Condition) 정의와 표현식

condition: 섹션은 룰이 어떤 조건에서 탐지를 수행할 것인지를 지정한다. 이 섹션은 룰 실행의 핵심으로, 반드시 존재해야 한다.

YARA는 C 스타일의 논리 연산자와 제어 구조를 지원한다:

1) 논리 연산자

  • and, or, not

2) 비교 연산자

  • ==, !=, >, <, >=, <=

3) 문자열 존재 여부

$a or $b
all of them
any of ($a, $b, $c)

4) 파일 위치 기반 탐지

$a at entrypoint
$a in (0..100)

5) 반복 조건

#b > 5  // $b가 파일 내에 5번 이상 등장할 때

6) 복합 조건 예시

condition:
    filesize < 1MB and (any of ($a, $b, $c)) and not $d

2.5 정규식, Hex 문자열, 와일드카드 표현

1) 정규 표현식

  • 정교한 탐지가 가능하지만, 과도한 정규표현식 사용은 성능 저하를 유발할 수 있음.
  • 예시:
$dns = /(?:[a-z0-9-]+\.)+(com|net|org)/

2) Hex 문자열과 패턴

  • 바이너리 분석에 적합.
$code = { 55 8B EC ?? ?? 8B 45 ?? }
  • []를 사용하여 바이트 집합 정의 가능
$a = { 6A [2-4] 68 00 30 00 00 }
  • [-]는 바이트 수 간격을 허용 (슬라이딩 윈도우처럼 사용)
$b = { E8 ?? ?? ?? ?? [4-20] 90 90 }

3) 문자열 결합 활용

  • 룰에서 문자열을 조합하거나 복잡한 조건으로 설정 가능
condition:
    ($a and #b > 10) or ($c and filesize < 500KB)

3. YARA Rule 작성 기법

3.1 간단한 악성코드 탐지용 룰 예시

아래는 악성코드에 흔히 포함된 문자열을 기반으로 탐지하는 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 (...): 정의된 문자열 중 하나 이상 발견되면 탐지

이 구조는 빠르게 룰을 테스트하거나 특정한 정황을 식별할 때 유용하다.

3.2 패턴 기반 탐지를 위한 Best Practice

단순 문자열 외에도 Hex 문자열과 정규표현식을 적극 활용하는 것이 중요하다. 이는 탐지 우회를 시도하는 변형 샘플에 대응하는 데 효과적이다.

1) Hex 문자열을 활용한 셸코드 탐지

rule shellcode_pattern
{
    strings:
        $a = { 6A 40 68 ?? ?? 00 00 6A 14 8D 91 }
    condition:
        $a
}
  • ??: 와일드카드로서 가변 값을 허용
  • 바이너리 분석 결과 기반의 서명 추출에 효과적

2) 정규표현식으로 도메인 패턴 탐지

rule suspicious_domains
{
    strings:
        $dom = /[a-z]{5,10}\.duckdns\.org/
    condition:
        $dom
}
  • 무료 동적 DNS 서비스를 활용한 악성코드의 C2 서버 탐지에 유용

3) 문자열 속성 활용

rule wide_and_case_insensitive
{
    strings:
        $cmd = "powershell" wide nocase
    condition:
        $cmd
}
  • wide: UTF-16 문자열까지 탐지
  • nocase: 대소문자 무시

3.3 False Positive 최소화를 위한 조건 구성 전략

YARA 룰이 정확해야 실무에서 사용 가능하다. 특히 오탐(False Positive) 을 방지하기 위한 전략이 필수적이다.

1) 조건 결합을 통한 정밀도 향상

rule accurate_detection
{
    strings:
        $a = "cmd.exe"
        $b = "powershell"
        $c = "Invoke-Expression"

    condition:
        all of ($a, $b, $c)
}
  • 단일 문자열로는 탐지 대상이 너무 광범위해질 수 있음
  • 세 가지 문자열이 함께 존재하는 경우에만 탐지되도록 설정

2) 파일 특성 조건 추가

rule filter_by_size
{
    strings:
        $a = "UPX0"
    condition:
        filesize < 500KB and $a
}
  • filesize 조건을 통해 일반 실행파일 범위를 좁힘
  • 특정 패커(예: UPX) 탐지 시 활용

3) entrypoint 기반 탐지

rule pe_entrypoint_pattern
{
    strings:
        $a = { 55 8B EC 83 EC ?? }
    condition:
        $a at entrypoint
}
  • at entrypoint: 실행 시작 지점에서만 탐지하여 정확도 향상

3.4 파일 포맷 구조에 기반한 룰 작성

파일 포맷에 대한 이해는 정교한 룰 작성에 핵심적이다. YARA는 pe, elf, mach_o 등의 모듈을 통해 실행파일의 내부 구조를 조건으로 활용할 수 있다.

1) PE 헤더 기반 탐지 예시

import "pe"

rule packed_pe_file
{
    condition:
        pe.number_of_sections > 5 and
        pe.sections[1].entropy > 7.0
}
  • PE 섹션 수, 엔트로피 수치 등을 기반으로 패킹 여부 탐지 가능
  • 고엔트로피 = 압축 또는 암호화 가능성

2) 리소스 섹션 존재 확인

import "pe"

rule suspicious_resource
{
    condition:
        pe.has_resource and pe.resources[0].language == 0x409
}
  • 특정 언어(Resource Language) 기반 필터링

3.5 다중 조건, OR/AND/NOT 논리 연산의 활용

논리 연산자는 탐지 정밀도와 유연성을 극대화한다. YARA는 and, or, not 뿐만 아니라 any of, all of, none of 구문도 지원한다.

1) 조건 조합 예시

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: 특정 조건 제외

2) 파일 속성과 결합

rule runtime_loader
{
    strings:
        $import = "LoadLibraryA"
        $getproc = "GetProcAddress"
    
    condition:
        pe.imports("kernel32.dll", "LoadLibraryA") and
        $import and $getproc
}
  • pe.imports() 함수는 특정 DLL과 함수의 존재 여부를 검사

4. YARA 실행 및 분석 환경 구축

YARA는 다양한 운영체제에서 활용 가능한 유연한 도구이며, 명령줄에서 직접 실행하거나 Python과 연동하여 자동화된 분석 도구로 활용할 수 있다. 본 장에서는 YARA의 설치부터 명령줄 인터페이스 사용법, Python 통합, 그리고 실제 악성코드 샘플을 대상으로 한 분석 예시까지 전반적인 실무 환경 구성 방법을 다룬다.

4.1 YARA 설치 방법 (Linux, Windows, macOS)

YARA는 오픈소스로 GitHub([https://github.com/VirusTotal/yara)](https://github.com/VirusTotal/yara\) 에서 소스를 제공하며, 대부분의 플랫폼에서 컴파일 또는 패키지 설치 방식으로 이용할 수 있다.

1) Linux (Ubuntu 기준)

sudo apt update
sudo apt install yara

또는 최신 버전이 필요할 경우, 소스 컴파일을 진행

git clone https://github.com/VirusTotal/yara.git
cd yara
./bootstrap.sh
./configure
make
sudo make install

2) Windows

  • 공식 릴리스 페이지나 Chocolatey 사용
choco install yara
  • 또는 pre-built binary 다운로드 후 yara.exe 실행

3) macOS

  • macOS에서는 Homebrew 패키지 매니저를 통해 간편하게 설치할 수 있다.
brew install yara

4.2 명령줄 사용법과 주요 옵션

설치 후에는 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에 정의된 룰을 이용해 지정된 디렉토리의 모든 파일을 재귀적으로 검사하며, 문자열 매칭 정보를 함께 출력한다.

4.3 Python에서의 YARA 연동 (yara-python 모듈)

YARA는 Python과의 연동을 공식적으로 지원하며, 이를 통해 자동화된 악성코드 분석이나 정적 분석 파이프라인을 구성할 수 있다.

1) 설치

pip install yara-python
  • C 기반의 YARA 라이브러리 필요. 설치 전 시스템에 YARA가 설치되어 있어야 한다.

2) 간단한 사용 예시

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 룰을 로드한 후 지정된 파일에서 탐지를 수행하고, 일치한 문자열의 위치와 내용을 출력한다.

3) 룰 문자열 동적 정의

rule_text = """
rule dummy_rule {
    strings:
        $a = "test"
    condition:
        $a
}
"""
rules = yara.compile(source=rule_text)
  • 이 방법은 룰을 코드 내에 동적으로 생성하거나, 웹 인터페이스로부터 입력을 받아 실시간 분석을 수행할 때 유용하다.

4.4 샘플 파일에 대한 실습 예시

이번엔 실제로 의심스러운 실행 파일을 대상으로 YARA 분석을 수행하는 과정이다.

1) 분석 대상: sample.exe

파일 내부에 "cmd.exe", "powershell", "LoadLibraryA" 문자열이 존재하는 경우 탐지하는 룰을 작성해보자.

rule detect_exec_payload
{
    strings:
        $cmd = "cmd.exe"
        $ps = "powershell"
        $lib = "LoadLibraryA"

    condition:
        2 of ($cmd, $ps, $lib)
}

2) 실행

yara detect_exec_payload.yar sample.exe
  • 출력: 해당 룰이 sample.exe 내의 조건과 일치함을 의미
detect_exec_payload sample.exe

3) 매칭 정보 상세 보기

yara -s -g detect_exec_payload.yar sample.exe
  • 출력:
detect_exec_payload [sample.exe]
0x4020:$cmd: cmd.exe
0x50b0:$ps: powershell

4) Python 기반 자동 스캔 예시

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 파이프라인, 이메일 첨부 파일 분석기 등에 자동 연동이 가능하다.


5. YARA의 실전 활용 사례

지금까지 살펴본 바, YARA는 단순한 문자열 매칭 도구를 넘어, 사이버 위협 분석, 악성코드 식별, 그리고 침해지표(IOC) 확산에 있어 핵심적인 역할을 수행하는 정적 분석 도구이다. 본 장에서는 실제 보안 실무에서 YARA가 어떻게 활용되는지를 중심으로, 다양한 분석 대상과 연동 환경에서의 적용 사례를 구체적으로 설명한다.

5.1 악성코드 패밀리 식별

YARA는 특정 악성코드 패밀리의 고유한 문자열, 함수명, 코드 구조를 식별해 동일 계열의 변종을 탐지하는 데에 강력하게 활용된다.

1) 악성코드 서명화(Signaturing)

  • 악성코드 분석을 통해 공통적으로 발견되는 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
}

2) 변종 탐지

  • YARA는 특정 바이너리 해시가 아닌 특징 기반 탐지를 지향하므로, 해시 우회나 난독화된 변종이더라도 탐지 가능성이 높다.
  • 이는 백신이 탐지하지 못하는 시점에서 APT 초기 침투 분석에 특히 유효하다.

5.2 APT 공격 그룹의 TTP 식별

YARA는 전통적인 IOC 중심 탐지를 넘어, MITRE ATT&CK 기반의 Tactics, Techniques, Procedures (TTP) 탐지에도 사용된다.

1) 공격 도구/기술 기반 룰 생성

  • 특정 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
}

2) MITRE ATT&CK 전술 대응

  • T1059 (Command and Scripting Interpreter), T1027 (Obfuscated Files or Information) 등 특정 기법에 대한 룰 작성이 가능.

  • 이는 EDR과 결합하여 행위 기반 탐지에서 정적 정황 보강 수단으로 활용된다.

5.3 이메일 첨부파일 분석과 룰 적용

보안 실무에서 YARA는 악성 이메일 첨부파일(특히 Office 문서, PDF, JS/HTA 파일 등) 분석에 광범위하게 사용된다.

1) 매크로 기반 악성 문서 탐지

  • 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
}

2) 피싱 메일 내 JS/HTA 스크립트 탐지

  • 자바스크립트 기반 다운로드/실행 루틴 (WScript.Shell, run, XMLHttpRequest)을 대상으로 룰을 구성한다.

3) 자동화 분석 환경 연계

  • 이메일 게이트웨이에서 수집된 첨부파일을 Sandbox 환경에서 자동으로 YARA 룰에 투입, 의심 파일 분류.

5.4 VirusTotal 및 Threat Intelligence Feed와 연동

YARA는 위협 인텔리전스 생태계에서 중심적인 역할을 하며, 특히 대규모 악성코드 저장소 및 위협 피드와의 연계를 통해 위력을 발휘한다.

1) VirusTotal의 YARA Search 기능

  • VirusTotal Intelligence 계정 보유 시, YARA 룰을 이용한 레트로 헌팅(Retro-Hunting) 가능.
  • 수개월간 업로드된 샘플에 대해 룰을 적용, 해당 조건에 일치하는 과거 샘플들을 분석.
rule vt_retro_example {
    strings:
        $s1 = "powershell -enc"
    condition:
        $s1
}
  • 해당 룰이 적용된 샘플의 해시, 업로드 국가, 최초 감지일 등을 기반으로 위협 추적 및 IOC 확장 가능.

2) MISP, ThreatFox 등 TI Feed 연동

  • MISP에서 제공하는 YARA 포맷 IOC를 가져와 로컬 탐지에 활용 가능.
  • Abuse.ch의 ThreatFox 플랫폼은 사용자 커뮤니티 기반 YARA 룰 공유를 지원하며, 실시간 위협 탐지 룰 확보에 유용하다.

6. YARA Rule 작성 자동화 및 관리

6.1 자동 룰 생성 도구 개요

자동화된 YARA 룰 생성을 지원하는 도구는 일반적으로 악성코드 샘플 분석을 통해 고유 패턴을 추출하고 이를 기반으로 YARA 문법에 맞는 룰을 자동 생성해주는 기능을 수행한다. 대표적인 도구는 다음과 같다:

1) yarGen

  • Florian Roth에 의해 개발된 자동화 YARA 룰 생성 도구.
  • PE 파일 내에서 의미 있는 문자열만을 선별하고, 화이트리스트를 기반으로 정상 문자열을 제외하여 FP(False Positive)를 최소화한다.
  • 메타정보(작성자, 참조 링크, 룰 유형 등)를 자동 생성하며, imphash, ssdeep 등 해시 기반 조건도 포함 가능.
python yarGen.py -m /malware/samples/ -o generated_rules.yar
  • yarGenSIGMA, PEStudio, VirusTotal, NSRL DB와의 통합도 지원한다.

2) YaraMate / YARASignator

  • GUI 기반의 자동 룰 생성기 (비교적 덜 널리 쓰이지만, 교육용이나 초심자에게 유용).
  • 간단한 드래그&드롭으로 PE 구조 기반 조건을 지정할 수 있음.

6.2 Sigma → YARA 변환

Sigma는 SIEM을 위한 탐지 규칙의 표준화된 YAML 포맷이다. 이를 통해 다양한 보안 로그를 구조화하고, 다양한 포맷(Splunk, ELK, QRadar 등)으로 변환할 수 있다. Sigma는 YARA로의 변환도 가능하다.

1) 사용 도구: sigmac

  • sigmac는 Sigma 룰을 다양한 백엔드 포맷으로 변환해주는 도구.
  • 기본적으로 YARA는 Sigma의 "file content" 분석 규칙을 기반으로 변환 가능하다
sigmac -t yara path/to/sigma_rule.yml > output_rule.yar

2) 주의사항

  • Sigma는 본래 로그 탐지 목적이기 때문에, YARA로 변환 시 단순 문자열 탐지에 머무는 경우가 많다.
  • 따라서 수동으로 YARA용 조건(condition)을 조정해야 더욱 정밀한 룰이 된다.

6.3 MISP, Viper와의 연계

CTI 및 악성코드 관리 플랫폼과의 연계는 룰의 지속적 확장과 최신 위협 반영에 효과적이다.

1) MISP (Malware Information Sharing Platform)

  • MISP는 IOC 중심의 인텔리전스를 공유하는 오픈소스 Threat Intelligence 플랫폼이다.
  • YARA 룰 형태로 IOC를 추출할 수 있는 기능을 기본 지원하며, 연관 이벤트 또는 태그 기반으로 자동 생성 가능.
# MISP API 사용 예시 (YARA 추출)
https://<misp-instance>/events/restSearch/download/yara/eventid:<event_id>
  • 자동화 스크립트를 통해 특정 태그(예: APT29, ransomware 등)가 붙은 IOC만 선별해 룰 생성 가능.

2) Viper Framework

  • Viper는 악성코드 샘플을 수집·분석·관리하는 오픈소스 프레임워크다.
  • 샘플을 업로드하면 자동으로 YARA 룰 템플릿을 생성하고, PE 헤더 및 문자열 분석 결과를 조건으로 포함할 수 있음.
  • YARA와의 통합은 다음과 같은 방식으로 이뤄짐:
viper > open <sample>
viper sample > yara --generate

분석 중인 샘플에서 고유한 문자열, 섹션 이름, 컴파일 타임 등을 기반으로 자동 룰 생성 가능.

6.4 대규모 룰셋 관리 전략

YARA 룰은 개별적으로 활용할 수도 있지만, 실무에서는 수천 개의 룰셋을 지속적으로 관리하고 최적화해야 한다. 이에 따라 다음과 같은 관리 전략이 필요하다.

1) 룰셋 분류 및 저장소 구성

  • 목적별로 룰을 카테고리화:

    • malware_families/
    • apt_groups/
    • packer_detect/
    • document_exploits/
  • Git을 기반으로 룰 버전 관리 수행.

  • 유명 공개 저장소(Florian Roth’s signature base, rules from CERT-PL 등)와 로컬 저장소를 구분하여 운영.

2) 룰 충돌 및 중복 탐지 방지

  • 룰 간 조건 중복으로 인한 False Positive 또는 분석 누락 방지를 위해 자동화 스크립트를 사용해 정기 점검 필요.
  • yarac를 사용한 룰 컴파일로 문법 오류 사전 점검:
yarac all_rules.yar compiled_rules.yarc

3) 룰 성능 최적화

  • condition 문에서 any of ($s*)를 남용할 경우 검사 속도 저하 가능.
  • 대용량 분석 환경에서는 --fast-scan 등 최적화 옵션 적용 고려.
  • 상위 탐지율 룰과 우선순위 룰을 분리하여 효율적 운영 가능.

4) 실시간 동기화 및 업데이트

  • cron이나 CI/CD 파이프라인을 통해:

    • 외부 룰셋 정기 다운로드 (예: GitHub, MISP feed)
    • yarac로 컴파일 후 탐지 엔진에 반영
  • 내부 룰 작성자들의 기여를 위한 리뷰/PR 체계 마련 필요


7. 고급 YARA 기능과 확장성

YARA는 단순한 문자열 기반 탐지를 넘어, 정형화된 바이너리 분석, 행위 기반 조건 구성, 그리고 외부 분석 도구와의 연동을 통해 매우 유연하고 강력한 규칙 기반 탐지 플랫폼으로 발전해왔다. 이번에는 외부 모듈(import)을 통한 확장 기능과, 특정 실행 파일 포맷에 특화된 분석 모듈, 그리고 최신 버전에서 제공되는 고급 기능(YARA-X 포함)에 대해 상세히 알아보자.

7.1 외부 모듈(import) 사용 방법

YARA는 특정 파일 포맷이나 기능에 대한 고급 분석을 위해 외부 모듈(External Modules)을 import 지시어를 통해 활용할 수 있다. 이는 rule 내에서 일반 문자열 탐지를 넘어 다양한 메타데이터 기반 조건을 구성할 수 있게 해준다.

1) 사용 구문

import "pe"

rule check_packer {
    condition:
        pe.number_of_sections > 5 and
        pe.overlay.offset > 0
}

2) 주요 내장 모듈

모듈 이름설명
pePE(Portable Executable) 형식 분석
elfELF(Executable and Linkable Format) 형식 분석
cuckooCuckoo 샌드박스 동적 분석 결과 활용
math수학 함수 제공 (e.g., 평균값, 분산 등)
hashMD5, SHA1, SHA256 등 해시 계산
dexAndroid DEX 파일 분석
dotnet.NET 메타데이터 분석

3) import 주의사항

  • 사용하지 않은 모듈을 import하면 YARA가 경고 또는 오류를 반환할 수 있음.
  • 모듈 사용은 시스템에 해당 기능이 포함된 YARA 빌드 또는 플러그인이 필요하다.
  • 일부 모듈(cuckoo, dotnet 등)은 기본 빌드에는 포함되지 않으며 수동 컴파일 또는 특정 패키지 설치가 요구된다.

7.2 PE, ELF, Cuckoo 모듈 분석

1) 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
}

2) 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
}

3) cuckoo 모듈

Cuckoo는 동적 분석 시스템으로, YARA는 해당 분석 결과를 조건으로 사용할 수 있다.

import "cuckoo"

rule keylogger_behavior {
    condition:
        cuckoo.network.http.count > 10 and
        cuckoo.behavior.api("GetAsyncKeyState")
}
  • 주로 APT 행위 탐지, 샘플 분류, 행위 기반 룰 작성에 활용됨.
  • Cuckoo 환경에서 사전 정의된 JSON 분석 결과가 필요하며, 일반 YARA 환경에서는 작동하지 않음.

7.3 YARA-X 및 YARA v4의 고급 기능 소개

YARA-X는 2023년 발표된 차세대 YARA 구현체로, Rust 기반으로 개발되었으며 속도, 안정성, 확장성에서 기존 Python-C 기반 YARA보다 뛰어난 성능을 보인다. 또한 YARA 4.x 버전에서도 많은 고급 기능이 도입되었다.

1) YARA-X의 주요 특징

  • Rust로 재작성되어 메모리 안정성과 실행 속도 개선
  • 멀티스레드 지원을 통한 대량 파일 병렬 분석
  • Python 바인딩이 없이도 가볍게 독립 실행 가능
  • WASM 환경 지원 가능 (향후 클라우드 분석 플랫폼과 통합 기대)
yara-x rule.yar /path/to/samples/

2) 고급 조건 구문 (YARA 4.x 이상)

  • for ... of ... 표현의 향상된 범위 지정
  • 모듈 내 서브 필드 필터링 (e.g., pe.sections[i])
  • 64비트 정수 및 부동소수점 계산 지원
  • 컨텍스트 매칭 조건: 문자열 위치 기반 제어 가능
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 )
}

3) 향후 확장성: 커스텀 모듈 작성

  • YARA는 C로 작성된 사용자 정의 모듈(custom module)을 통해 분석 기능을 확장할 수 있다.
  • 예: 전용 악성코드의 커스텀 포맷 파서 작성, 내부 기업 프로토콜에 대한 모듈화 등

8. 오탐/누락 탐지 문제와 대응 방안

YARA 기반 탐지에서 가장 빈번하게 직면하는 문제는 오탐(False Positive)누락(False Negative) 이다. 탐지율을 높이려다 보면 무해한 파일도 악성으로 판단하게 되고, 반대로 너무 엄격하게 조건을 구성하면 악성코드를 놓칠 수 있다. 이러한 문제는 탐지 룰셋의 신뢰성과 실용성을 직접적으로 좌우하며, 보안 운영 환경에서의 실효성 확보에 있어 반드시 해결해야 할 핵심 과제이다.

8.1 탐지 성능 테스트 방법

YARA 룰의 탐지력을 객관적으로 평가하기 위해서는 실제 또는 유사 환경에서 다음과 같은 절차로 테스트를 수행해야 한다.

1) 테스트 샘플 구성

유형설명
악성 샘플(Malicious)실제 수집된 악성코드 바이너리 (ex. VirusShare, MalwareBazaar 등)
정상 샘플(Benign)운영체제 파일, 상용 프로그램, 오픈소스 바이너리 등
회피 샘플(Evasive)코드 난독화, 패커 등으로 위장된 악성코드

Tip: 샘플을 분류할 때, 확실한 레이블링(ground truth)을 확보한 데이터셋을 활용해야 한다. 가능하다면 VirusTotal이나 샌드박스 분석 결과 기반의 정량 평가가 바람직하다.

2) 평가 지표

지표계산 방법의미
TP (True Positive)악성 샘플을 정확히 탐지한 수탐지 성공
FP (False Positive)정상 샘플을 악성으로 잘못 탐지한 수오탐
TN (True Negative)정상 샘플을 정상으로 판단한 수탐지 회피 성공
FN (False Negative)악성 샘플을 탐지하지 못한 수탐지 누락
  • 이를 기반으로 정확도, 정밀도, 재현율을 산출하여 룰셋의 성능을 수치화할 수 있다.

8.2 오탐(FP) 원인 분석과 개선

오탐은 실무에서 가장 빈번하고 치명적인 문제다. 오탐률이 높으면 보안팀의 피로도 증가, 자동 대응 시스템의 오류, 정상 파일 차단 등 운영 장애로 이어질 수 있다.

1) 주요 원인

원인설명
너무 일반적인 문자열단순 API 호출, 자주 쓰이는 문자열 ("This program cannot be run", "WinExec")
상용 소프트웨어 패턴과 유사Visual Studio, UPX, InstallShield 등도 악성코드와 유사한 구조 가짐
정규식/HEX 표현의 과도한 범용성너무 넓은 범위로 설정된 패턴 ({ 6A ?? 68 ?? ?? ?? ?? E8 })
루틴 메타정보 기반 탐지타깃 악성코드의 컴파일러/링커 정보가 정식 툴체인과 동일할 수 있음

2) 개선 전략

  • 문자열에 context 조건 추가: 단순히 존재 여부가 아닌 "어디에 위치하냐"를 고려
    • 예) string $a = "winexec"$a at entrypoint + 200
  • 메타정보 활용: 파일 크기, 섹션 수, 해시값 등과 함께 다중 조건 구성
  • 화이트리스트 적용: 정상 소프트웨어에 해당하는 해시 또는 특징을 사전 제외
  • 리눅스/Windows/IoT 등 플랫폼 구분 적용: 동일 룰셋을 다중 OS에 적용하지 않도록 분리

8.3 룰셋 품질 향상을 위한 테스트 전략

룰셋은 단일 룰의 조합이 아니라, 전체 구성의 상호 보완성, 효율성, 유지보수 용이성까지 고려되어야 한다. 다음은 실질적인 품질 향상 방안이다.

1) CI 기반 정적 검증 자동화

  • 룰 문법 체크: yara --syntax-check rules/
  • 샘플 테스트 자동화: GitHub Actions, GitLab CI 등의 CI/CD 파이프라인 활용
for f in samples/malicious/*; do
    yara rules/index.yar "$f" >> result.log
done

2) 버전 관리 전략

  • 룰셋을 Git 등으로 형상관리
  • 커밋별로 변경 이력, 룰의 목적, 테스트 결과를 명시

3) 전용 툴 활용

도구역할
yarGen악성코드 샘플에서 자동 룰 추출
yarAnalyzer룰셋 내 중복, 무효, 충돌 조건 탐지
vigridYARA 룰의 검증 자동화 및 결과 리포팅 지원 도구

4) 운영 환경 내 테스트 (Staging)

  • 운영에 투입되기 전, 실제에 가까운 환경에서 샘플 실행 테스트
  • 오탐 발생 시 즉시 알림 및 룰 수정 프로세스 구성

9. 실무에서 자주 쓰이는 공개 룰셋 및 활용법

YARA는 고도로 유연한 탐지 엔진인 만큼, 정교하고 실전에서 검증된 룰셋을 활용하는 것이 분석의 정확도와 효율성을 크게 높이는 핵심이다. 실무에서는 개별 보안팀이 자체 룰을 작성하기보다는, 공개된 룰셋을 기반으로 커스터마이징하거나, 신뢰도 높은 소스의 룰을 참고하여 악성코드 탐지 체계를 수립하는 경우가 많다고 한다.

9.1 Florian Roth의 Signature 룰셋

Florian Roth는 실전 위협 인텔리전스와 악성코드 탐지 분야에서 가장 활발히 활동 중인 보안 전문가 중 한 명으로, Sigma, yarGen, Loki, Thor 등의 탐지 도구 개발자로도 유명하다.

1) Signature 기반 YARA 룰셋

  • GitHub 저장소: https://github.com/Neo23x0/signature-base
  • 구성: yara/ 디렉토리 하위에 수천 개의 .yar 파일이 존재하며, APT, RAT, Ransomware, Tool, Webshell, Document Exploit 등으로 분류됨.
  • 업데이트 주기: 주 단위로 활발히 갱신됨

2) 활용 방법

# 저장소 전체 클론
git clone https://github.com/Neo23x0/signature-base.git
cd signature-base/yara/

# 특정 디렉토리 전체 탐지
yara -r index.yar /path/to/scan/

3) 실무 적용 포인트

  • 대부분의 룰에 metadescription, reference 필드가 잘 정리되어 있어 관리가 편리함
  • yarGen을 통해 자동 생성된 룰 외에도 핸드메이드 고급 룰이 다수 포함
  • 초보자에게는 과한 탐지일 수 있으므로, 목적에 따라 필요한 하위 디렉토리만 선택 적용하는 것이 좋음

9.2 AlienVault, FireEye 등에서 제공하는 룰

보안 벤더 및 인텔리전스 기업들도 자사 분석 리포트와 함께 YARA 룰을 공개하는 경우가 있다. 다음은 자주 인용되는 주요 출처다.

1) AlienVault OTX (Open Threat Exchange)

  • 웹사이트: https://otx.alienvault.com
  • Threat Pulse, Pulse 상세 페이지에서 관련 YARA 룰 제공
  • OSINT 기반 Threat Intelligence 데이터와 연동 가능
  • API를 통해 자동 수집도 가능

2) Mandiant (구 FireEye)

  • APT, 랜섬웨어 분석 리포트 내에 YARA 룰이 첨부되어 있음
  • 대표적인 예: APT29, FIN7, UNC2452 등 Mandiant Threat Report
  • 매우 고도화된 타겟팅 기반 룰 제공 (단순 문자열 기반 룰보다 복합적 조건 활용이 많음)

3) 다른 출처

벤더/기관특징
Cisco TalosThreat Advisory와 함께 제공되는 정제된 룰셋
CrowdStrike블로그 및 리포트 내에서 공격자별 탐지 룰 공유
Kaspersky GReAT특정 악성코드 캠페인에 대한 YARA 룰 공개 (APT, Bootkit 등)
CERT Polska구조 기반 정밀 룰을 포함한 GitHub 저장소 운영

Tips: 이들 룰은 즉시 사용보다는 참고용으로 활용되며, 환경에 맞게 조건을 수정하거나 샘플 분석 후 커스터마이징하여 적용하는 것이 일반적이다.

9.3 GitHub 기반 YARA Rule 저장소 정리

많은 연구자, 기관, 오픈소스 커뮤니티들이 GitHub를 통해 YARA 룰셋을 공유하고 있으며, 실무에서 매우 유용한 참고 자료가 된다. 다음은 대표적인 GitHub 기반 저장소 목록이다.

1) YARA-Rules 프로젝트 (community 기반)

  • GitHub: https://github.com/Yara-Rules/rules
  • 다양한 악성코드와 공격 벡터를 포괄하는 룰셋 집합
  • 문서화가 다소 부족하나, 룰 이름과 조건으로 용도를 유추 가능
  • 일부 룰은 지속적으로 업데이트되지 않음 → 직접 테스트 후 적용 필요

2) TheHive-Project/yara

  • https://github.com/TheHive-Project/yara
  • TheHiveCortex 분석 환경과 함께 사용할 수 있는 룰셋 제공
  • 다양한 유형의 이메일 위협, 문서 기반 악성코드 등 탐지에 유용
  • 지금은 Repository가 지워졌거나 private으로 설정된 것으로 보임

3) 기타 참고할 만한 GitHub 저장소

저장소설명
Sentinel-One/yara-toolkit정규식 및 문자열 추출 자동화 도구 포함
rule-hub다양한 기여자들이 업로드한 범용 룰셋 모음
stvemillertime/malware_yara_rules학습용으로 구성된 다양한 예제 룰

10. 마무리

집안일이 겹쳐 다소 일정이 늘어진 것도 있지만, 새로이 공부할 것들이 굉장히 많아 조사, 정리에 시간을 엄청 써버린 주제였다. Daily CS 최초로 3일에 걸쳐서 작성한 글인데, 솔직히 말하자면 아직도 완벽히 학습했다고 보기 힘든 것 같다. 아무래도 조만간 악성코드 분석 프로젝트에 겸해서 YARA Rule을 활용해볼 수 있는 활동을 조금 넣어봐야겠다.

profile
안드로이드는 리눅스의 꿈을 꾸는가

0개의 댓글