0Pricing
Cyber Security Academy · 강의

YARA 규칙 구문

문자열, 조건, 메타데이터

YARA 규칙 구문은(는) CoddyKit의 무료 Cyber Security Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cyber Security Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cyber Security Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

세 가지 섹션

YARA 규칙에는 이름과 최대 세 개의 섹션인 meta, strings, condition이 있습니다. condition이 유일한 필수 섹션이지만 실제 규칙은 세 섹션을 모두 사용합니다.

rule Example_Malware
{
  meta:
    author = "analyst"
    description = "Detects Example family"
  strings:
    $a = "EvilConfig"
    $b = { 6A 40 68 00 30 00 00 }
  condition:
    $a and $b
}

meta 섹션

meta에는 일치에 영향을 주지는 않지만 초기 분류와 유지 관리에 필수적인 설명용 메타데이터가 들어 있습니다.

  • author, date, description
  • reference — 보고서 또는 권고문 링크
  • hash — 규칙을 작성할 때 사용한 샘플
  • tlp — 공유 분류

값은 문자열, 정수 또는 불리언입니다. meta를 문서로 취급해야 합니다. 다음 대응 담당자가 이 정보에 의존하기 때문입니다.

텍스트 문자열

strings 섹션은 패턴에 연결된 식별자($로 시작)를 정의합니다. 가장 단순한 형태는 따옴표로 묶은 텍스트 문자열입니다.

수정자를 사용하면 일치 방식을 세밀하게 조정할 수 있습니다.

  • nocase — 대소문자를 구분하지 않음
  • wide — UTF-16(문자당 2바이트이며 Windows에서 흔히 사용됨)
  • ascii — ASCII(기본값이며, wide와 함께 사용하면 두 형식 모두와 일치)
  • fullword — 완전한 단어로 나타날 때만 일치
strings:
  $s1 = "cmd.exe /c" nocase
  $s2 = "InjectDll" wide ascii
  $s3 = "admin" fullword

16진수 문자열

바이너리 패턴에는 중괄호로 묶은 16진수 문자열을 사용합니다. 이는 원시 바이트와 일치하므로 연산 코드, 매직 넘버, 구조에 적합합니다.

16진수 문자열은 다음과 같은 유연한 기능을 지원합니다.

  • ?? — 임의의 니블/바이트
  • [n-m] — n개에서 m개의 임의 바이트를 건너뜀
  • ( A | B ) — 대안
strings:
  $h1 = { 4D 5A 90 00 }
  $h2 = { E8 ?? ?? ?? ?? 83 C4 04 }
  $h3 = { 6A 00 [2-6] FF 15 ?? ?? ?? ?? }
  $h4 = { ( B8 | B9 ) 00 00 00 00 }

정규 표현식

YARA는 슬래시로 구분된 정규식 패턴을 지원하며, 텍스트 문자열과 동일한 수정자를 사용합니다. 패턴이 달라지지만 구성 표시자나 생성된 뮤텍스 이름처럼 일정한 구조를 따를 때 정규식을 사용합니다.

정규식은 강력하지만 비용이 큽니다. 가능하면 고정 문자열이나 16진수를 우선 사용하고, 전체 파일을 검사하지 않도록 정규식의 범위를 엄격하게 제한하십시오.

strings:
  $re1 = /mutex_[a-f0-9]{8}/ nocase
  $re2 = /https?:\/\/[a-z0-9]{12,20}\.top\// ascii

condition 섹션

condition은 일치 여부를 결정하는 불리언 표현식입니다. 문자열 식별자를 직접 참조하십시오. 단독으로 사용한 $a는 해당 문자열이 발견되면 참입니다.

and, or, not 및 괄호와 결합하십시오. 실제 패밀리 탐지를 우연한 일치와 구분하는 논리를 작성하는 곳입니다.

condition:
  $a and ($b or $c) and not $benign

개수 세기와 집합

YARA는 문자열 집합에 적용할 수 있는 다양한 수량자를 제공합니다.

  • any of them / all of them
  • 2 of ($s*) — 그룹 중 최소 두 개
  • #a > 3 — $a의 일치 횟수가 3보다 큼

이를 사용하면 다섯 개의 패밀리 표지 중 세 개처럼 일정 수의 표지를 요구하여 민감도와 오탐 사이의 균형을 맞출 수 있습니다.

