PolySwarm

This page is available in English.

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

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

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

We use cookies to better understand how you use our site, and to make it easier to use in the future. If you do not consent to our use of cookies, you can change your Privacy Settings or Decline.

Accept

Nivel 0: de cero a EICAR

Micromotor “Hola mundo”

Aspectos generales

Cuando se desarrollan soluciones contra código malicioso, el equivalente al “Hola mundo” es, indefectiblemente, el archivo de prueba EICAR.

Este archivo benigno es identificado como “malicioso” por los productos anticódigo malicioso más importantes del mundo; una manera fiable de probar un resultado positivo.

Nuestro primer micromotor no puede ser menos: ¡detectemos el archivo EICAR!

(Opcional) Repasa los componentes de un micromotor →

Elementos básicos

Esta guía mencionará y se apoyará en los siguientes elementos:

  • engine-template: Como su nombre indica, es una práctica plantilla con entrada interactiva de datos para crear nuevos motores. La usaremos en nuestro tutorial.

  • polyswarm-client: La navaja multiusos de los distintos prototipos de participantes de PolySwarm (“clientes”). polyswarm-client puede actuar como micromotor (microengine) (usaremos esta funcionalidad en este tutorial), árbitro (arbiter) o embajador (ambassador) (usaremos esta otra funcionalidad para probar lo que creemos).

Personaliza engine-template

Aviso: Los motores basados en Windows solamente son compatibles como imágenes de máquina de Amazon Web Services (AMI).

El proceso de personalización de los motores basados en Windows asume que dispones de una cuenta AWS con su correspondiente identificador.

Próximamente, ampliaremos las opciones de despliegue, incluida la posibilidad de hospedaje propio. Los motores basados en Linux no presentan esa restricción.

Modelaremos nuestro motor usando engine-template. Para ello necesitaremos cookiecutter:

pip install cookiecutter

Con cookiecutter instalado, crear un motor a partir de la plantilla es así de fácil:

cookiecutter https://github.com/polyswarm/engine-template

Estas son las respuestas que debes dar a las distintas peticiones de entrada de datos que aparecerán:

  • engine_name: MyEicarEngine (el nombre de tu motor)
  • engine_name_slug: (acepta el valor por defecto)
  • project_slug: (acepta el valor por defecto)
  • author_org: ACME (o el nombre real de tu organización)
  • author_org_slug: (acepta el valor por defecto)
  • package_slug: (acepta el valor por defecto)
  • author_name: Pepito Grillo (o tu nombre real)
  • author_email: (tu dirección de correo electrónico)
  • platform: responde con exactitud: ¿este motor se ejecutará en Linux o en Windows?
  • has_backend: 1 si es falso (consulta la explicación siguiente)
  • aws_account_for_ami: (solo Windows) El identificador de tu cuenta AWS (para motores Linux, basta con aceptar el valor por defecto)

Una de las peticiones es has_backend, que puede interpretarse como "¿cuenta el motor con un procesador de análisis disociado?" y merece explicarse en más detalle:

Cuando encapsulas tu motor de escaneo, al proceso de heredar las clases de polyswarm-client e implementar su funcionalidad se le denomina cambiar el "frontal" (frontend). Si el "frontal" de tu motor de escaneo debe comunicarse a través de una red o de un socket local con un proceso independiente que realice el auténtico trabajo de escaneo (el procesador de análisis o backend), tendrás un procesador disociado y deberás responder true a la pregunta has_backend. Si, por contra, tu motor de escaneo puede encapsularse fácilmente en una sola imagen de Docker (Linux) o AMI (Windows), debes responder false a la pregunta has_backend.

Ejemplo de "frontal" y procesador de análisis disociados:

Ejemplo que solamente consta de "frontal" ("has_backend" es falso):

¡Ya está todo listo!

Ahora, tu directorio de trabajo actual debería contener el archivo microengine-myeicarengine. Este es el motor que editaremos para implementar la funcionalidad de escaneo de EICAR.

If you want to use PyCharm as your IDE, now is when you can setup a new PyCharm project for this microengine development.

Implementa un escáner y un micromotor para EICAR

Detectar EICAR es tan sencillo como:

  1. implementar una clase Scanner que sepa cómo identificar el archivo de prueba EICAR, e
  2. implementar una clase Microengine que use esa clase Scanner.

Let’s get started.

Abre microengine-myeicarengine/src/(el nombre con org)_myeicarengine/__init__.py.

