Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Malware detection: YARA

YARA è uno strumento estremamente utile per gli analisti di sicurezza, che permette di rilevare pattern malevoli e, di conseguenza, possibili malware.
YARA è uno strumento estremamente utile per gli analisti di sicurezza, che permette di rilevare pattern malevoli e, di conseguenza, possibili malware.
Link copiato negli appunti

In questa lezione parleremo di Yara (acronimo che sta per Yet Another Recursive Acronym), uno strumento sviluppato da Victor Alvarez per la società VirusTotal. È distribuito all’interno di Kali Linux e viene attualmente utilizzato dagli analisti di sicurezza (e non solo) per la ricerca di pattern malevoli all’interno di file eseguibili o testuali.

Volendo fare un’analogia, si potrebbe pensare ad esso come il comando grep di Linux, che sfrutta le espressioni regolari per ricercare porzioni di testo. Nel caso di YARA, il matching viene effettuato sulla base di regole precompilate contenenti ciascuna diversi pattern e diverse regole logiche per determinare se un file sia malevolo o meno.

La popolarità di questo strumento è talmente vasta che moltissimi produttori di antivirus lo utilizzano quale motore di analisi dei file. Ne citiamo di seguito solo alcuni tra i più famosi:

Sebbene le principali funzionalità di YARA saranno discusse in questa lezione, tutti i dettagli possono essere sempre reperiti nella documentazione ufficiale.

Come funziona YARA

YARA utilizza delle semplici regole basate su stringhe ed espressioni logiche, che definiscono “famiglie” di malware.
Tutte le regole YARA hanno il formato della seguente regola “dummy”:

rule dummy
{
   meta:
     description = “Regola dumy”
   strings:
     $dummy_string = “Stringa dummy”
   condition:
       false
}

La regola di cui sopra non fa nulla, ma è utile per cominciare a capire come approcciarne la scrittura.
In primo luogo bisogna dichiarare la regola con il seguente template:

rule nome_regola
{ contenuto regola }

Nel contenuto della regola potremo dichiarare i meta-contenuti, utili ad aggiungere informazioni circa la regola:

meta:
  identificatore_1 = “stringa”
  identificatore_2 = 25
  identificatore_3 = true

Seguirà la dichiarazione delle stringhe (fondamentali per l’analisi del malware). Le stringhe possono essere racchiuse tra doppi apici, esattamente come le stringhe del C, oppure racchiuse tra parentesi graffe, nel caso di stringhe esadecimali:

strings:
        $stringa_C = "testo casuale"
        $stringa_esadecimale = { E2 34 A1 C8 23 FB }

Infine dovremo dichiarare la condizione di match, ossia un’espressione booleana, combinazione delle stringhe dichiarate nella sezione precedente:
condition:

$stringa_1 or ($stringa_2 and $stringa_3)

Qualora dovessimo avere bisogno di un commento, potremo utilizzare la sintassi C:

/*
Commento multilinea
*/
// commento a linea singola

I moduli YARA

Yara contiene una serie di moduli che ne estendono notevolmente le potenzialità.
Tra i moduli disponibili vi sono il modulo PE ed il modulo ELF, che consentono di analizzare gli attributi dell’intestazione dei file eseguibili od utilizzare funzioni (es. il calcolo dell’hash) per verificare se determinate condizioni sono soddisfatte.
Richiamare un attributo o una funzione è semplicissimo. L’operazione va eseguita nella sezione delle condizioni:

condition:
	pe.attribute == valore_attributo and pe.function() == valore_funzione

Chiaramente lo stesso vale per i files di tipo ELF: basterà rimpiazzare la stringa pe con “elf”.
Le funzioni e gli attributi più salienti messi a disposizione del modulo PE sono i seguenti:

  • Machine: indica per quale macchina è il file eseguibile;
  • dll_characteristics: caratterstiche del file DLL;
  • number_of_sections: il numero di sezioni del file PE;
  • sections: un array accessibile con la sintassi [], contenente informazioni come il nome o la grandezza in bytes;
  • signatures: un array accessibile con la sintassi [], contenente eventuali firme utili a decidere se il file sia malevolo o meno;
  • is_dll(): funzione che indica se il file è una dll;

