"이 파일이 위험한지 어떻게 알지?"
보안 분석가의 영원한 질문에, YARA는 가장 우아한 답을 내놓는다.
🎯 이 글에서 다루는 것
- YARA가 무엇이며, 왜 보안 분석가의 필수 도구인지
- YARA 룰의 세 가지 핵심 구성 요소 (meta, strings, condition)
- 직접 샘플 파일을 만들고, 시그니처를 추출하고, 탐지 룰을 작성하는 전 과정
- 룰을 실행해 실제로 매칭이 일어나는지 확인하는 방법
- 현장에서 자주 마주치는 함정과 우회 기법
📌 도입 — 왜 YARA인가
악성코드 분석가의 책상 위에 의심스러운 파일 한 개가 놓여 있다고 상상해 봅니다. 안티바이러스 엔진은 잠잠하고, 해시값으로 VirusTotal을 검색해도 별다른 정보가 없습니다. 그래도 무언가 찜찜한 냄새가 납니다. 이때 분석가는 묻습니다. "이 파일의 어떤 부분이 악성코드의 흔적일까? 그리고 비슷한 파일이 나타나면 어떻게 잡아내지?"
YARA는 바로 이 질문에 답하기 위해 태어났습니다. VirusTotal의 Victor Alvarez가 만든 이 도구는 "악성코드 패턴을 사람이 읽을 수 있는 룰로 기술하고, 그 룰로 파일·메모리·프로세스를 빠르게 스캔"하는 일을 단순하게 만들어 줍니다. 오늘날 거의 모든 보안 벤더, EDR 솔루션, 위협 인텔리전스 플랫폼이 내부적으로 YARA를 활용합니다.

