PolySwarm

This page is available in English.

Está página está disponible en español.

このページは日本語でもご利用いただけます。

이 페이지는 한국어로만 표시됩니다.

레벨 2: ClamAV에서 멀티로

다중 백엔드 마이크로엔진 구축

이 튜토리얼에서는 여러 개의 분석 백엔드를 결합하는 방법과 기본적인 의견 도출 엔진에 대하여 설명합니다. 두 개의 백엔드는 (지난 튜토리얼에서 설명된) ClamAVYARA입니다.

Mix에 YARA 추가하기

새로운 engine-template으로 시작해서 ‘MyYaraEngine’으로 engine-name을 부여합니다. 현재 작업 중인 디렉터리에서 microengine-myyaraengine을 찾을 수 있습니다. Yara의 함수를 구현하기 위해 이를 편집합니다.

이제 YARA 백엔드를 마이크로엔진에 추가합니다. 하지만, 먼저 일부 YARA 서명(규칙)이 필요합니다!

Yara-Rules 저장소는 무료 규칙을 얻을 수 있는 훌륭한 장소입니다. 그럼 이제 규칙을 얻어서 microengine-myyaraenginepkg 디렉터리에 넣어보도록 하겠습니다.

cd microengine-myyaraengine/pkg
git clone https://github.com/Yara-Rules/rules.git

이 규칙을 해석하려면 yara-python 모듈이 필요합니다. 모듈이 없을 경우 설치하세요.

pip install yara-python

다음으로, yara-python을 사용해서 아티팩트를 검사하는 스캐너를 만듭니다.

아래와 같이 __init__.py를 편집합니다.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
import os
import yara

from polyswarmclient.abstractmicroengine import AbstractMicroengine
from polyswarmclient.abstractscanner import AbstractScanner

logger = logging.getLogger(__name__) # Initialize logger
RULES_DIR = os.getenv('RULES_DIR', 'docker/yara-rules')

class Scanner(AbstractScanner):
def __init__(self):
self.rules = yara.compile(os.path.join(RULES_DIR, "malware/MALW_Eicar"))

async def scan(self, guid, content, chain):
matches = self.rules.match(data=content)
if matches:
return True, True, ''

return True, False, ''

정보: 마이크로엔진 클래스가 필요하지만, 수정할 필요가 없으므로 여기에 표시하지 않았습니다.

polyswarm-client에 포함된 YARA 백엔드는 YARA 규칙을 가리키는 RULES_DIR 환경 변수를 허용합니다. 따라서, 이 엔진을 테스트할 경우 다운로드한 YARA 규칙을 가리키도록 RULES_DIR 환경 변수를 설정해야 합니다.

정보: 통합 테스트 수행 시(Linux, Windows) 모의 홍보대사는 두 개의 파일(EICAR 및 EICAR이 아닌 파일)에 대해서만 현상금을 겁니다. 따라서, 당사의 프레임워크에서 테스트를 하기 위해서는 EICAR을 탐지하는 YARA 규칙만 있으면 됩니다.

이제 YARA 마이크로엔진이 준비되었습니다. 하지만, 우리의 계획은 단일한 마이크로엔진에 의해 실행되는 여러 개의 엔진을 갖추는 것이므로, 계속 진행해보겠습니다.

ClamAV 스캐너

이전 튜토리얼에서 설명된 ClamAV 스캐너를 다시 사용합니다.

완성된 솔루션은 clamav.py에서 확인할 수 있습니다.

다중 분석 백엔드

새로운 engine-template으로 시작해서 ‘MyMultiEngine’으로 engine-name을 부여합니다. 현재 작업 중인 디렉터리에서 microengine-mymultiengine을 찾을 수 있습니다. ClamAv 및 YARA의 함수를 모두 사용하기 위해서 이를 편집합니다.

여러 개의 분석 백엔드를 사용할 수 있도록 마이크로엔진을 확장하겠습니다. 이를 위해, 두 개의 백엔드(YARA와 ClamAV)에서 결과를 얻어 의견을 도출하기 위한 방법이 필요합니다. 여러 개의 스캐너를 초기화하는 마이크로엔진을 만들어보겠습니다.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import asyncio
import logging

from polyswarmclient.abstractmicroengine import AbstractMicroengine
from polyswarmclient.abstractscanner import AbstractScanner
from polyswarm_myclamavengine import Scanner as ClamavScanner
from polyswarm_myyaraengine import Scanner as YaraScanner

logger = logging.getLogger(__name__) # Initialize logger
BACKENDS = [ClamavScanner, YaraScanner]


class Scanner(AbstractScanner):

def __init__(self):
super(Scanner, self).__init__()
self.backends = [cls() for cls in BACKENDS]

정보: 마이크로엔진 클래스가 필요하지만, 수정할 필요가 없으므로 여기에 표시하지 않았습니다.

YaraScanner와 ClamavScanner의 인스턴스가 포함된 백엔드 목록이 생성됩니다.

이제 두 스캐너에 모두 액세스할 수 있습니다. 두 스캐너의 결과를 사용하여 스캐너의 scan() 함수에서 최종 의견을 도출해보겠습니다.

    async def scan(self, guid, content, chain):
results = await asyncio.gather(*[backend.scan(guid, content, chain) for backend in self.backends])

# Unzip the result tuples
bits, verdicts, metadatas = tuple(zip(*results))
return any(bits), any(verdicts), ';'.join(metadatas)

이제 모든 스캐너의 결과를 비동기적으로 계산한 후, 이들을 결합하여 최종 의견을 도출합니다. 여기에서는 어떤 백엔드가 True 비트를 반환할 경우 주장을 제시하고, 백엔드가 악성이라고 판단하면 아티팩트가 악성이라는 주장을 제시합니다. 또한, 스캐너의 모든 메타데이터를 하나의 문자열로 결합하어 주장에 첨부합니다.

완성된 솔루션은 multi.py에서 확인할 수 있습니다.

참고: python 모듈 polyswarm_myclamavenginepolyswarm_myyaraengine은 이전 예에서 가져온 것입니다. 이 다중 엔진이 ClamAV 및 YARA 엔진을 사용하려면 PYTHONPATH에서 이용할 수 있어야 합니다. 이를 위해, ClamAV 및 YARA 프로젝트 디렉터리의 루트에서 다음 명령을 실행할 수 있습니다.

pip install .

다음 단계

기존의 AV 제품을 사용하여 다양한 마이크로엔진을 만드는 법을 배웠으므로 이제 사용자 지정 마이크로엔진을 만들 수 있습니다.