PolySwarmPolySwarmPolySwarmPolySwarm
Help

Building a File-Submitting Ambassador

polyswarm-client's filesystem.py ambassador expands on the eicar.py ambassador, submitting artifacts from a local filesystem.

先頭部分は、以下のように同様です。

import logging
import random
import os

from concurrent.futures import CancelledError

from polyswarmartifact import ArtifactType

from polyswarmclient.abstractambassador import AbstractAmbassador
from polyswarmclient.corpus import DownloadToFileSystemCorpus

logger = logging.getLogger(__name__)

ARTIFACT_DIRECTORY = os.getenv('ARTIFACT_DIRECTORY', 'docker/artifacts')
ARTIFACT_BLACKLIST = os.getenv('ARTIFACT_BLACKLIST', 'truth.db').split(',')
BOUNTY_TEST_DURATION_BLOCKS = int(os.getenv('BOUNTY_TEST_DURATION_BLOCKS', 5))

今回も、インポートを処理し、報奨金期間をハードコーディングし、ロギングを構成しています。 filesystem.py makes use of polyswarmclient.corpus, a helper class that will download, decrypt and extract an artifact collection. Swarm Technologies uses this class internally during continuous integration to ensure that malicious artifacts are detected as such by microengines.

Continuing:

class Ambassador(AbstractAmbassador):
    """Ambassador which submits artifacts from a directory"""

    def __init__(self, client, testing=0, chains=None, watchdog=0, submission_rate=30):
        """Initialize a filesystem ambassador
        Args:
            client (`Client`): Client to use
            testing (int): How many test bounties to respond to
            chains (set[str]): Chain(s) to operate on
        """
        super().__init__(client, testing, chains, watchdog, submission_rate)

filesystem.py は、テストに役立つ、AbstractAmbassador へのさらに多くの引数を利用しています。

  • testing: このパラメーターは、非ゼロの場合、アンバサダーが終了する前に生成する報奨金の最大数を指定します。
  • watchdog: ブロック間隔。 このアンバサダーが提示した報奨金は、新しい各ブロックに対して検査され、報奨金がチェーン上に正常に提示されたことを確認します。
  • submission_rate: 非ゼロの場合、メイン・イベント・ループでスリープして、テスト時にこのアンバサダーによって polyswarmd が過負荷状態にならないようにします。

続けて、以下のようになっています。

        self.artifacts = []
        u = os.getenv("MALICIOUS_BOOTSTRAP_URL")
        if u:
            logger.info("Unpacking malware corpus at {0}".format(u))
            d = DownloadToFileSystemCorpus()
            d.download_and_unpack()
            bfl = d.get_benign_file_list()
            mfl = d.get_malicious_file_list()
            logger.info("Unpacking complete, {0} malicious and {1} benign files".format(len(mfl), len(bfl)))
            self.artifacts = bfl + mfl
        else:
            for root, dirs, files in os.walk(ARTIFACT_DIRECTORY):
                for f in files:
                    self.artifacts.append(os.path.join(root, f))

環境変数 MALICIOUS_BOOTSTRAP_URL が設定されている場合、アンバサダーはテスト・リポジトリーからアーティファクトをダウンロードします。 設定されていない場合、アンバサダーの現行作業ディレクトリーを基準として ARTIFACT_DIRECTORY 相対ディレクトリーを調べます。 報奨金を生成する準備として、ファイルが収集されます。

filesystem.py では、以下のように generate_bounties メソッドをオーバーライドしています。

    async def generate_bounties(self, chain):
        """Submit bounty from the filesystem
        Args:
            chain (str): Chain sample is being requested from
        """
        amount = await self.client.bounties.parameters[chain].get('bounty_amount_minimum')

        while True:
            try:
                filename = random.choice(self.artifacts)

                logger.info('Submitting file %s', filename)
                ipfs_uri = await self.client.post_artifacts([(filename, None)])
                if not ipfs_uri:
                    logger.error('Error uploading artifact to IPFS, continuing')
                    continue

                await self.push_bounty(ArtifactType.FILE, amount, ipfs_uri, BOUNTY_TEST_DURATION_BLOCKS, chain)
            except CancelledError:
                logger.warning('Cancel requested')
                break
            except Exception:
                logger.exception('Exception in bounty generation task, continuing')
                continue

This is identical to the logic contained withing eicar.py.

filesystem.py は、eicar.py をベースに作成しており、ディスク上に (オプションで、リモート URL に) アーティファクトを作成します。 現実世界のアンバサダーでは、利用者がアンバサダーに送信したアーティファクトが取得されます。

参加者のテスト

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 ambassadors, it's time to consider what it would take to build an production ambassadors that connects to the PolySwarm marketplace.

Production Ambassadors →