엔지니어링

DGA 탐지를 위해 지도 및 비지도 머신 러닝 결합

Editor’s Note — December 21, 2020: This blog has been updated since its original release to include a use case that applies this workflow to the SUNBURST attack.

Elastic 최초의 지도 머신 러닝 및 보안 통합 패키지 소식을 전해드리게 되어 기쁩니다! 바로 오늘 네트워크 데이터에서 DGA(도메인 생성 알고리즘) 활동을 탐지할 수 있는 지도 머신 러닝 솔루션 패키지가 릴리즈됩니다.

이번 릴리즈에는 완벽하게 훈련된 탐지 모델 외에도, 설정부터 DGA 탐지까지의 여정을 쉽고 원활하게 진행하도록 도와줄 수집 파이프라인 구성, 이상 징후 탐색 작업 및 탐지 규칙이 포함되어 있습니다. 탐지 규칙 리포지토리로 이동하여 지도 머신 러닝으로 네트워크에서 DGA 활동을 탐지하는 방법을 확인하고 바로 Elastic Security 무료 체험판을 시작해 보세요. 

DGA: 세부 정보

DGA(도메인 생성 알고리즘)는 수많은 malware 작성자가 사용하는 기법으로, 방어 조치를 피해 감염된 클라이언트 시스템을 숨기려고 할 때 사용됩니다. 이 기법의 목적은 무작위로 생성된 수백 또는 수천 개의 도메인 이름을 사용하여 감염된 클라이언트 시스템과 C&C 또는 C2(Command and Control) 서버 간 통신을 숨기는 것입니다. 이러한 도메인 이름은 궁극적으로 C&C 서버의 IP 주소입니다.

잠시 여러분이 전쟁터의 군인이라고 상상해 보면 DGA 공격이 어떻게 이루어지는지 조금 더 쉽게 시각화할 수 있습니다. 여러분은 다른 군인들처럼 무선 주파수를 사용하는 통신 장비를 가지고 있습니다. 적군은 무선 주파수를 교란하여 통신을 방해하려고 할 것입니다. 이에 대한 대응책 한 가지가 주파수 호핑입니다. 즉, 전송 과정에서 주파수를 매우 빠르게 변경하는 무선 시스템을 사용하는 것입니다. 적군에게는 주파수가 예측 불가능하게 무작위로 변경되는 것처럼 보이므로 교란하기가 어렵습니다.

DGA는 malware의 주파수 호핑 통신 채널과 같습니다. DGA가 도메인 이름을 너무 자주 변경하므로 DNS 도메인 이름을 차단하는 방법으로는 malware의 C2 통신 채널을 차단하는 것이 불가능합니다. 식별 및 차단을 시도하기에는 무작위로 생성된 DNS 이름이 너무 많기 때문입니다. 

이 기법은 Conficker 웜이 통신에 무작위로 생성된 도메인 이름을 대규모로 사용하기 시작한 2009년에 malware 세계에 등장했습니다. Conficker 웜 작성자는 보안 연구자 컨소시엄에서 웜이 통신에 사용하던 DNS 도메인을 종료시켜 웜의 C2 채널을 차단하자 이 대책을 개발했습니다. 2017년 전 세계로 확산된 WannaCry 랜섬웨어의 경우에도 DNS 공격 완화가 수행되었습니다.

자연스럽게 섞이기

나무를 숨기기에 가장 좋은 장소가 숲이듯이, malware 운영자들은 정상적인 웹 트래픽과 섞이는 것이 탐지를 피하는 가장 좋은 방법이라는 것을 잘 알고 있습니다. 무작위로 생성된 도메인 이름을 사용한 HTTP 요청은 네트워크 보안 모니터링 및 탐지에 골칫거리입니다. 현대 네트워크에서 흐르는 HTTP 트래픽의 방대한 양을 고려할 때 수동 검토는 불가능합니다. 일부 malware와 봇에는 검색 규칙을 사용하여 경보를 제공할 수 있는 비정상적인 사용자 에이전트 스트링이 있습니다. 하지만 malware 작성자는 웹 브라우저와 전혀 다르지 않아 보이는 사용자 에이전트 스트링을 아주 간단하게 활용할 수 있습니다.

