서문
디토네이트 시리즈의 첫 번째 포스팅에서는 디토네이트 시스템과 Elastic에서 이 시스템을 사용하는 용도에 대해 소개했습니다. 또한 보안 아티팩트의 성능을 평가할 때 팀에 제공하는 이점에 대해서도 논의했습니다.
이 게시글에서는 디토네이트( & )가 어떻게 작동하는지 기술 구현에 대해 자세히 살펴봅니다. 여기에는 실제로 이러한 샌드박스 환경을 만드는 방법, 전체 파이프라인을 지원하는 기술, 파이프라인에 정보를 제출하고 파이프라인에서 정보를 읽는 방법 등이 포함됩니다.
디토네이트의 다른 포스팅에 관심이 있으신가요? 1 - 클릭, 클릭...붐! 에서 디토네이트 소개, 디토네이트 개발 이유, 디토네이트 작동 방식, 사례 연구, 효과 테스트에 대해 설명합니다.
아키텍처
다음은 디토네이트 엔드투엔드 아키텍처에 대한 개괄적인 개요입니다.
전체 시스템은 일련의 메시지 대기열과 Python 워커로 구성됩니다. 폭발 작업은 샘플 파일 해시만큼 적은 정보로 요청을 수락하면 API 서버가 생성합니다. 그런 다음 작업은 대기열에서 대기열로 이동하고, 그 과정에서 다양한 작업을 실행하는 작업자가 작업을 선택합니다.
서버와 워커는 Amazon ECS의 컨테이너에서 실행됩니다. 초기 개발 및 기능 테스트를 위해 Docker Compose를 사용하여 파이프라인을 로컬에서 불러올 수도 있습니다.
API 서버
디토네이트 API 서버는 샘플 해시, 네이티브 명령(인수가 있거나 없는 bash 또는 Powershell), 업로드된 파일 등 다양한 실행 대상 요청을 수락하는 FastAPI 파이썬 애플리케이션입니다. 또한 서버는 Elastic 클러스터에서 알림과 원시 에이전트 원격 분석을 가져오기 위한 엔드포인트를 노출합니다.
API 문서는 FastAPI에 의해 자동으로 생성되며 글로벌 API 스키마에 통합됩니다.
API 서버와 상호작용하기 - CLI
저희는 디토네이트 서버와 상호작용할 수 있는 커스텀 Python CLI(명령줄 인터페이스) 도구를 구축했습니다. CLI 도구는 터미널 창에서 멋진 서식 지정 환경을 위해 리치와 함께 파이썬 라이브러리 클릭을 사용하여 구축되었습니다. 이 도구는 로컬 파이프라인 설정에 대해서도 실행할 수 있으므로 파이프라인을 디버깅하는 데 특히 유용합니다. 이 도구는 종속성 관리 및 스크립트 실행을 위해 선호하는 도구인 Poetry를 사용하여 설치 및 실행됩니다.
❯ DETONATE_CLI_API_ROOT_URL="${API_ENDPOINT_URL}" \
DETONATE_CLI_API_AUTH_HEADER="${API_KEY}" \
poetry run cli \
--hash "${MY_FILE_HASH}"
API 서버와 상호 작용하기 - 웹 UI
내부적으로는 팀의 연구를 지원하기 위해 보호 포털이라는 사이트( Elastic UI 구성 요소를 사용해 작성)를 호스팅하고 있습니다. 디토네이트 API를 보다 인터랙티브하게 경험할 수 있도록 포털에 디토네이트 API와 상호작용할 수 있는 페이지를 만들었습니다. 작업 제출과 함께 웹 UI를 통해 사용자는 모든 폭발의 피드와 각 작업의 세부 정보를 확인할 수 있습니다.
각 작업을 확장하여 자세한 내용을 확인할 수 있습니다. 폭발하는 동안 수집된 데이터와 원격 분석에 대한 링크를 제공합니다.
API 서버와 상호작용하기 - HTTP 클라이언트
사용자가 디토네이트 API와 상호작용하는 방식을 사용자 정의하고 싶다면 선택한 HTTP 클라이언트(예: curl , httpie 등)를 사용하여 명령을 실행할 수도 있습니다. 이를 통해 스크립트에 폭발을 추가하거나 자체 워크플로우의 마지막 단계에서 마지막 단계로 폭발을 추가할 수 있습니다.
Queues
파이프라인은 일련의 대기열과 작업자를 기반으로 구축됩니다. 메시지 큐 엔진에 대한 매우 기본적인 요구 사항이 있었기 때문에 Amazon SQS를 사용하기로 결정했습니다. SQS와 같은 인기 있는 서비스를 사용하면 얻을 수 있는 많은 이점 중 하나는 오픈 소스 리소스와 라이브러리를 이용할 수 있다는 점입니다. 예를 들어, 저희는 파이프라인을 로컬에서 실행할 때 소프트웨어밀/엘라스틱엠큐 도커 이미지를 큐 엔진으로 사용합니다.
대기열은 모든 프로덕션 및 스테이징 인프라를 포괄하는 Terraform 코드로 구성 및 배포됩니다.
작업자
각 워커는 대기열 소비자이자 대기열 생산자 역할을 하는 Python 스크립트입니다. 워커는 오류 처리, 재시도 및 모니터링을 위한 보일러플레이트 코드가 내장된 맞춤형 미니 프레임워크에서 구현됩니다. 기본 워커는 쉽게 확장할 수 있으므로 추가 요구 사항이 발생하면 새로운 워커를 추가하고 기존 워커를 발전시킬 수 있습니다.
모니터링을 위해 Elastic APM 통합 가시성 솔루션을 사용합니다. 실행 흐름을 파악하고 파이프라인 문제를 쉽게 디버깅할 수 있는 매우 강력한 기능입니다. 아래에서는 APM UI에서 작업자 간에 Detonate 작업이 이동하는 것을 볼 수 있습니다:
이러한 소프트웨어 및 인프라 구성 요소는 폭발을 구성하는 제출, 실행 및 데이터 수집을 수행하는 데 필요한 모든 것을 제공합니다.
폭발
파이프라인은 Windows, Linux 및 macOS 가상 머신(VM)에서 명령과 샘플을 실행할 수 있습니다. Windows 및 Linux 환경의 경우 Google Compute Engine의 VM 인스턴스를 사용합니다. 다양한 퍼블릭 이미지를 선택할 수 있어 다양한 버전의 Windows, Debian, Ubuntu, CentOS 및 RHEL로 샌드박스가 적용된 환경을 프로비저닝할 수 있습니다.
macOS 환경의 경우,AWS의 mac1.metal 인스턴스와 Veertu의 온디맨드 macOS VM 프로비저닝 솔루션인 Anka를 사용합니다. Anka는 동일한 macOS 베어메탈 인스턴스에서 실행되는 여러 macOS 가상 머신을 빠르게 순환할 수 있는 기능을 제공합니다.
디토네이트는 현재 광범위한 OS 적용 범위, 확장성, 파이프라인에서 상황에 맞는 데이터를 수집하는 데 중점을 두고 있습니다. 디토네이트에 정교한 분석 방지 대책을 적용하는 것은 현재 연구 및 엔지니어링 중입니다.
VM 프로비저닝
VM에서 차지하는 공간을 최소화하기 위해 프로비저닝에 시작 스크립트를 사용합니다. VM 내 활동이 수집하는 이벤트에 포함되어 실행 후 분석이 더 복잡해지기 때문에 공간을 최소화하는 것이 중요합니다. Windows 및 Linux VM의 경우 Powershell 및 bash로 작성된 GCP 시작 스크립트를 사용하여 시스템을 구성하고, macOS VM의 경우 사용자 지정 bash 및 AppleScript 스크립트를 작성했습니다.
시작 스크립트는 이러한 단계를 수행합니다:
- 시스템을 구성합니다. 예를 들어, MS Defender 비활성화, MS Office에서 매크로 실행 활성화, 자동 시스템 업데이트 비활성화 등이 있습니다.
- Elastic 에이전트를 다운로드하여 설치하세요. 이 스크립트는 상담원이 플릿 서버에 제대로 등록되어 있고 정책이 적용되었는지 확인합니다.
- 샘플을 다운로드하여 폭발시키거나 일련의 명령을 실행하세요. 실행은 백그라운드 프로세스에서 이루어지며, 메인 스크립트는 STDOUT/STDERR 데이터 스트림을 수집하고 N초 동안 절전 모드로 전환합니다.
- 파일 시스템에서 파일을 수집하고(필요한 경우) 스토리지에 업로드합니다. 이를 통해 폭발이 완료되면 추가 검증 또는 디버깅을 수행할 수 있습니다.
VM 라이프사이클은 start_vm 및 stop_vm 워커에 의해 관리됩니다. 일부 폭발로 인해 시작 스크립트 실행 흐름이 중단될 수 있으므로(예: 랜섬웨어의 경우), 모든 VM에는 stop_vm 워커가 더 이상 사용하지 않는 VM을 삭제할 수 있도록 하는 TTL이 설정되어 있습니다.
이 클린 슬레이트 접근 방식은 시작 스크립트를 사용하여 폭파에 필요한 모든 것을 구성하는 데 사용되므로 수정 없이 Google Cloud 공용 이미지 카탈로그에서 공급업체의 VM 이미지를 사용할 수 있습니다!
네트워크 구성
일부 샘플은 네트워크 스캔, C2 콜아웃 등과 같은 악성 트래픽을 생성할 수 있는 악의적인 샘플입니다. 클라우드 리소스와 공급업체의 인프라를 안전하게 유지하기 위해 VM에서 나가는 모든 트래픽을 제한합니다. 인스턴스는 미리 정의된 대상 목록으로만 발신 연결을 허용하는 잠긴 VPC에 배치됩니다. Google Cloud의 경로 및 방화벽 규칙과 AWS의 보안 그룹을 사용하여 VPC의 트래픽 흐름을 제한합니다.
또한 GCE에서 VPC 플로우 로그를 활용합니다. 이러한 로그를 통해 VPC에서 샌드박스 VM에 의해 시작된 프라이빗 네트워크 트래픽을 확인할 수 있습니다.
원격 분석 수집
폭발을 관찰하기 위해 모든 보호 기능이 "보호"("보호" 대신) 모드에 설치된 Elastic Defend 통합이 포함된 Elastic Agent를 사용합니다. 이를 통해 VM에서 최대한 많은 정보를 수집하는 동시에 Elastic Security 솔루션이 경보와 탐지를 생성할 수 있습니다.
이 아키텍처를 통해 보호 기능을 검증(다양한 OS 버전, 에이전트 버전, 배포된 보안 아티팩트 등에 대해 생성된 이벤트 및 알림 비교)하고 동시에 분석을 위한 원격 분석을 수집(새로운 샘플 또는 새로운 멀웨어)할 수 있다는 두 가지 사용 사례를 다룹니다. 수집된 모든 데이터는 영구적인 Elastic 클러스터에 보관되며 연구원들이 사용할 수 있습니다.
프로덕션에서 실행
최근 저희는 여러 데이터 통합의 부하를 견디며 한 달 동안 프로덕션 환경에서 Detonate 파이프라인을 실행하고 동시에 UI를 통해 내부 사용자에게 서비스를 제공했습니다. 지금까지의 기록은 하루 동안 1034 폭발이며, 지금까지 확장성이나 안정성 문제는 발견되지 않았습니다.
현재로서는 대부분의 제출물이 Windows 관련 샘플입니다. Linux와 macOS에 대한 지원도 확대하기 위해 노력 중이니 곧 발표될 연구 블로그 포스팅을 기대해 주세요!
다양한 파일 유형에 대한 지원을 지속적으로 개선하여 폭발이 의도한 트리거 동작에 최대한 가깝게 이루어지도록 하고 있습니다.
지난 달의 폭발을 살펴보면 대부분의 작업이 13 분 미만(중앙값 515 초)에 완료된 것을 알 수 있습니다. 이 시간에는 작업 데이터 준비, VM 프로비저닝 및 정리, 샘플 실행, 폭파 후 처리가 포함됩니다.
아직 서비스 초기이기 때문에 이상값이 나타나는 것은 정상입니다. 작업의 대부분의 시간은 VM 프로비저닝을 기다리는 데 소비되므로 사용자 지정 VM 이미지, VM 인스턴스 사전 시작, 시작 스크립트 최적화를 통해 전체 실행 시간을 개선할 수 있습니다.
이제 그다음은?
이제 디토네이트의 작동 방식을 살펴보았으니 다음 글에서는 디토네이트의 더 자세한 사용 사례를 살펴볼 것입니다. 이러한 폭발이 어떻게 더 많은 사용자를 보호하는 것으로 바뀌는지, 바로 여기 Elastic을 포함해 자세히 살펴보겠습니다!