YARA 요원 각성하다: 더 빠르고 강력해진 YARA-X의 탄생

Post image

사이버 보안 회사 ‘시큐어 오피스’의 명물, 범인(악성 앱) 추리 전문가 YARA 요원!

그는 파일의 미세한 흔적만으로 범인을 특정하는 최고의 베테랑이었습니다. 하지만 어느 날, 대표는 그를 호출해 고민을 털어놓았죠.


YARA 요원, 실력은 최고지만... 가끔 너무 느려서 말이야.

충격을 받은 YARA 요원은 자신의 업무 수행 방식을 처음부터 끝까지 뜯어고치기 시작했습니다.

비효율적인 루틴은 버리고 최신 기술로 온몸을 무장했죠. 마침내 모든 준비를 마친 그는 다짐했습니다.


지금부터 나는 새로 태어난 거야. 그 의미를 담아 X를 붙여, YARA-X라고 칭하겠다!

오늘은 바로, 구시대의 명탐정 YARA가 차세대 특급 요원 YARA-X로 각성한 첫날의 이야기입니다.



우리는 YARA를 어떻게 기억하고 있나요?

YARA는 악성코드 분석가가 만든 ‘디지털 지문 인식 카드’와 같습니다. 더 정확히는 보안 전문가들이 악성 파일에서 발견되는 텍스트나 바이너리 패턴을 기반으로 이러한 ‘인식 카드(룰)‘를 직접 만들 수 있게 해주는 강력한 도구입니다.

이 카드에 악성코드만의 고유한 특징(지문)을 기록해 두면 수많은 파일 더미 속에서도 특정 악성코드 군(family)이나 공격 그룹의 활동 흔적을 정확하고 신속하게 찾아낼 수 있습니다.

즉, YARA는 수동 분석의 한계를 넘어 자동화된 위협 헌팅(Threat Hunting)을 가능하게 하는 핵심 기술입니다.


이 ‘인식 카드’는 크게 세 부분으로 구성됩니다.

  • meta: 룰의 프로필. 누가, 언제, 왜 만들었는지 등 룰에 대한 부가 정보를 기록합니다.
  • strings: 결정적 증거. 악성코드만이 가진 특징적인 문자열이나 코드 조각(Hex)을 변수로 지정합니다.
  • condition: 수사 원칙. strings에 정의된 증거들이 어떤 조건으로 존재할 때 ‘범인’으로 확정할지 논리적으로 정의합니다.
rule silent_banker : banker {
    meta:
        description = "This is just an example"
        threat_level = 3
        in_the_wild = true

    strings:
        $a = {6A 40 68 00 30 00 00 6A 14 8D 91}
        $b = {8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9}
        $c = "UVODFRYSIHLNWPEJXQZAKCBGMT"

    condition:
        $a or $b or $c
}

특급 요원 YARA-X, 무엇이 달라졌나?

YARA-X는 기존 YARA를 Rust 언어로 완전히 재작성한 후계자입니다. 두 요원의 핵심적인 차이점을 표로 비교해 보겠습니다.

YARA vs YARA-X 핵심 차이점 비교
구분 YARA YARA-X
개발 언어 C Rust (메모리 안정성 및 성능 향상)
성능 (단순 룰) 우세 상대적 열세
성능 (복잡한 룰) 열세 월등히 빠름
사용자 경험 기본적인 CLI, 간결한 결과 출력 현대적 CLI (컬러, 상세 정보, 자동 완성), 친절한 오류 메시지
API 호환성 기존 방식 유지 코드 수정 필요
주요 기능 프로세스 스캐닝 지원 프로세스 스캐닝 미지원
향후 업데이트 버그 수정 등 안정성 위주 (신규 기능 없음) 모든 신규 기능 및 성능 향상 집중
장점 가볍고 빠름 (단순 룰), 높은 안정성, 프로세스 스캐닝 가능 복잡한 룰 처리 성능, 뛰어난 사용자 경험, 높은 확장성
단점 복잡한 룰 처리 시 성능 저하, 기능 확장 중단 API 비호환성, 일부 기능 미지원

이 외에도 명령어 사용법과 같은 부분이 변경되었습니다. 자세한 내용은 공식 문서를 참고해 주세요.

더 엄격하고 명확해진 룰(Rule) 문법