모바일 및 IoT 사용이 증가하면서 사용자 에이전트 스트링이 너무 많아져 의심스러운 활동을 수동으로 검토하는 것 또한 불가능해지고 있습니다. 오랫동안 웹 프록시는 의심스러운 것으로 알려진 URL을 찾는 방법으로 분류를 사용했지만, DGA 도메인은 너무 방대하고 수명이 짧아 분류되지 않는 경우가 많습니다. 위협 인텔리전스 피드는 알려진 malware 제품군 및 캠페인과 관련된 IP 주소 및 HTTP 요청을 식별할 수 있습니다. 그러나 이러한 알려진 목록은 malware 운영자의 활동으로 너무 쉽게 변경되므로 우리가 이를 검색에 사용하는 시점에는 이미 쓸모가 없어집니다.

많은 조직에서 수집하는 네트워크 트래픽의 엄청난 양과 DGA 생성 도메인의 무작위 특성으로 인해 규칙 기반 기법으로는 이러한 활동을 탐지하는 것이 어렵지만, 지도 머신 러닝 모델에는 꼭 맞는 작업입니다. 추론을 사용하는 Elastic의 DGA 탐지 머신 러닝 모델은 Packetbeat DNS 데이터가 Elasticsearch 클러스터에 수집될 때 이를 검사하여 잠재적인 악성 도메인을 자동으로 파악합니다. 다음 섹션에 설명된 단계를 따라 시작해 보세요. 

시작하기

Elastic Security 앱에서 DGA 탐지를 시작할 수 있도록 공개적으로 사용 가능한 규칙 리포지토리에 일련의 기능을 릴리즈했습니다. 따라서 간편하게 머신 러닝 모델을 Elastic Stack으로 가져올 수 있습니다. 이 리포지토리는 커뮤니티가 위협 탐지를 위해 협력할 수 있는 장소를 제공할 뿐만 아니라 규칙을 테스트하고 검증하는 데 필요한 도구를 공유할 수 있는 장소로도 사용할 수 있습니다.

이니셔티브에 대한 자세한 내용은 이전 블로그웨비나를 참조하세요. 아직 Elastic Cloud를 구독하지 않으셨다면 14일 무료 클라우드 체험판을 통해 지도 머신 러닝 패키지를 사용하여 DGA 활동을 탐지해 볼 수 있습니다.

이 규칙 툴킷에는 규칙을 테스트할 뿐만 아니라 스택과 상호 작용도 할 수 있는 CLI(명령줄 인터페이스)가 포함되어 있습니다. 예를 들어 Kibana API와 상호 작용할 수 있도록 다양한 Python 라이브러리를 릴리즈했습니다. 이는 모델 종속성을 가져와서 규칙을 작동시키는 프로세스를 좀 더 쉽게 만드는 데 중요한 역할을 했습니다. DNS 데이터를 보강하고 DGA 활동에 대한 경보를 받으려면 다음 3가지 단계를 따르세요.

1단계: 모델 가져오기

먼저, DGA 모델, Painless 스크립트, 수집 프로세서를 스택으로 가져와야 합니다. 현재 그리고 앞으로도 DGA 모델 및 이상 징후 탐색을 위한 모든 비지도 모델은 github 릴리즈를 통해 detection-rules 리포지토리에서 제공됩니다. 업로드하려면 다음 CLI 명령을 실행합니다.

python -m detection_rules es <args_or_config> experimental setup-dga-model -t <release-tag>

업로드한 후에는, 모델이 DGA 점수로 Packetbeat DNS 이벤트를 보강하므로 Packetbeat 구성을 업데이트해야 합니다. 추가 구성을 Elasticsearch 출력 구성에 추가하기만 하면 업데이트는 간단하게 완료됩니다.

output.elasticsearch:
hosts: ["your-hostname:your-port"]
pipeline: dns_enrich_pipeline

그러면 지도 모델이 다음과 같은 ECS 필드를 포함하는 Packetbeat DNS 이벤트를 분석하고 보강합니다.

dns.question.name
dns.question.registered_domain

그런 다음 이 모델은 처리된 DNS 이벤트에 다음 필드를 추가합니다.

