이번 글에서는 Sigma Rule의 심장부라고 할 수 있는 selection과 condition을 실전 관점에서 정리해드리겠습니다.

Sigma 공식 문서도 detection 섹션에서 selection 그룹과 condition 필드가 함께 동작해야 하며, 이 조합이 복잡한 불리언 로직과 오탐 필터링을 가능하게 만든다고 설명합니다.

단순히 문법을 외우는 것이 아니라, 실제 SIEM 탐지에서 어떻게 조합해야 하는지 중심으로 살펴보시는 것이 중요합니다.

 

◎ selection과 condition이 하는 일

  • Sigma에서 selection은 “무엇을 잡을 것인가”를 적는 블록이고, condition은 “그 selection들을 어떤 논리로 묶을 것인가”를 적는 한 줄입니다. 
  • 쉽게 말해 selection은 재료, condition은 레시피입니다. 
  • 탐지 대상이 하나면 단순하지만, 실제 공격은 여러 이벤트와 속성이 결합되는 경우가 많기 때문에 condition이 없다면 복잡한 위협을 표현하기 어렵습니다.
  •  
  • SigmaHQ 문서에서는 detection 섹션이 하나 이상의 selection 그룹으로 구성될 수 있고, 각 selection 그룹은 condition에서 참조되어야 한다고 설명합니다.
  • 즉, selection을 아무리 많이 써도 condition에서 연결하지 않으면 규칙은 완성되지 않습니다.

 

기본 문법부터 잡으시죠

 - 가장 단순한 형태는 다음과 같습니다.

detection:
  selection:
    Image|endswith: '\powershell.exe'
    ParentImage|endswith: '\cmd.exe'
  condition: selection

 

  • 이 구조에서는 selection 안의 조건들이 기본적으로 AND로 묶입니다.
  • 즉, powershell.exe가 실행되고 부모 프로세스가 cmd.exe일 때만 매칭됩니다.
  • 이처럼 Sigma는 별도 괄호를 쓰지 않아도 map은 AND, list는 OR로 처리하는 기본 규칙이 있습니다.

 

◎ AND와 OR의 차이

  • 실무에서 가장 많이 헷갈리는 부분이 바로 이 지점입니다.
  • AND는 모든 조건이 동시에 참이어야 합니다.
  • OR는 여러 조건 중 하나만 참이어도 됩니다.
  • 예를 들어 다음 규칙은 cmd.exe와 powershell.exe 중 하나라도 나오면 탐지합니다.
detection:
  selection1:
    Image|endswith: '\cmd.exe'
  selection2:
    Image|endswith: '\powershell.exe'
  condition: selection1 or selection2

 

  • 반대로 두 조건이 모두 만족되어야 하면 and를 씁니다.
  • Sigma specification은 and, or, not의 우선순위도 제공하며, 괄호를 사용해 의도를 명확히 하는 것을 권장합니다.

 

◎ list와 map의 의미

  • Sigma에서는 YAML의 자료구조 자체가 논리와 연결됩니다.
  • map(키-값 구조): 기본적으로 AND입니다.
  • list(배열 구조): 기본적으로 OR입니다.
  • 예를 들어 아래처럼 쓰면, Image 값이 셋 중 하나만 되어도 매칭됩니다.
detection:
  selection:
    Image|endswith:
      - '\cmd.exe'
      - '\powershell.exe'
      - '\wscript.exe'
  condition: selection

 

  • 이 경우 list 내부 값들은 OR로 연결됩니다.
  • 반면 같은 selection 안에 Image와 ParentImage를 함께 쓰면 두 조건은 AND로 묶입니다.
  • 이 규칙을 이해하시면 Sigma 문법이 훨씬 직관적으로 느껴지실 겁니다.

 

◎ selection 그룹을 여러 개 쓰는 이유

  • 실전 탐지에서는 한 가지 패턴만 보는 것이 아니라, 여러 후보군을 나눠서 관리해야 할 때가 많습니다. 
  • 예를 들어 다음처럼 나눌 수 있습니다.
detection:
  selection_cmd:
    Image|endswith: '\cmd.exe'
  selection_ps:
    Image|endswith: '\powershell.exe'
  selection_wmi:
    Image|endswith: '\wmic.exe'
  condition: 1 of selection_*

 

  • 이때 1 of selection_*는 selection_으로 시작하는 모든 그룹 중 하나만 만족하면 된다는 뜻입니다.
  • Sigma 공식 문서는 이런 패턴을 활용하면 OR 로직을 깔끔하게 표현할 수 있다고 안내합니다.
  • 현업에서는 프로세스 계열, 스크립트 계열, LOLBin 계열처럼 범주를 나눠 관리할 때 매우 유용합니다.

 

