🔍 YARA 실무 스터디 가이드

데이터 엔지니어 · AI 엔지니어를 위한 핵심 요약

malware-detection rule-based signature AI 보안
📅 2026.03 · v1.0

1. YARA란?

YARA는 패턴 기반 멀웨어 탐지 및 분류를 위한 오픈소스 도구입니다. 보안 분석가가 룰(rule)을 작성하여 파일, 프로세스 메모리, 네트워크 스트림에서 악성 시그니처를 식별할 수 있게 해줍니다. AI 정보보안 엔지니어에게는 자동화된 탐지 파이프라인 구축의 핵심 요소로 사용됩니다.

🧬 문자열 패턴 매칭

리터럴, 정규식, 와일드카드, XOR 등 다양한 방식으로 바이너리/텍스트 패턴을 탐지합니다.

🧠 조건부 로직

카운트, 오프셋, 파일 크기, 엔트로피 등 풍부한 조건식을 조합하여 정밀한 룰을 설계할 수 있습니다.

⚙️ 모듈 확장

PE, ELF, Cuckoo, Math, Hash 등 확장 모듈을 통해 파일 포맷 및 동작 분석을 강화합니다.

2. 왜 써야 하는가?

기존 시그니처 기반 탐지 방식(ClamAV, Snort 등)과 비교한 YARA의 강점은 다음과 같습니다.

비교 항목 YARA ClamAV Snort (파일 탐지)
룰 표현력 매우 풍부 (조건식, 모듈) 제한적 (시그니처 위주) 보통 (패턴 + 플러그인)
메모리 스캔 ✅ 내장 지원 ❌ 부분적 (preproc)
속도 (단일 룰) 우수 (Aho-Corasick) 보통 좋음
AI/ML 연계 ✅ Python 바인딩, 자동화 쉬움 어려움 중간
커뮤니티 룰 풍부 (YARA-Hunt, Valhalla) 많음 많음

💡 AI 엔지니어 관점: YARA는 Python에서 yara-python으로 쉽게 임포트 가능하며, ML 기반 전처리/후처리 파이프라인에 자연스럽게 통합됩니다.

3. 핵심 개념

YARA 룰은 크게 세 부분으로 구성됩니다: 메타데이터(meta), 문자열 정의(strings), 조건(condition).

+------------------+ +-------------------+ +-------------------+ | meta | | strings | | condition | | author | | $a = "malware" | | any of them | | description | -------> | $b = /evil\d+/i | -------> | or all of them | | date | | $c = { 6A 40 00 }| | #a > 2 | | reference | | $d = "crypto" nocase| | filesize < 1MB | +------------------+ +-------------------+ +-------------------+ | | | v v v [룰 식별 정보] [탐지할 패턴 집합] [논리 조합 & 제약]

룰은 .yar 또는 .yara 확장자로 저장하며, 컴파일 후 대상 파일/메모리/프로세스에 적용합니다.

아키텍처 개요

┌─────────────────────────────────────────────────────────────┐ │ YARA 아키텍처 (단순화) │ ├─────────────────────────────────────────────────────────────┤ │ [룰 파일] ──컴파일──> [룰 세트 (트리/오토마타)] │ │ │ │ │ [대상] ──매핑/로드──> [스캐너] ──매칭──> [결과 집합] │ │ (파일/메모리/프로세스) │ │ │ v │ │ [매칭된 룰 + 세부 정보] │ └─────────────────────────────────────────────────────────────┘

⚠️ 주의: YARA는 기본적으로 파일 전체를 메모리에 로드합니다. 대용량 파일(수백 MB 이상)은 peek 또는 scan 전략을 고려하세요.

4. 퀵스타트

4.1 설치

macOS / Linux / Windows 모두 지원됩니다. Python 환경에서는 yara-python을 권장합니다.

# macOS (Homebrew)
brew install yara

# Linux (apt/deb)
sudo apt-get install yara

# Python (pip)
pip install yara-python

4.2 첫 번째 룰 작성

hello_malware.yar 파일을 생성하고 아래 내용을 입력합니다.

rule HelloMalware
{
    meta:
        author = "AI-Security-Lab"
        description = "간단한 시그니처 예제"
        date = "2026-03"

    strings:
        $a = "X5O!P%@AP[4\\PZX54(P^)7CC)7}$EICAR"
        $b = "This is not a virus" ascii wide

    condition:
        $a or $b
}

4.3 스캔 실행 (CLI)

# 단일 파일 스캔
yara hello_malware.yar sample.exe

# 디렉터리 전체 스캔 (재귀)
yara -r hello_malware.yar /path/to/samples

# 외부 변수 전달 (예: 파일 크기 제한)
yara -d max_size=1048576 hello_malware.yar sample.bin

4.4 Python에서 사용

import yara

# 룰 컴파일
rules = yara.compile(source='''
rule HelloMalware
{
    strings:
        $a = "EICAR"
    condition:
        $a
}
''')

# 파일 스캔
matches = rules.match('sample.exe')
for m in matches:
    print(f'룰 매치: {m.rule}')
    for s in m.strings:
        print(f'  → 문자열 @ {s.instances[0].offset}: {s.identifier}')

🔁 팁: yara.compile(filepath=...)로 외부 룰 파일을 직접 로드할 수도 있습니다.

5. 핵심 설정 레퍼런스

설정 / 옵션 설명 예시
strings 타입 ascii / wide / xor / fullword / nocase 등 $x = "evil" nocase wide
condition 연산자 and, or, not, for..of, #, @, !, filesize, entrypoint #a > 2 and filesize < 500KB
peek() 파일의 특정 영역만 읽어 메모리 절약 peek(0x100, 512)
import 모듈 pe, elf, math, hash, cuckoo import "pe" → pe.number_of_sections
external 변수 CLI -d 또는 Python dict로 전달 condition: ext_var == true
-s / --print-strings 매칭된 문자열의 위치와 내용 출력 yara -s rule.yar target

6. 실무 팁 & 트러블슈팅

자주 겪는 문제와 해결책

문제 원인 해결책
룰이 매칭되지 않음 대소문자, 인코딩, 바이트 순서 nocase, wide, xor 수정자 확인
메모리 부족 (대용량 파일) 파일 전체를 한 번에 로드 peek() 또는 chunked 스캔 사용
컴파일 오류 (unknown modifier) 오타 또는 지원되지 않는 수정자 문서 확인, -v 버전 체크
Python 바인딩 segfault 비정상 파일 / 메모리 경계 침범 try-except로 감싸거나 yara.compile 단계에서 예외 처리

실무 팁

7. 참고 자료

📚 추천: YARA 룰을 처음 작성한다면, 공식 문서의 "Writing YARA rules" 챕터와 Nextron Systems의 "YARA for Beginners"를 병행하세요.