필드 이름 설명
ml_is_dga.malicious_prediction 값 ‘1’은 해당 DNS 도메인이 악의적인 DGA 활동의 결과로 예측된다는 것을 나타냅니다. 값 ‘0’은 해당 DNS 도메인이 무해한 것으로 예측된다는 것을 나타냅니다. 
ml_is_dga.malicious_probability 해당 DNS 도메인이 악의적 DGA 활동의 결과일 확률 점수(0과 1 사이)입니다.

다음은 보강된 DNS 데이터의 샘플 스크린샷입니다.

참고: 자세한 내용은 detection-rules readme 파일은 참조하세요.

DGA 규칙 소개

DGA 활동을 탐지하고 경고하는 조건부 검색 규칙을 몇 가지 살펴보겠습니다. 패키지에는 Elastic Security 앱의 탐색 엔진에서 활성화하여 실행할 수 있는 두 가지 검색 규칙이 제공되어 있습니다.

  1. Machine Learning Detected a DNS Request Predicted to be a DGA Domain
  2. Machine Learning Detected a DNS Request With a High DGA Probability Score

첫 번째 규칙은 DGA 예측 값이 1인 모든 DNS 이벤트를 검색하며, DNS 도메인 이름이 도메인 생성 알고리즘의 산물일 수 있으므로 의심스럽다는 것을 나타냅니다. 여기에 제공되어 있는 규칙은 다음 조건을 찾습니다.

event.category:network and network.protocol:dns and ml_is_dga.malicious_prediction: 1

두 번째 규칙은 DGA 확률 점수가 0.98보다 높은 모든 DNS 이벤트를 검색하며, DNS 도메인 이름이 도메인 생성 알고리즘의 산물일 수 있으므로 의심스럽다는 것을 나타냅니다. 여기에 제공되어 있는 규칙은 다음 조건을 찾습니다.

event.category:network and network.protocol:dns and ml_is_dga.malicious_probability > 0.98

Elastic 탐색 엔진의 다른 모든 규칙과 마찬가지로 이러한 규칙도 로컬 조건에 맞게 포크 및 사용자 정의할 수 있습니다. 두 번째 규칙의 확률 점수의 경우, 여러분의 DNS 이벤트에서 다른 확률 점수가 더 효과가 있다면 이 점수를 위 또는 아래로 조정할 수 있습니다. 경보 대기열에서 DGA 탐지의 우선순위를 높이려는 경우에는 각 규칙의 위험 점수를 높이면 됩니다. 규칙에 예외를 추가하면 임의 순서 도메인 이름을 사용할 수 있는 CDN(콘텐츠 전송 네트워크) 도메인과 같은 오탐을 무시할 수 있습니다.

향후에 살펴보려고 하는 또 다른 탐지 기법은 EQL(Event Query Language)을 사용하여 이상 징후 클러스터를 찾거나 다변량 상관관계를 사용하여 검색 기반 경보를 찾는 것입니다. 예를 들어 DGA일 가능성이 높은 활동에 참여하는 호스트에서 경보 클러스터를 발견하면, 주의가 필요한 malware가 탐지되었음이 더 확실해집니다.

이러한 클러스터는 드문 프로세스, 네트워크 프로세스, 도메인 또는 URL과 같은 다른 이상 징후 탐지 경보와 결합된 DGA 경보로 구성될 수 있습니다. 이러한 추가적인 이상 징후 탐색은 Elastic Security 앱에 포함된 머신 러닝 패키지 라이브러리에서 제공됩니다.

2단계: 규칙 가져오기

DGA 패키지의 규칙은 detection-rules CLI에서 kibana upload-rule 기능을 사용하여 가져올 수 있습니다(.toml 형식). 이 detection-rules 리포지토리 릴리즈에서 제공하는 규칙은 .toml 형식이므로, 다음 명령을 실행하기만 하면 리포지토리의 규칙을 업로드할 수 있습니다.

python -m detection_rules kibana upload-rule -h
Kibana client:
Options:
--space TEXT Kibana space
-kp, --kibana-password TEXT
-ku, --kibana-user TEXT
--cloud-id TEXT
-k, --kibana-url TEXT
Usage: detection_rules kibana upload-rule [OPTIONS] TOML_FILES...
Upload a list of rule .toml files to Kibana.
Options:
-h, --help Show this message and exit.
-h, --help Show this message and exit.