룰을 직접 작성하는 분석가에게 가장 크게 와닿는 부분은 바로 룰 문법의 엄격성일 것입니다. YARA-X는 잠재적인 오류를 원천적으로 방지하기 위해 문법을 더욱 엄격하게 적용하며, 특히 정규 표현식(Regex)에서 그 차이가 두드러집니다.


  • { 기호 처리
    • YARA: [0-9]{1,5} 처럼 반복 횟수를 지정하는 경우가 아니면, { 기호를 그냥 문자 그대로 인식했습니다. 하지만 이는 [0-9]{1:5} 처럼 쉼표(,)를 콜론(:)으로 잘못 쓴 경우, 오류를 알려주는 대신 {1:5}라는 문자열을 찾는 룰로 동작해버리는 문제를 낳았습니다.
    • YARA-X: 이런 모호함을 없앴습니다. 반복 연산자가 아닌 문자 {는 반드시 \{ 처럼 이스케이프(\) 처리를 해야만 합니다. 만약 [0-9]{1:5}라고 잘못 쓰면, YARA-X는 “이건 유효하지 않은 문법입니다"라고 즉시 오류를 알려주어 개발자의 실수를 바로잡게 돕습니다.

이러한 엄격함은 처음에는 조금 불편할 수 있지만 장기적으로는 훨씬 더 정확하고 신뢰성 높은 룰을 만드는 데 큰 도움이 됩니다. 이 외에도 여러 문법적 차이점이 있으며 더 자세한 내용은 공식 문서에서 살펴볼 수 있습니다.

문법 차이: 실제 룰 비교

실제 룰을 비교해 보면 차이점이 더 명확하게 와닿습니다. IP 주소와 포트 번호를 찾는 정규 표현식 룰을 예로 들어보겠습니다.


기존 YARA 방식 (오류 가능성이 있는 룰)

rule Find_IP_Port_YARA
{
    strings:
        // 의도: 1~5자리 포트 번호를 찾으려 했으나, 쉼표(,)를 콜론(:)으로 잘못 입력
        $regex = /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):[0-9]{1:5}/
    condition:
        $regex
}

이 룰에서 YARA는 [0-9]{1:5}를 오류로 판단하지 않고 {1:5}라는 문자열을 찾는 것으로 해석합니다. 이는 분석가의 의도와 전혀 다른 결과를 낳을 수 있습니다.


YARA-X 방식 (오류를 방지하는 룰)

rule Find_IP_Port_YARAX
{
    strings:
        // 올바른 문법: 1~5자리 포트 번호를 정확히 찾음
        $regex = /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):[0-9]{1,5}/
    condition:
        $regex
}

YARA-X에서는 위와 같이 정확하게 작성해야만 합니다. 만약 기존 YARA 방식처럼 [0-9]{1:5}라고 작성하면 문법 오류 메시지를 즉시 보여주어 실수를 바로잡을 수 있게 해줍니다. 이처럼 YARA-X는 더 엄격한 문법을 통해 룰의 정확성을 높여줍니다.


YARA와 YARA-X 누가 더 빠를까?

그러면 YARA와 YARA-X 누가 더 빠른 속도로 범인을 찾아낼까요?

YARA 엔진에 큰 부하를 주는 것으로 알려진 두 가지 룰을 통해 성능을 직접 비교해 보겠습니다.


  • cafebabe: 파일 전체를 1바이트씩 순회하며 특정 매직 넘버(0xCAFEBABE)를 찾는 극심한 반복문을 수행하는 룰
  • bitcoin_address: 복잡한 정규 표현식을 사용해 비트코인 지갑 주소 패턴을 찾는 룰
// 부하 테스트용 룰
rule cafebabe {
  condition:
    for any i in (0..filesize-1) : (
      uint32(i) == 0xCAFEBABE
    )
}

rule bitcoin_address {
  strings:
    $btc = /(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,39}/ fullword
  condition:
    $btc
}
YARA 실행 결과

YARA의 경우, 이 룰들을 실행했을 때 약 2.3초 가량의 시간이 걸렸습니다. 역시 정규 표현식이나 무수한 반복문 앞에서는 베테랑 YARA 요원도 힘겨워하는 모습입니다.

image.png

YARA-X 실행 결과

반면, YARA-X는 동일한 임무를 약 0.7초 만에 끝냈습니다. 복잡한 조건에서도 준수한 성능을 보여주는 차세대 요원다운 모습입니다.

image.png

하지만… 항상 YARA-X가 빠른 것은 아닙니다

흥미롭게도 단순한 문자열을 찾는 작업에서는 YARA가 YARA-X보다 더 빠른 성능을 보여줍니다. 물론 두 엔진 모두 0.02초 이내로 작업을 끝내기 때문에 체감상 큰 차이는 없지만, YARA의 경량성과 최적화가 돋보이는 부분입니다.

image.png


결론

지금까지 YARA와 YARA-X에 대해 가볍게 다뤄보았습니다. 오랜 시간 우리 곁을 지켜온 YARA 요원, 이제 그의 시대가 저물고 있습니다. 공식적으로 YARA는 앞으로 버그 수정 등 안정성 위주의 유지보수에 들어가며 더 이상의 기능 업데이트는 없을 것이라고 합니다.

공격 기술이 끊임없이 진화하듯, 우리가 사용하는 분석 도구 역시 시대의 흐름을 따라가는 것이 중요합니다. YARA-X는 단순히 속도만 내세우는 요원이 아닙니다. 친절한 오류 메시지로 더 똑똑하게, Rust 언어의 안정성으로 더 튼튼하게, 엄격한 문법으로 더 정확하게 임무를 수행하는 차세대 표준이기 때문입니다.

물론 아직은 API 호환성 문제나 일부 기능(프로세스 스캐닝)이 지원되지 않는 등 몇 가지 과제가 남아있습니다. 하지만 이는 시간이 해결해 줄 문제입니다. ‘시큐어 오피스’의 YARA 요원이 스스로를 YARA-X로 업그레이드했듯이 우리 역시 새로운 시대의 흐름에 발맞춰야 합니다.

여러분의 분석팀에 구시대의 베테랑을 넘어 미래를 책임질 특급 요원 YARA-X를 영입해 보는 것은 어떨까요?


참고자료

You May Also Like

신규 유행 교통정보센터 사칭 악성 앱 분석

신규 유행 교통정보센터 사칭 악성 앱 분석

최근 발견된 ‘교통정보센터’ 사칭 악성 앱은 설치 직후 ‘조회하기’ 버튼 클릭만으로 실제 정부 공식 사이트(예: 환경부, 정부24 등)로 즉시 리디렉션되어, 사용자가 별다른 의심 없이 정상 서비스로 오인하도록 설계된 것이 특징이다. 이 악성 앱은 다음과 같이 동작한다.