condition:
  3 of ($str*) and #marker >= 2

오프셋과 파일 크기

조건에서는 일치가 어디에서 발생하는지와 파일 크기를 참조할 수 있습니다.

  • $a at 0 — 일치가 오프셋 0에서 발생해야 함
  • $a in (0..1024) — 바이트 범위 내
  • filesize — 전체 크기, 예: filesize < 200KB
  • uint16(0) == 0x5A4D — 오프셋에서 정수를 읽음(여기서는 MZ 헤더)

일치 위치를 고정하면 오탐을 크게 줄이고 검사 속도를 높일 수 있습니다.

condition:
  uint16(0) == 0x5A4D and filesize < 500KB and $payload

모듈

YARA 모듈은 구조화되고 형식을 인식하는 데이터를 제공하므로, 조건에서 원시 바이트 대신 분석된 필드를 기준으로 판단할 수 있습니다.

  • pe — PE imports, 섹션, 진입점, 서명, imphash
  • hash — 영역의 md5/sha256 계산
  • math — entropy 및 통계
  • elf, dotnet, magic

예를 들어 pe를 가져오면 문자열 리터럴보다 훨씬 견고하게 가져온 함수나 특정 imphash를 기준으로 일치시킬 수 있습니다.

import "pe"
condition:
  pe.imphash() == "a1b2c3d4e5f6..." and
  pe.imports("kernel32.dll", "VirtualAllocEx")

집합 순회

더 복잡한 논리를 위해 YARA는 for를 사용한 컬렉션 순회를 지원합니다. 예를 들어 특정 속성을 만족하는 오프셋이 최소 두 개이거나, 어느 섹션 이름이 패턴과 일치한다는 조건을 표현할 수 있습니다.

단일 값이 아니라 길이가 가변적인 목록을 검사해야 하는 PE 섹션이나 imports 같은 모듈 데이터를 다룰 때 특히 중요합니다.

import "pe"
condition:
  for any i in (0..pe.number_of_sections - 1) : (
    pe.sections[i].name == ".evil"
  )

전역, 비공개, 태그

규칙 수준 키워드는 규칙 집합을 구성합니다.

  • global rule — 해당 조건이 파일의 다른 모든 규칙을 제어함(예: PE 파일만 검사)
  • private rule — 재사용 가능한 구성 요소이며, 자체적으로는 보고되지 않지만 다른 규칙에서 참조할 수 있음
  • 규칙 이름 뒤의 태그는 탐지를 분류함(예: 결과 필터링용)
global private rule IsPE { condition: uint16(0) == 0x5A4D }

rule Dropper : trojan dropper {
  strings: $a = "drop_payload"
  condition: $a
}

빠른 확인

조건이 얼마나 견고한지 판단하십시오.

복습

YARA 규칙 구문 한눈에 보기:

  • 규칙 = meta + strings + condition
  • 텍스트 문자열과 대소문자 무시, 와이드, ASCII, 완전한 단어 수정자
  • 16진수 문자열과 와일드카드 ??, 점프 [n-m], 대안
  • 구조화된 가변 패턴을 위한 정규식(신중하게 사용)
  • condition은 문자열을 논리곱, 논리합, 부정으로 결합함
  • 수량자: 일부/전체/N개 및 개수 #a
  • 위치 고정: 위치 지정, 범위 지정, 파일 크기, 정수 읽기
  • 모듈(PE, 해시, 수학)은 구조화된 데이터와 imphash를 기준으로 일치시킴
  • global, private, 태그로 규칙 집합을 구성함

다음: 문자열과 16진수를 활용한 실전 탐색입니다.

자주 묻는 질문

“YARA 규칙 구문” 강의는 무료인가요?

네 — “YARA 규칙 구문” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cyber Security Academy 강의 전체를 잠금 해제할 수 있습니다. Cyber Security Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“YARA 규칙 구문”에서 뭘 배우나요?

문자열, 조건, 메타데이터 브라우저에서 직접 실행하는 실습 코드로 Cyber Security Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Cyber Security Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Cyber Security Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“YARA 규칙 구문” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Cyber Security Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Cyber Security Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. YARA의 용도
  2. YARA 규칙 구문
  3. 문자열과 16진수로 헌팅하기
  4. 검색 확장 및 자동화
← Cyber Security Academy(으)로 돌아가기