3단계: 규칙 활성화 및 활용

훈련된 지도 머신 러닝 모델을 스택으로 가져왔고 DNS 이벤트가 보강되었고 규칙도 가져왔으므로, 이제 규칙이 활성화되었는지 확인한 후 경보를 기다리기만 하면 됩니다! 

탐색 엔진에서 규칙을 확인할 때 다음과 같이 활성화되었는지 확인합니다.


그리고 이제 경보가 울리길 기다립니다. 경보가 발생하면 타임라인 기능을 사용하여 DNS 이벤트를 조사할 수 있습니다.

그러나 어떤 머신 러닝 모델도 완벽하지는 않습니다! 일부 무해한 도메인은 잘못 레이블이 지정되어 오탐으로 이어질 수 있습니다. 다음 섹션에서는 이번 릴리즈에서 제공하는 미리 구성된 이상 징후 탐색 작업 및 관련 규칙을 활용하여 오탐을 없애는 방법에 대해 알아보겠습니다.

오탐 발생? 이상 징후 탐색으로 보완!

어떤 탐지 기법을 사용하든 언제나 오탐이 일부 발생합니다. 이는 악의적으로 보이지만 실제로는 해당 환경에서 정상적인 사용자 정의 도메인 또는 CDN 트래픽일 수 있습니다. Elastic에서는 DGA 탐지가 사용자별 환경에 맞춰 적용되도록 experimental-high-sum-dga-probability라고 하는 미리 구성된 이상 징후 탐색 작업을 만들었습니다. 이 머신 러닝 작업이 활성화되면, DGA 탐지 지도 모델이 생성한 DGA 점수를 검사하고 특정 소스 IP 주소에서 비정상적으로 높은 점수를 보이는 이상 패턴을 찾습니다. 이러한 이벤트에는 이상 징후 점수가 할당됩니다.

이상 징후 탐색 작업의 이점을 극대화하기 위해 Potential DGA Activity라는 보완 규칙을 함께 릴리즈했습니다. 따라서 Elastic Security 앱의 탐지 페이지에서 이상 징후 기반 경보가 생성됩니다.

미리 구성된 이상 징후 탐색 작업과 보완 규칙은 모두 detection-rules 리포지토리 릴리즈에서 제공되어 있습니다. 

환경에 적합한 구성을 선택하는 방법

이 모든 것은 DGA 활동을 탐지하는 지도 모델에서 시작됩니다. 이 모델은 Packetbeat를 통해 수집된 모든 DNS 요청을 분석하여 요청과 관련된 도메인이 악성일 가능성을 나타내는 확률 점수를 할당합니다. ‘시작하기’ 섹션에서 다룬 조건부 로직을 사용하여 Elastic Security 앱에서 바로 지도 모델의 출력을 사용하거나, 미리 구성된 이상 징후 탐색 작업 및 규칙을 가져와 활성화한 후 환경의 세부 요소에 맞게 추가로 사용자 정의할 수 있습니다. 

환경에 적합한 구성을 선택하려면 어떻게 해야 할까요? 간단하게 시작할 수 있습니다. ‘시작하기’ 섹션에서 다룬 조건부 검색 규칙을 활성화합니다. 이러한 규칙을 지도 모델의 출력에 바로 적용하여 환경의 백그라운드 노이즈 중 오탐이 얼마나 많은지 빠르게 파악할 수 있습니다. 조건부 검색 규칙을 지도 모델의 출력에 바로 적용했을 때 경보가 너무 많이 발생하는 경우에는 이상 징후 탐색 작업을 가져와서 활성화하는 것이 좋습니다. 

특히, 이상 징후 탐색 작업의 결과에 머신 러닝 탐지 규칙을 적용함으로써 개별 DGA 점수에 대해 하나씩 경보를 생성하는 대신 이를 집계하면 DGA 활동이 많은 소스를 찾는 데 유용할 수 있습니다. 실행 중인 머신 러닝 모듈이 없다면 무료 체험판을 시작하거나 Elastic Cloud에서 사용해 볼 수 있습니다.

