
Plongements SAFE pour mettre en correspondance des fonctions dans yara
SAFE est un outil développé pour créer des plongements (embeddings) de fonctions binaires, développé par Massarelli L., Di Luna G.A., Petroni F., Querzoni L. et Baldoni R. Vous pouvez utiliser SAFE pour créer vos propres plongements de fonctions à utiliser dans des règles yara.
Si vous êtes intéressé, jetez un œil à notre article de recherche : https://arxiv.org/abs/1811.05296
Si vous utilisez ceci pour votre recherche, veuillez citer :
@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}
}
Ceci n'est pas le code pour reproduire les expériences de l'article. Si cela vous intéresse, jetez un œil à : https://github.com/gadiluna/SAFE
Si vous préférez utiliser PyTorch, jetez un œil à SAFEtorch : https://github.com/facebookresearch/SAFEtorch
Avec yarasafe, vous pouvez facilement créer des signatures pour des fonctions binaires sans même regarder le code assembleur ! Vous avez simplement besoin d'installer les plugins IDA Pro que vous trouverez dans le dossier IDA Pro Plugin de ce dépôt.
Une fois le plugin installé, vous pouvez commencer à créer des plongements pour la fonction que vous souhaitez faire correspondre. Ces plongements peuvent être insérés dans des règles yara pour faire correspondre des fonctions à l'aide de yara. Pour créer une règle puissante, vous pouvez combiner les plongements de plusieurs fonctions avec des règles yara standard.
Dans ce dépôt, vous trouverez le plugin pour IDA Pro et le module yarasafe.
Yarasafe peut faire correspondre des fonctions comportant plus de 50 instructions et moins de 150.
Tout d'abord, installez le plugin IDA Pro. Vous trouverez les instructions pour le faire dans le dossier ida-pro-plugin de ce dépôt. Ensuite, vous pouvez utiliser notre conteneur docker ou compiler yara avec le module yarasafe.
La façon la plus rapide d'utiliser yarasafe est d'utiliser notre conteneur docker.
Tirez les images :
docker pull massarelli/yarasafeDémarrez le docker en montant le dossier qui contient la règle et le fichier à analyser :
docker run -v {FOLDER_TO_MOUNT}:/home/yarasafe/test -it massarelli/yarasafe bashLancez yara dans le docker avec votre règle !
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
Installez les dépendances yarasafe :
cd yarasafe/python_script
pip3 install -r requirements.txt
./bootstrap.sh
./configure.sh
make
export YARAPYSCRIPT={PATH_TO_YARASAFE_REPO}/python_script
Dans le dossier rules, vous trouverez la règle sample_safe_rule.yar. Cette règle devrait se déclencher avec n'importe quel fichier PE :
yara {PATH_TO_YARASAFE_REPO}/rules/sample_safe_rule.yar {FILES}
Pour créer votre règle safe-yara, vous devez d'abord créer les plongements pour votre fonction. Pour ce faire, vous pouvez utiliser le plugin IDA Pro fourni dans ce dépôt. Dans le dossier ida-pro-plugin, vous trouverez toutes les informations sur la façon d'exécuter le plugin !
Une fois que vous avez obtenu les plongements pour vos fonctions, il vous suffit de créer la règle. Un exemple de règle safe-yara est :
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 règle sera satisfaite si dans l'échantillon il y a au moins une fonction dont la similarité avec la cible est supérieure à 0,95.
Si vous souhaitez ajouter safe à votre dépôt yara :
Installez toutes les dépendances
Copiez le fichier libyara/modules/safe.c dans votre_rep/libyara/modules/safe.c
Copiez le dossier libyara/include/python dans votre_rep/libyara/include
À la fin de libyara/modules/module_list, ajoutez MODULE(safe)
Modifiez libyara/Makefile.am :
libyara_la_LDFLAGS = -version-number 3:8:1
libyara_la_LDFLAGS += -LPATH_TO_PYTHON3.*_LIB -lpython3.*m -ljansson
Compilez !