Gli attributi e le funzioni dei files .elf sono molto simili e sono omessi per brevità.

Un altro modulo particolarmente interessante è il modulo magic che consente di rilevare il tipo di file sulla base non della mera estensione, ma sul contenuto di quest’ultimo.
Per utilizzare tale modulo, basterà semplicemente richiamarne la funzione type() nella sezione delle condizioni (condition):

condition:
	magic.type() contains “tipo_file”

Segnaliamo inoltre il modulo .NET, capace di gestire file di analogo tipo. Tra gli attributi che potremo andare a gestire vi sono:

  • version: la versione di dotnet utilizzata per la compilazione;
  • assembly: informazioni circa la versione (minor/major) o la lingua;
  • GUIDs: un array contenente gli identificatori degli oggetti del programma.

Un’interessante caratteristica di YARA è la possibilità di scrivere i propri moduli personalizzati. Qualora dovessimo avere necessità di analizzare files codificati (es. .zip, .tar, ecc), potremo aggiungere il modulo yextend, che consentirà l’analisi granulare di file compressi e/o codificati.

Regole YARA: esempi pratici di rilevazione di malware

Concludiamo questa lezione con alcuni esempi pratici all’utilizzo di YARA, per la rilevazione di semplici malware.

La seguente regola consentirà di rilevare come sospetti tutti i documenti PDF contenenti almeno un link al dominio .com. Benchè tale regola possa essere fonte di un numero elevato di falsi positivi, può comunque essere utilizzata per indicare una “potenziale” compromissione, spingendo quindi l’analista ad approfondire il link in questione:

rule pdf_url
{
    meta:
          description: “Rilevazione di url in pdf”
   strings:
         $regex  = /https?:\/\/www\..+\.com/
   Condition:
       /* tutte le stringhe della sezione strings*/
       all of them
}

Rilevare un tentativo di phishing in una mail

Con la seguente regola saremo in grado di rilevare come sospetta una mail contenente determinate caratteristiche che possano fare pensare ad una mail di phishing. Per esempio, le mail di phishing contengono sempre un link a sito esterno, dunque dovremo ricercare la presenza di eventuali link a siti esterni. Oltre a ciò, andremo alla ricerca di determinate parole usate spesso per invogliare l’utente a cliccare sul link che porterebbe sul sito malevolo. Esempi di tali parole sono click, password, change, confirm, identity, eccetera.
La regola può essere scritta nel seguente modo:

rule phishing:
{
    Meta:
        description: “Regola di antiphishing”
    strings:
          //intestazione di una mail
           $head_1= “From:”
           $head_2= “To:”
		   $ head_3= “Subject:”
        //stringhe sospette
         $s1 = “click”
         $s2 = “password”
         $s3 = “change”
         $s4 = “confirm”
         $s5 = “identity”
    	 $url  = /https?:\/\/www\..+\..+/
    Condition:
      /*tutti i campi dell’intestazione,
      una qualunque stringa sospetta
      ed un link a sito esterno */
      all of ($head*) and any of ($s*) and $url
}

Rilevazione di un eseguibile sospetto

Nella maggior parte dei casi, quando un exploit ha successo sull’host remoto, il processo malevolo o quello infettato genereranno un sottoprocesso che darà accesso alla macchina locale ed eseguirà determinate azioni. Tale pattern viene chiamato in letteratura “Command and Control”.

Il sottoprocesso così generato sarà in grado di inviare e/o ricevere richieste a/dall’host malevolo e derubare o danneggiare la macchina infettata.

Una semplice regola che può essere utilizzata per rilevare tale comportamento è la seguente (per file eseguibili):

import “PE”
rule command_control_malware:
{
	condition:
		pe.imports (“Kernel32.dll”,”CreateProcess”) and pe.imports (“wininet.dll”,”httpsendrequest”)
}

Ti consigliamo anche