PolySwarmPolySwarmPolySwarmPolySwarm
Help

Building a Multi-Backend Microengine

このチュートリアルでは、複数の分析バックエンドを組み合わせる方法について説明し、基本判定生成プリミティブの概要を示します。 バックエンドは 2 つあり、ClamAV (直前のチュートリアルのもの) と YARA です。

Adding YARA to the Mix

Start with a fresh participant-template, give it the engine-name of "MyYaraEngine". 現行作業ディレクトリーに 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 を使用してアーティファクトをスキャンするスキャナーを作成します。

Edit the __init__.py as we describe below:

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

from polyswarmclient.abstractscanner import AbstractScanner, ScanResult

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, artifact_type, content, chain):
        matches = self.rules.match(data=content)
        if matches:
            return ScanResult(bit=True, verdict=True)

        return ScanResult(bit=True, verdict=False)

polyswarm-client に付属の YARA バックエンドは、YARA ルールの場所を指定できる RULES_DIR 環境変数を受け入れます。 そのため、このエンジンのテスト時には、RULES_DIR 環境変数を設定して、ダウンロードした YARA ルールの場所を指定する必要があります。

When conducting integration testing, our mock Ambassador only bounties 2 files: EICAR and a file that is not EICAR.

これに関しては、YARA マイクロエンジンがあります。 ただし、ここでは、単一のマイクロエンジンで複数のエンジンを実行することが目的です。では、説明を進めます。

ClamAV Scanner

We are going to re-use the ClamAV scanner from the previous tutorial.

完成ソリューションは、clamav.py で確認できます。

Multiple Analysis Backends

Start with a fresh participant-template, give it the engine-name of "MyMultiEngine". 現行作業ディレクトリーに microengine-mymultiengine があり、これを編集して、ClamAv と YARA の両方の機能を使用します。

複数の分析バックエンドを利用するようにマイクロエンジンを拡張します。つまり、両バックエンド (YARA と ClamAV) の結果を取得して判定を生成する手段が必要です。 では、複数のスキャナーを初期化するマイクロエンジンを作成しましょう。

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

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, artifact_type, content, chain):
        results = await asyncio.gather(*[backend.scan(guid, content, chain) for backend in self.backends])

        # Unpack the results
        bits = [r.bit for r in results]
        verdicts = [r.verdict for r in results]
        confidences = [r.confidence for r in results]
        metadatas = [r.metadata for r in results]

        asserted_confidences = [c for b, c in zip(bits, confidences) if b]
        avg_confidence = sum(asserted_confidences) / len(asserted_confidences)

        return ScanResult(bit=any(bits), verdict=any(verdicts), confidence=avg_confidence, metadata=';'.join(metadatas))

ここでは、スキャナーのすべての結果を非同期的に計算してから、結合して最終判定を生成しています。 この例では、バックエンドのいずれかが True ビットを返したかどうかを判定し、いずれかのバックエンドが悪意があると判別した場合にアーティファクトが悪意のあるものであるというアサーションを生成します。 各バックエンドからの信頼度評価の平均を取り、それを集計信頼度として報告します。また、スキャナーからのすべてのメタデータを単一の文字列に結合し、アサーションに添付します。

完成ソリューションは、multi.py で確認できます。

注: Python モジュール polyswarm_myclamavengine および polyswarm_myyaraengine は、前述の例からのものです。 このマルチエンジンで ClamAV エンジンと YARA エンジンを使用するには、PYTHONPATH に該当モジュールがなければなりません。 そのために、ClamAV と YARA の両方のプロジェクト・ディレクトリーのルートで以下のコマンドを実行できます。

pip install .

参加者のテスト

Once everything is in place, let's test our participant:

Unit Testing →

Next Steps

Now that you're familiar with developing several proof of concept microengines, it's time to consider what it would take to build an production microengine that connects to the PolySwarm marketplace.

Production Microengines →