
Embeddings SAFE per abbinare funzioni in yara
SAFE è uno strumento sviluppato per creare embedding di funzioni binarie da Massarelli L., Di Luna G.A., Petroni F., Querzoni L. e Baldoni R. Puoi usare SAFE per creare i tuoi embedding di funzioni da utilizzare all'interno delle regole yara.
Se sei interessato, dai un'occhiata al nostro articolo di ricerca: https://arxiv.org/abs/1811.05296
Se stai usando questo per la tua ricerca, per favore cita:
@inproceedings{massarelli2018safe,
title={SAFE: Self-Attentive Function Embeddings for Binary Similarity},
author={Massarelli, Luca and Di Luna, Giuseppe Antonio and Petroni, Fabio and Querzoni, Leonardo and Baldoni, Roberto},
booktitle={Proceedings of 16th Conference on Detection of Intrusions and Malware & Vulnerability Assessment (DIMVA)},
year={2019}
}
Questo non è il codice per riprodurre gli esperimenti dell'articolo. Se sei interessato, dai un'occhiata a: https://github.com/gadiluna/SAFE
Se preferisci usare PyTorch, dai un'occhiata a SAFEtorch: https://github.com/facebookresearch/SAFEtorch
Usando yarasafe puoi creare facilmente firme per funzioni binarie senza nemmeno guardare il codice assembly! Devi solo installare i plugin IDA Pro che trovi nella cartella IDA Pro Plugin di questo repository.
Una volta installato il plugin, puoi iniziare a creare embedding per le funzioni che vuoi abbinare. Questi embedding possono essere inseriti nelle regole yara per abbinare funzioni usando yara. Per creare regole potenti, puoi combinare embedding di più funzioni con regole yara standard.
In questo repository troverai il plugin per IDA Pro e il modulo yarasafe.
Yarasafe può abbinare funzioni con più di 50 istruzioni e meno di 150.
Prima di tutto installa il plugin IDA Pro. Puoi trovare le istruzioni per farlo nella cartella ida-pro-plugin di questo repository. Poi puoi usare il nostro container docker o compilare yara con il modulo yarasafe.
Il modo più veloce per usare yarasafe è usare il nostro container docker.
Scarica le immagini:
docker pull massarelli/yarasafeAvvia docker montando la cartella che contiene la regola e il file da analizzare:
docker run -v {FOLDER_TO_MOUNT}:/home/yarasafe/test -it massarelli/yarasafe bashLancia yara all'interno del docker con la tua regola!
git clone https://github.com/lucamassarelli/yarasafe.git
sudo apt-get install automake libtool make gcc flex bison
sudo apt-get install libjansson-dev
git clone https://github.com/radare/radare2.git
cd radare2
./sys/install.sh
cd yarasafe/python_script
pip3 install -r requirements.txt
./bootstrap.sh
./configure
make
export YARAPYSCRIPT={PATH_TO_YARASAFE_REPO}/python_script
git clone https://github.com/lucamassarelli/yarasafe.git
brew install automake libtool flex bison
brew install jansson
git clone https://github.com/radare/radare2.git
cd radare2
./sys/install.sh
cd yarasafe/python_script
pip3 install -r requirements.txt
./bootstrap.sh
./configure.sh
make
export YARAPYSCRIPT={PATH_TO_YARASAFE_REPO}/python_script
All'interno della cartella rules puoi trovare la regola sample_safe_rule.yar. Questa regola dovrebbe attivarsi con qualsiasi file PE:
yara {PATH_TO_YARASAFE_REPO}/rules/sample_safe_rule.yar {FILES}
Per creare la tua regola safe-yara, devi prima creare gli embedding per la tua funzione. Per fare questo, puoi usare il plugin IDA Pro incluso in questo repository. All'interno della cartella ida-pro-plugin trovi tutte le informazioni su come eseguire il plugin!
Una volta ottenuti gli embedding per le tue funzioni, devi solo creare la regola. Un esempio di regola safe-yara è:
import "safe"
rule example
{
meta:
description = "This is just an example"
threat_level = 3
in_the_wild = true
condition:
safe.similarity("[-0.02724416,0.00640265,0.01138294,-0.07013566,0.00306808,-0.09757628,0.10414989,-0.13555837,-0.07873314,-0.00725415,-0.01418876,-0.05907412,-0.12452127,0.06237456,0.02260636,-0.06013175,0.11689295,-0.00200026,-0.03594812,0.07857288,-0.00288544,0.01148411,0.00891006,0.04702956,0.1205316,0.0079077,-0.07449158,0.00653283,0.15414064,0.13021031,0.01325423,-0.35491243,-0.00992016,-0.21460094,0.0558461,-0.07761839,-0.10909985,-0.05616508,0.01800609,0.06736821,0.00308393,0.04241242,-0.08351246,0.13501632,-0.10729794,-0.10229874,0.00066896,-0.01963937,0.05516102,-0.01612499,-0.09743191,-0.0314435,-0.01470971,-0.00125769,-0.01774654,0.2332938,0.14166495,0.16998142,-0.04843156,-0.08931472,0.13102795,0.14147657,0.02275739,-0.04335862,0.05724025,0.03936686,-0.10526938,-0.11637416,-0.0112917,0.05484914,-0.06934103,0.2543144,-0.17833991,-0.00828893,0.00174531,-0.03048271,-0.04773486,0.095866,-0.14434388,0.11433239,-0.10749247,0.03952292,0.03988512,-0.11541581,-0.07812429,-0.04978319,0.32052052,-0.0497911,-0.13022986,0.02477266,-0.05968329,0.01724695,0.01577485,-0.0497415,0.24494685,0.00361651,-0.08172874,-0.07473877,-0.01046288,0.02298573]") > 0.95
}
La regola sarà soddisfatta se all'interno del campione c'è almeno una funzione la cui similarità con il target è superiore a 0.95.
Se vuoi aggiungere safe al tuo repository yara:
Installa tutte le dipendenze
Copia il file libyara/modules/safe.c in tuo_rep/libyara/modules/safe.c
Copia la cartella libyara/include/python in tuo_rep/libyara/include
Alla fine di libyara/modules/module_list aggiungi ``` MODULE(safe)
Modifica libyara/Makefile.am:
libyara_la_LDFLAGS = -version-number 3:8:1
libyara_la_LDFLAGS += -LPATH_TO_PYTHON3.*_LIB -lpython3.*m -ljansson
Compila!