다음은 이번 릴리즈에서 제공하는 이상 징후 탐색 모델 및 관련 규칙을 보여주는 샘플 스크린샷입니다.

experimental-high-sum-dga-probability 비지도 머신 러닝 작업의 출력 화면

위의 비지도 머신 러닝 작업 출력에 적용된 Potential DGA Activity 머신 러닝 규칙의 출력 화면

Machine Learning Detected a DNS Request With a High DGA Probability Score 검색 규칙에 따라 생성된 경보 화면

Machine Learning Detected a DNS Request Predicted to be a DGA Domain 검색 규칙에 의해 생성된 경보 화면

사례 연구: SUNBURST 공격에서 실제 DGA 활동 탐지

앞에서 살펴본 실험적 DGA 워크플로우를 최근 발생한 SUNBURST 캠페인에 적용해 보겠습니다. 

요약하자면, 2020년 12월 13일에 SolarWinds가 Orion 네트워크 관리 플랫폼에 대한 공급망 공격과 관련하여 보안 권고를 발표했습니다. 이 블로그 작성 당시, 공급망 공격은 2020년 3월부터 6월까지 릴리즈된 Orion 버전에 영향을 미쳤습니다. 이와 마찬가지로 2020년 12월 13일에 FireEye가 Orion 소프트웨어의 일부 버전에 영향을 미친 SolarWinds 공급망 침해와 관련된 글로벌 캠페인 정보를 발표했습니다.

Elastic에서는 이전에 Elastic 사용자를 대상으로 SolarWinds 사례(보통 SUNBURST라고 함)를 다룬 블로그 게시물을 올린 적이 있습니다. 이 게시물에서는 Elastic Endgame과 Elastic 엔드포인트 보안에서 사용하는 Endpoint Security의 malware 방지 기술이 SolarWinds 공개 정보에 설명된 공격을 탐지하도록 업데이트되었다는 내용을 다루었습니다.

SUNBURST는 malware를 SolarWinds Orion 제품에 주입한 후 자동 업데이트 메커니즘을 사용해 배포한 것으로 알려진 정교한 공급망 공격이었습니다. 이 글의 작성 시점에는 인시던트의 규모, 범위 및 정도에 대한 평가가 계속 진행 중이었습니다. 

기존 Elastic Security 탐지

SUNBURST malware가 사용한 DGA 생성 도메인 이름 1,722개는 보안 연구자들 간에 공유되었습니다. 기존 Elastic Security 머신 러닝 기반 탐지 규칙 중 하나인 DNS Tunneling은 이 샘플의 DNS 이름에 대해 2개의 이상 징후 기반 경보를 생성합니다. DNS Tunneling과 유사하게 SUNBURST 이름 샘플에서 하위 도메인 대 상위 도메인 비율이 매우 높습니다. 이 규칙과 연결된 머신 러닝 작업은 Packetbeat 데이터를 분석하도록 코딩되어 있지만, 이 머신 러닝 작업은 복제한 후 ECS(Elastic Common Schema) 형식으로 다른 DNS 이벤트를 수집하도록 수정할 수 있습니다. 다음은 DNS Tunneling 머신 러닝 작업입니다.

이 머신 러닝 작업에는 DNS Tunneling이라는 관련 탐지 규칙이 있습니다.

이 Elastic Security 규칙을 사용하면 아래 나와 있는 것처럼 이상 징후 탐색을 탐지 경보 및 알림(선택 사항)으로 변환하여 적절한 인시던트 분류 및 대응 조치 대기열에 올릴 수 있습니다. 다음은 Elastic 머신 러닝 앱에서 SUNBURST 이상 징후 탐색이 어떻게 표시되는지 보여줍니다.

이 탐지 작업이 유용하긴 하지만 DGA 활동을 매번 탐지하지는 못할 수 있습니다. Elastic에서는 DGA 탐지를 강화하기 위해 실험적 DGA 탐지 워크플로우를 제공하고 있습니다.

실험적 DGA 워크플로우 사용