◎ 1 of them과 all of them

  • Sigma 문법에는 1 of them, all of them도 있습니다.
  • 1 of them: 정의된 selection들 중 하나 이상 참이면 됩니다.
  • all of them: 정의된 selection들이 모두 참이어야 합니다.

 

  • 다만 SigmaHQ는 공유 규칙에서는 all of them보다 all of selection* 같은 구체적인 패턴을 권장합니다.
  • 이유는 downstream 사용자가 필터를 덧붙이거나 룰을 재활용하기 더 쉽기 때문입니다.
  • 따라서 실무 글에서는 1 of selection_*, all of selection_* 형태를 주로 쓰시는 편이 좋습니다.

 

◎ not으로 오탐을 줄이기

  • 탐지 규칙은 잡는 것만큼 빼는 것도 중요합니다. 
  • Sigma 공식 문서도 selection and not filter 형태를 오탐 제거의 대표 패턴으로 설명합니다.

 

  • 예를 들어 PowerShell 탐지에서 관리 작업까지 잡히는 경우가 많습니다.
  • 이럴 때는 필터 블록을 따로 두고 제외합니다.
detection:
  selection:
    Image|endswith: '\powershell.exe'
    CommandLine|contains: 'Invoke-WebRequest'
  filter_legit:
    CommandLine|contains:
      - 'Microsoft.PowerShell'
      - 'Windows Update'
  condition: selection and not filter_legit

 

  • 이 구조를 쓰면 기본 탐지는 유지하면서 잘 알려진 정상 행위만 제외할 수 있습니다.
  • 실무에서는 필터를 너무 많이 넣지 않는 것이 좋지만, 최소한의 허용 목록은 꼭 두시는 편이 안정적입니다.

 

 

 괄호를 쓰면 의도가 더 선명해집니다

  • 복잡한 조건은 괄호로 감싸서 읽기 쉽게 만드는 것이 좋습니다. 
  • Sigma spec은 연산자 우선순위를 or, and, not, x of search-identifier, 괄호 순으로 설명합니다.

 

  • 예시는 아래처럼 쓰실 수 있습니다.
condition: selection_base and (selection1 or selection2) and not filter

 

  • 이렇게 하면 selection_base는 공통 조건, selection1 or selection2는 대체 조건, filter는 제외 조건이라는 구조가 눈에 바로 들어옵니다.
  • 복잡한 상관분석 룰을 만들 때도 이 패턴이 가장 안전합니다.

 

 실전 예제: LOLBin 탐지

  • 아래 예시는 자주 쓰는 LOLBin 탐지를 단순화한 것입니다.
detection:
  selection_cmd:
    Image|endswith: '\cmd.exe'
  selection_ps:
    Image|endswith: '\powershell.exe'
  selection_script:
    Image|endswith:
      - '\wscript.exe'
      - '\cscript.exe'
  filter_admin:
    ParentImage|endswith: '\explorer.exe'
  condition: 1 of selection_* and not filter_admin

 

  • 이 규칙은 cmd, powershell, script 호스트 계열을 넓게 잡되, 특정 정상 패턴은 제외합니다.
  • 1 of selection_*로 OR 묶음을 깔끔하게 표현하고, not filter_admin으로 오탐을 줄인 전형적인 예시입니다.

 

 실무에서 자주 하는 실수

  • 가장 흔한 실수는 selection과 condition을 섞어 쓰는 것입니다. 
  • selection에 너무 많은 조건을 몰아넣고 condition에서 다시 OR/AND를 고민하면 규칙이 금방 지저분해집니다. 
  • 또 다른 실수는 1 of them이나 all of them을 무분별하게 쓰는 것입니다. 
  • 문법상 가능하더라도, 유지보수성과 공유성을 생각하면 selection_* 패턴을 명시적으로 쓰는 편이 낫습니다.

 

  • 또 하나 주의하실 점은, YAML 리스트와 Sigma 논리를 헷갈리지 않는 것입니다.
  • 리스트는 값의 OR이고, map은 필드의 AND라는 기본을 기억하시면 대부분의 혼동이 풀립니다.

 

 마무리

  • selection은 탐지 후보를 정의하는 블록이고, condition은 그 후보를 논리적으로 묶는 규칙입니다. 
  • Sigma에서 이 두 요소를 제대로 다루시면 단일 이벤트 탐지부터 오탐 필터링, 다중 선택자 기반의 복잡한 탐지까지 한 번에 정리하실 수 있습니다.

 

 

 

반응형

+ Recent posts