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.abstractmicroengine import AbstractMicroengine
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)

The Microengine class is required, but we do not need to modify it, so it is not shown here.

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.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]

The Microengine class is required, but we do not need to modify it, so it is not shown here.

这创建一个包含着 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 →