
SAFE embeddings para hacer coincidir funciones en yara
SAFE es una herramienta desarrollada para crear Embeddings de Funciones Binarias por Massarelli L., Di Luna G.A., Petroni F., Querzoni L. y Baldoni R. Puedes usar SAFE para crear tu embedding de funciones para usar dentro de reglas de yara.
Si estás interesado, echa un vistazo a nuestro artículo de investigación: https://arxiv.org/abs/1811.05296
Si usas esto para tu investigación, por favor 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}
}
Este no es el código para reproducir los experimentos del artículo. Si estás interesado, echa un vistazo a: https://github.com/gadiluna/SAFE
Si prefieres usar PyTorch, echa un vistazo a SAFEtorch: https://github.com/facebookresearch/SAFEtorch
Usando yarasafe puedes crear fácilmente firmas para funciones binarias sin mirar el código ensamblador en absoluto! Solo necesitas instalar los Plugins de IDA Pro que encuentras en la carpeta IDA Pro Plugin de este repositorio.
Una vez que hayas instalado el plugin, puedes comenzar a crear embeddings para la función que deseas coincidir. Estos embeddings se pueden insertar en reglas de yara para coincidir funciones usando yara. Para crear reglas potentes, puedes combinar embeddings de múltiples funciones con reglas yara estándar.
En este repositorio encontrarás el plugin para IDA Pro y el módulo yarasafe.
Yarasafe puede coincidir funciones con más de 50 instrucciones y menos de 150.
Primero que nada, instala el plugin de IDA Pro. Puedes encontrar las instrucciones para hacerlo en la carpeta ida-pro-plugin de este repositorio. Luego puedes usar nuestro contenedor docker o compilar yara con el módulo yarasafe.
La forma más rápida de usar yarasafe es usar nuestro contenedor docker.
Descarga las imágenes:
docker pull massarelli/yarasafeInicia el docker montando la carpeta que contiene la regla y el archivo a analizar:
docker run -v {FOLDER_TO_MOUNT}:/home/yarasafe/test -it massarelli/yarasafe bash¡Ejecuta yara dentro del docker con tu regla!
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
Dentro de la carpeta rules puedes encontrar la regla sample_safe_rule.yar. Esta regla debería activarse con cualquier archivo PE:
yara {PATH_TO_YARASAFE_REPO}/rules/sample_safe_rule.yar {FILES}
Para crear tu regla safe-yara, primero necesitas crear los embeddings para tu función. Para lograr esto, puedes usar el plugin de IDA Pro incluido en este repositorio. Dentro de la carpeta ida-pro-plugin puedes encontrar toda la información sobre cómo ejecutar el plugin.
Una vez que obtengas los embeddings para tus funciones, solo necesitas crear la regla. Un ejemplo de regla safe-yara es:
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 regla se cumplirá si dentro de la muestra hay al menos una función cuya similitud con el objetivo sea mayor a 0.95.
Si quieres añadir safe a tu repositorio de yara:
MODULE(safe)libyara_la_LDFLAGS = -version-number 3:8:1
libyara_la_LDFLAGS += -LPATH_TO_PYTHON3.*_LIB -lpython3.*m -ljansson