Si usaste la plantilla engine-template de Cookiecutter de arriba, tu __init__.py contendrá código.

Modificaremos este archivo para implementar nuestras clases Scanner y Microengine:

  • Scanner: Nuestra clase Scanner. Esta clase implementará la lógica de detección de EICAR en su función scan.

  • Microengine: Nuestra clase Microengine. Esta clase encapsulará la clase Scanner anterior para gestionar todas las tareas que implica ser un micromotor que detecta EICAR.

Escribe la lógica de detección de EICAR

El archivo de prueba EICAR se define como un archivo que contiene solo la cadena siguiente: X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*.

Por supuesto, existen numerosos modos de identificar archivos que cumplan con estos criterios. El parámetro content de la función scan alberga el contenido completo del artefacto en cuestión, es decir, la coincidencia a localizar.

Incluimos a continuación dos ejemplos de cómo escribir tu función scan() para detectar EICAR. Actualiza el código contenido en el archivo __init__.py con los cambios indicados en uno de los dos.

El primero representa el diseño más sencillo y se usa en eicar.py:

import base64
from polyswarmclient.abstractmicroengine import AbstractMicroengine
from polyswarmclient.abstractscanner import AbstractScanner, ScanResult

EICAR = base64.b64decode(b'WDVPIVAlQEFQWzRcUFpYNTQoUF4pN0NDKTd9JEVJQ0FSLVNUQU5EQVJELUFOVElWSVJVUy1URVNULUZJTEUhJEgrSCo=')

class Scanner(AbstractScanner):

    async def scan(self, guid, content, chain):
        if content == EICAR:
            return ScanResult(bit=True, verdict=True)

        return ScanResult(bit=True, verdict=False)


class Microengine(AbstractMicroengine):
    def __init__(self, client, testing=0, scanner=None, chains=None):
        scanner = Scanner()
        super().__init__(client, testing, scanner, chains)

Esta es otra forma, ahora comparando el valor SHA-256 del archivo de prueba EICAR con un hash malicioso conocido:

import base64

from hashlib import sha256
from polyswarmclient.abstractmicroengine import AbstractMicroengine
from polyswarmclient.abstractscanner import AbstractScanner, ScanResult

EICAR = base64.b64decode(b'WDVPIVAlQEFQWzRcUFpYNTQoUF4pN0NDKTd9JEVJQ0FSLVNUQU5EQVJELUFOVElWSVJVUy1URVNULUZJTEUhJEgrSCo=')
HASH = sha256(EICAR).hexdigest()

class Scanner(AbstractScanner):

    async def scan(self, guid, content, chain):
        testhash = sha256(content).hexdigest()
        if (testhash == HASH):
            return ScanResult(bit=True, verdict=True)

        return ScanResult(bit=True, verdict=False)


class Microengine(AbstractMicroengine):
    def __init__(self, client, testing=0, scanner=None, chains=None):
        scanner = Scanner()
        super().__init__(client, testing, scanner, chains)

Desarrolla una estrategia de apuesta

At a minimum, Microengines are responsible for: (a) detecting malicious files, (b) rendering assertions with a NCT bid.

Bidding logic is implemented in the Microengine’s bid function.

Por defecto, para todas las afirmaciones se apuesta el valor mínimo permitido por la comunidad a la que pertenece el micromotor.

Microengines can customize the default behavior by:

  1. Using the default logic, which weights your bid based on the confidence rating for each artifact between the min_bid and max_bid properties of the Microengine object
  2. Overriding the bid function to perform arbitrary logic

Check back soon for an exploration of various bidding strategies.

Finalización y prueba de tu motor

La utilidad cookiecutter solo personaliza engine-template hasta cierto punto; los demás elementos deberás personalizarlos tú. Aunque hemos abordado los más importantes, te aconsejamos que hagas una búsqueda rápida de CUSTOMIZE_HERE para asegurarte de haber personalizado todos los aspectos necesarios.

Una vez que esté todo listo, probaremos nuestro motor:

Prueba los motores basados en Linux →

Prueba los motores basados en Windows →

Próximos pasos

Implementar la lógica de escaneo directamente en la clase Scanner es difícil de gestionar y de escalar. En su lugar, es probable que prefieras que tu clase Microengine invoque un código binario o un servicio externos que albergue la verdadera lógica de escaneo.

A continuación, encapsularemos ClamAV en un micromotor →