목표
- yara rule 규칙과 용도에 대해 이해
- yara rule의 이해가 보안관제에 왜 필요할까에 대한 파악
Yara(Yet Another Ridiculous Acronym)
주로 맬웨어 혹은 악성파일 탐지 및 연구에 사용됨. VirusTotal에서 제작한 악성코드의 패턴(시그니처)을 이용하여 특성과 행위를 기준으로 악성코드를 분류하는 도구임. C언어 구문과 매우 유사함. YARA는 파일 및 메모리 분석과 패턴 매칭에 뛰어나고, Sigma는 yaml 파일 형태로 로그 분석과 SIEM 시스템에 능숙함. 또한, Snort는 네트워크 트래픽을 실시간으로 분석하는 침입 탐지 및 방지를 위해 이용함. 즉, Yara는 악성 파일 기반 맬웨어 연구 및 감지에 사용되고, Sigma는 로그 분석을 위한 SIEM 환경에서 사용되고, Snort는 실시간 네트워크 모니터링에 사용됨. Yara 패턴을 생성하면 악성코드 파일 노출에 대한 감지 및 탐지가 가능함.
Yara 예

[그림1] Yara rule 예 - https 형태의 문자열과 숫자로 이루어진 ip 형태를 탐지하는 규칙
Sigma 예
[그림2] sigma 형태 예시
Snort 예
비정상적인 SSH 로그인 시도 탐지 시나리오 (Brute Force Attack : 30초안에 5번 로그인 시도 공격 탐지)
alert tcp any any -> any 22 (msg:"SSH Brute Force Attack"; content:"SSH-2.0"; nocase; threshold:type both, track by_src, count 5, seconds 30; sid:1000001;)
맬웨어(Malware)란?
다른 소프트웨어나 하드웨어를 해치거나 악용하기 위해 만들어진 모든 유형의 소프트웨어임. "악성 소프트웨어"의 줄임말인 맬웨어는 바이러스, 랜섬웨어, 스파이웨어, 트로이 목마 및 악의적인 의도로 만들어진 모든 유형의 코드나 소프트웨어를 설명하는 데 사용되는 총칭이라 할 수 있음.
맬웨어(Malware)와 바이러스(Virus)의 차이점?
바이러스는 특정 유형의 맬웨어이지만, 맬웨어는 바이러스의 자체 복제 능력이 없는 많은 유형의 악성 소프트웨어를 포함하는 일반적인 용어임.
맬웨어에 노출되면 취약한 패스워드를 해독하고, 시스템에 깊이 침투하고, 네트워크를 통해 퍼질 가능성이 있음.
Yara Rule
Yara를 실행하기 위해서는 패턴 정보가 담긴 Yara Rule을 작성하여야 함. Rule 작성은 텍스트 편집기를 이용함.
rule YaraEx //룰 이름
{
meta: //설명
author = ""
type = ""
filetype = ""
version = ""
date = ""
description = ""
strings:
&str = "" //텍스트 스트링 형태
&hex = {} //hex 스트링 형태
$re = // //정규표현식 형태
condition:
all of them //모든 스트링에 적용
}
크게 3부분으로 나눌 수 있음.
meta
주석과 같음. 다른사람들에게 자신이 짠 yara rule의 정보를 전달하기 위해 존재함.
strings
텍스트 스트링 , hex 스트링, 정규 표현식 형태로 작성할 수 있음. 여기에 사용된 식별자를 이용하여 condition 구문을 작성함.
식별자는 앞에 $를 붙임.
텍스트 스트링 ""사이에 작성하며 대소문자를 구분함.
hex 스트링 {}사이에 작성하며 {3 10 F2 A3 A?} 처럼 와일드카드를 사용할 수도 있음.
정규표현식 //사이에 작성하며 정규표현식 기준은 Perl을 따름.
conditions
Boolean 값으로만 결과가 나타남.
all of them : 모든 스트링에 적용
any of them : 스트링 중 최소 하나 적용
all of ($a) : &a로 시작되는 모든 스트링에 적용
any of (&a,&b,&c)* : &a,&b,&c 중 최소 하나 적용
16진수 Strings
rule hexadecimalstrings
{
strings:
$hex_string = { F4 23 [4-6] 62 B4 }
condition:
$hex_string
}
Text Strings
rule TextStrings
{
strings:
$text_string = "foobar"
condition:
$text_string
}
\"
|
이중 따옴표
|
\\
|
백슬래시
|
\r
|
캐리지 리턴
|
\t
|
수평 탭
|
\n
|
새로운 줄
|
\xdd
|
16진법 표기의 모든 바이트
|
nocase Strings
※nocase : 주로 대소문자 구분없이 검색할 때 쓰임.
rule NocaseStrings
{
strings:
$text_string = "foobar" nocase
condition:
$text_string
}
예를 들어, Foobar , FOOBAR, fOoBaR 형태로 검색 가능함.
Base64 strings
rule Base64strings
{
strings:
$a = "This program cannot" base64
condition:
$a
}
Wide-character strings
문자당 2바이트로 인코딩된 문자열을 검색하는데 용이함.
rule WideCharS
{
strings:
$wide_and_ascii_string = "Borland" wide ascii
condition:
$wide_and_ascii_string
}
종류
|
문자열 형태
|
요약
|
nocase
|
텍스트, 정규식
|
대소문자 구분 안 함
|
wide
|
텍스트, 정규식
|
null(0x00) 문자를 끼워 넣어 UTF16을 에뮬레이트함.
|
ascii
|
텍스트, 정규식
|
ASCII 문자도 일치함. wide사용되는 경우에만 필요함.
|
xor
|
텍스트
|
단일 바이트 키가 있는 XOR 텍스트 문자열
|
base64
|
텍스트
|
3개의 base64 인코딩된 문자열로 변환
|
base64wide
|
텍스트
|
3개의 base64 인코딩된 문자열로 변환한 다음 null 문자를 끼워 넣음.wide
|
fullword
|
텍스트, 정규식
|
일치 항목 앞에 영숫자 문자가 오지 않음.
|
private
|
16진수, 텍스트, 정규식
|
출력에 일치 항목이 포함되지 않음
|
Yara rule 패턴을 이용한 PE 파일 구분 규칙 예
rule IsPE
{
condition:
// MZ signature at offset 0 and...
uint16(0) == 0x5A4D and
// ... PE signature at offset stored in MZ header at 0x3C
uint32(uint32(0x3C)) == 0x00004550
}
참고 출처
https://velog.io/@tatamo2966/Yara%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-Yara-Rule-%EC%84%A4%EB%AA%85 [yara rule 개념과 설명]
https://yara.readthedocs.io/en/stable/writingrules.html [Writing Yara Rules]
[What are the differences between Yara, Sigma and Snort rules]
https://www.avg.com/en/signal/what-is-malware [What is Malware]
https://en.wikipedia.org/wiki/YARA [Yara writing by wikipedia]
https://www.picussecurity.com/resource/glossary/what-is-a-yara-rule [What is a yara rule]
https://github.com/woodonggyu/yara/blob/master/How%20to%20Writing%20YARA-Rules.md
[How to Wrting Yara Rules]
https://medium.com/@cloud_tips/sigma-rules-examples-568fd5d02d9a [Sigma rules Examples]
https://sbgg.tistory.com/5 [Yara Rule 자동화 및 Rule 제작]
https://dukkoong.tistory.com/20 [Snort 문법 예제]