데이터 엔지니어 · AI 엔지니어를 위한 핵심 요약
YARA는 패턴 기반 멀웨어 탐지 및 분류를 위한 오픈소스 도구입니다. 보안 분석가가 룰(rule)을 작성하여 파일, 프로세스 메모리, 네트워크 스트림에서 악성 시그니처를 식별할 수 있게 해줍니다. AI 정보보안 엔지니어에게는 자동화된 탐지 파이프라인 구축의 핵심 요소로 사용됩니다.
리터럴, 정규식, 와일드카드, XOR 등 다양한 방식으로 바이너리/텍스트 패턴을 탐지합니다.
카운트, 오프셋, 파일 크기, 엔트로피 등 풍부한 조건식을 조합하여 정밀한 룰을 설계할 수 있습니다.
PE, ELF, Cuckoo, Math, Hash 등 확장 모듈을 통해 파일 포맷 및 동작 분석을 강화합니다.
기존 시그니처 기반 탐지 방식(ClamAV, Snort 등)과 비교한 YARA의 강점은 다음과 같습니다.
| 비교 항목 | YARA | ClamAV | Snort (파일 탐지) |
|---|---|---|---|
| 룰 표현력 | 매우 풍부 (조건식, 모듈) | 제한적 (시그니처 위주) | 보통 (패턴 + 플러그인) |
| 메모리 스캔 | ✅ 내장 지원 | ❌ | 부분적 (preproc) |
| 속도 (단일 룰) | 우수 (Aho-Corasick) | 보통 | 좋음 |
| AI/ML 연계 | ✅ Python 바인딩, 자동화 쉬움 | 어려움 | 중간 |
| 커뮤니티 룰 | 풍부 (YARA-Hunt, Valhalla) | 많음 | 많음 |
💡 AI 엔지니어 관점: YARA는 Python에서 yara-python으로 쉽게 임포트 가능하며, ML 기반 전처리/후처리 파이프라인에 자연스럽게 통합됩니다.
YARA 룰은 크게 세 부분으로 구성됩니다: 메타데이터(meta), 문자열 정의(strings), 조건(condition).
룰은 .yar 또는 .yara 확장자로 저장하며, 컴파일 후 대상 파일/메모리/프로세스에 적용합니다.
⚠️ 주의: YARA는 기본적으로 파일 전체를 메모리에 로드합니다. 대용량 파일(수백 MB 이상)은 peek 또는 scan 전략을 고려하세요.
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
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
}
# 단일 파일 스캔
yara hello_malware.yar sample.exe
# 디렉터리 전체 스캔 (재귀)
yara -r hello_malware.yar /path/to/samples
# 외부 변수 전달 (예: 파일 크기 제한)
yara -d max_size=1048576 hello_malware.yar sample.bin
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=...)로 외부 룰 파일을 직접 로드할 수도 있습니다.
| 설정 / 옵션 | 설명 | 예시 |
|---|---|---|
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 |
| 문제 | 원인 | 해결책 |
|---|---|---|
| 룰이 매칭되지 않음 | 대소문자, 인코딩, 바이트 순서 | nocase, wide, xor 수정자 확인 |
| 메모리 부족 (대용량 파일) | 파일 전체를 한 번에 로드 | peek() 또는 chunked 스캔 사용 |
| 컴파일 오류 (unknown modifier) | 오타 또는 지원되지 않는 수정자 | 문서 확인, -v 버전 체크 |
| Python 바인딩 segfault | 비정상 파일 / 메모리 경계 침범 | try-except로 감싸거나 yara.compile 단계에서 예외 처리 |
for..of를 활용하여 룰 길이를 줄이세요.yara 실행하여 PR마다 샘플 검증을 자동화할 수 있습니다.procdump) 후 YARA로 스캔하거나, yara -p <pid>로 실시간 스캔(Linux/macOS).yara -t (테스트 모드)로 룰만 검증하거나, --fail-on-warnings로 품질 관리.xor(0-255)는 느리므로, 우선순위 룰로 분리하세요.📚 추천: YARA 룰을 처음 작성한다면, 공식 문서의 "Writing YARA rules" 챕터와 Nextron Systems의 "YARA for Beginners"를 병행하세요.