PolySwarmPolySwarmPolySwarmPolySwarm
Help

Building a Multi-Backend Microengine

此教程會告訴你如何結合多個分析後端,並概述一個基本的判斷提取單元。 這兩個後端會是 ClamAV (從上一個教程) and 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 來掃描工件的 Scanner(掃描器)。

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 物件的列表。

現在我們可以訪問這兩個 Scanner 了,讓我們透過我們的 Scanner 的 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_myclamavenginepolyswarm_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 →