🔍 YARA 룰의 해부학
YARA 룰은 마치 영장(令狀)과 같습니다. 누구를 찾는지(meta), 어떤 단서로 찾는지(strings), 어떤 조건이면 잡아들이는지(condition) 세 가지로 구성됩니다.
1) meta — 룰의 신분증
룰의 이름, 작성자, 설명, 참고 자료 등을 기록하는 영역입니다. 탐지 동작에는 영향을 주지 않지만, 협업과 유지보수의 핵심입니다.
2) strings — 탐지 단서
찾고자 하는 패턴을 정의합니다. 세 가지 형태가 있습니다.
- 텍스트 문자열: "powershell -enc" — 일반 ASCII/UTF-8 문자열
- 16진수 바이트: { 4D 5A ?? ?? 50 45 } — PE 파일의 매직 바이트처럼 바이너리 패턴 (??는 와일드카드)
- 정규표현식: /cmd\.exe\s+\/c/i — 유연한 패턴 매칭
3) condition — 매칭 규칙
strings 영역에 정의된 단서들이 어떤 조건으로 조합되면 탐지로 간주할지 명시합니다. and, or, not, 카운트 비교, 파일 크기 조건 등을 자유롭게 쓸 수 있습니다.
💻 실습 — 파일 생성부터 탐지까지
0단계. YARA 설치
# Ubuntu / Debian
sudo apt update && sudo apt install -y yara
# macOS (Homebrew)
brew install yara
# 설치 확인
yara --version
1단계. 탐지 대상 샘플 파일 만들기
실습용 무해 파일을 하나 만들어 봅니다. 가상의 "의심스러운 스크립트"라고 가정합니다. 실제 악성코드는 절대 사용하지 않고, 우리가 직접 시그니처를 심어둔 더미 파일을 씁니다.
cat > suspicious_sample.txt << 'EOF'
#!/bin/bash
# Internal task runner v1.0
TASK_ID=ACME-EDU-2026
echo "Starting backup process..."
curl -s http://example-edu-lab.local/healthcheck
echo "Token: EDULAB_SIGNATURE_TOKEN_42"
exit 0
EOF
이 파일의 두 가지 특징에 주목해 보십시오. ACME-EDU-2026이라는 식별자와 EDULAB_SIGNATURE_TOKEN_42라는 토큰입니다. 이 두 문자열이 함께 등장하면, 우리는 이 파일군(群)을 정확히 식별할 수 있습니다.
2단계. 시그니처 추출하기
샘플 파일에서 어떤 패턴을 단서로 삼을지 결정합니다. strings 명령어로 후보를 살펴봅니다.
strings suspicious_sample.txt | head -20
분석가는 다음 세 가지 기준으로 시그니처를 고릅니다.
- 고유성: 일반 파일에 잘 등장하지 않는 문자열인가?
- 안정성: 변종이 나와도 유지될 만한 패턴인가?
- 조합 가능성: 다른 패턴과 결합해 false positive를 줄일 수 있는가?
여기서는 ACME-EDU-2026, EDULAB_SIGNATURE_TOKEN_42, 그리고 셸 스크립트의 매직 바이트 #!/bin/bash를 채택합니다.
3단계. YARA 룰 작성하기
이제 실제 룰을 작성합니다. 파일명은 edulab_detector.yar로 합니다.
rule EDULAB_Suspicious_Script
{
meta:
author = "주군의 보안 강의실"
description = "EDULAB 식별자와 토큰을 포함한 셸 스크립트 탐지"
date = "2026-05-23"
version = "1.0"
severity = "medium"
reference = "internal-training-only"
strings:
$magic = "#!/bin/bash"
$id = "ACME-EDU-2026" ascii
$token = "EDULAB_SIGNATURE_TOKEN_42" ascii
$hex_sig = { 23 21 2F 62 69 6E 2F 62 61 73 68 } // "#!/bin/bash"의 hex
condition:
filesize < 10KB
and $magic at 0
and all of ($id, $token)
}
룰의 condition 부분을 한 줄씩 해석해 봅니다.
- filesize < 10KB — 작은 스크립트만 검사 대상으로 좁힙니다. 성능과 정확도 양쪽에 도움이 됩니다.
- $magic at 0 — 파일의 0번 오프셋에 #!/bin/bash가 있어야 합니다. 즉, 진짜 셸 스크립트여야 합니다.
- all of ($id, $token) — 식별자와 토큰이 모두 존재해야 매칭됩니다.
이 세 조건이 and로 묶여 있어, 단순히 bash 문자열만 포함된 평범한 스크립트는 걸리지 않습니다.
4단계. 룰 검증 및 스캔
작성한 룰의 문법을 먼저 검증합니다.
# 문법 검증만 수행
yara -w edulab_detector.yar suspicious_sample.txt
# 매칭된 문자열까지 출력
yara -s edulab_detector.yar suspicious_sample.txt
정상적으로 작성되었다면 다음과 비슷한 결과가 나옵니다.
EDULAB_Suspicious_Script suspicious_sample.txt
0x0:$magic: #!/bin/bash
0x35:$id: ACME-EDU-2026
0xa9:$token: EDULAB_SIGNATURE_TOKEN_42
각 라인은 매칭된 오프셋과 실제 매칭된 바이트열을 보여 줍니다. 분석가는 이 출력으로 "어디서, 무엇이, 어떻게" 걸렸는지 한눈에 파악할 수 있습니다.
5단계. 디렉터리 전체 스캔
실제 운영에서는 디렉터리 트리를 통째로 스캔합니다.
# /var/log 이하의 모든 파일을 재귀적으로 스캔
yara -r edulab_detector.yar /var/log
# 룰 디렉터리의 모든 .yar 파일을 한꺼번에 적용하려면
yara -r rules_dir/ /target/path
⚠️ 주의사항 — 현장에서 마주치는 함정
- False Positive 폭탄: $short = "GET" 같은 너무 짧고 흔한 문자열은 거의 모든 파일에 매칭됩니다. 최소 7~8바이트 이상의 고유한 시퀀스를 권장합니다.
- 인코딩 누락: 윈도우 악성코드는 UTF-16(wide)으로 문자열을 저장하는 경우가 많습니다. $str = "malware" ascii wide처럼 둘 다 명시해야 놓치지 않습니다.
- 시그니처 우회: 공격자가 문자열을 잘게 쪼개거나 XOR 인코딩하면 단순 strings 매칭은 무력화됩니다. 이때는 16진수 패턴이나 pe 모듈을 활용한 구조 기반 탐지를 고려하십시오.
- 성능 부담: 너무 많은 정규표현식은 스캔 속도를 급격히 떨어뜨립니다. 가능하면 단순 문자열과 hex 패턴을 먼저 쓰고, regex는 최후의 수단으로 남겨두는 편이 좋습니다.
- 윤리적 경계: 실제 악성코드를 다룰 때는 격리된 분석 환경(샌드박스, VM)을 반드시 사용하고, 교육·연구 목적 외 배포는 금지됩니다.
✅ 정리 — 사냥꾼의 첫 발자국
YARA는 단순한 도구가 아니라, 보안 분석가의 언어입니다. 의심스러운 패턴을 사람이 읽을 수 있는 형태로 기술하고, 동료와 공유하고, 자동화 파이프라인에 태우는 모든 일이 이 작은 룰 파일 하나에서 시작됩니다.
오늘 우리는 가장 기본적인 룰 한 개를 처음부터 끝까지 만들어 보았습니다. 다음 단계로 나아가고 싶다면 이 길을 따라가 보시기 바랍니다.
- pe, elf, hash, math 모듈 활용 — 구조 기반·엔트로피 기반 탐지
- YARA-X (Rust로 재작성된 차세대 엔진) 성능 비교
- floss, capa로 자동 추출한 패턴을 룰로 변환하는 워크플로우
- Sigma → YARA 변환, ATT&CK 매트릭스 매핑
룰 한 줄이 수천 대의 서버를 지킬 수 있습니다. 주군의 보안 강의실에서, 첫 번째 시그니처가 잘 사냥에 나서기를 바랍니다. 🛡️
'일반IT > IT보안' 카테고리의 다른 글
| 🐍 코드로 사냥하라 — yara-python으로 만드는 자동화된 시그니처 탐지기 (0) | 2026.05.23 |
|---|---|
| 🛡️ GHSA, 데이터베이스가 아닌 "대화"였다 — 2026년, 보안 전문가가 새로 배워야 할 메인테이너 소통의 기술 (0) | 2026.05.12 |
| 🔥 엠바고를 뚫고 풀려난 "Dirty Frag" — Linux 커널 한 줄로 root 따는 신종 LPE (0) | 2026.05.10 |
| 🔐 KDC가 키를 다루는 5가지 방식 — Kerberos 보안의 심장부 (0) | 2026.05.01 |
| 🔐 Diffie-Hellman 키 교환 — 도청당해도 비밀이 새지 않는 이유 (1) | 2026.05.01 |