실험적 DGA 머신 러닝 탐지 워크플로우가 DGA 활동 대부분을 탐지한다는 것을 확인했습니다. 앞에서 살펴본 DGA 탐지 지도 모델을 통해 SUNBURST DGA 도메인을 실행했습니다(이 모델을 다운로드하여 실행하는 방법 및 관련 규칙에 대한 자세한 내용은 위의 설명 참조). 이 모델은 샘플에 있는 도메인 이름 중 82%를 DGA로 태그를 지정했습니다. 따라서 샘플 세트에 대해 1,420개의 경보가 생성됩니다. 다음은 이 지도 모델이 DGA 활동으로 태그를 지정한 SUNBURST DNS 이름의 스크린샷입니다.

Machine Learning Detected a DNS Request Predicted to be a DGA Domain이라는 탐지 규칙을 사용하면 이러한 이벤트를 탐지 경보로 전환할 수 있습니다. 이 규칙의 복사본을 만든 후, SUNBURST와 같은 특정 malware 인스턴스에서 사용하는 것으로 관찰된 상위 도메인에 맞춰 수정할 수도 있습니다. 다음과 같이 테스트를 규칙 쿼리에 추가하면 SUNBURST DGA 이벤트 세트에 일치하도록 할 수 있습니다.

network.protocol:dns and ml_is_dga.malicious_prediction: 1 and dns.question.registered_domain: "avsvmcloud.com"

그런 다음 ‘긴급함’ 심각도 수준과 99라는 높은 위험 점수를 이 규칙에 부여하여 경보 및 분석 작업 대기열의 맨 앞으로 옮길 수 있습니다. 다음은 SUNBURST DGA 활동을 탐지하는 데 집중하도록 이 규칙을 수정함에 따라 생성된 경보의 스크린샷입니다.

알려진 SUNBURST DNS 도메인을 사용하여 머신 러닝으로 DGA 활동을 탐지라는 이 규칙도 패키지에 포함되어 있습니다. 실제 감염 환경에서 높은 빈도의 DGA 군집을 사용하는 malware 인스턴스는 많은 경보를 발생시키므로 기본적으로 100으로 설정된 max_signals 회로 차단기가 작동될 수 있습니다. 이 경우, 검색에서 처음 찾은 이벤트가 무엇인지에 따라 일부 malware 인스턴스에 대한 경보는 생성되지만 다른 malware 인스턴스에 대한 경보는 생성되지 않을 수 있습니다. 

DGA 활동에 참여하는 감염된 호스트들을 더 많이 파악하기 위해 DGA 검색 규칙의 max_signals 값을 10,000으로 늘렸습니다. 참고: 이 설정은 규칙 편집기에서는 수정할 수 없으며, 외부 규칙 파일에서 수정한 후 가져와야 합니다. 편집기에서 규칙 파일을 열면 설정을 확인할 수 있습니다.

DGA 활동이 활발하고 경보 수가 많은 경우, DGA 경보 또는 이벤트를 집계 및 분류하여 다음과 같이 데이터 테이블의 호스트 이름 또는 소스 IP별로 필터링할 수 있습니다.


다음과 같이 source.ip별로 집계된 데이터 테이블 시각화를 비롯하여 다양한 시각화 및 집계가 포함된 Packetbeat DGA 이벤트용 샘플 대시보드도 패키지에 포함되어 있습니다. 또는 DNS 이벤트에 해당 필드가 포함된 경우에는 host.name별로 집계할 수 있습니다. 이 파일의 이름은 dga-dashboard.ndjson이며 Kibana로 가져올 수 있습니다. 스택 관리를 선택하면 표시되는 저장된 객체 페이지에서 가져오기를 선택하면 됩니다.

다음은 packetbeat-* 인덱스에서 DGA 이벤트를 렌더링하는 대시보드 스크린샷입니다.

저희가 도와드리겠습니다

혼자 고민하실 필요가 없습니다! 이 프로세스를 진행하면서 문제에 부딪히거나 위협 탐지 및 머신 러닝에 대한 저희의 철학이 궁금하시다면, 커뮤니티 Slack 채널 또는 토론 채널에 글을 남겨주세요. 아니면 공개 탐지 리포지토리에서 저희와 함께 작업에 참여하실 수도 있습니다. 감사합니다.