
Embeddings SAFE para corresponder a funções no yara
SAFE é uma ferramenta desenvolvida para criar Embeddings de Funções Binárias, desenvolvida por Massarelli L., Di Luna G.A., Petroni F., Querzoni L. e Baldoni R. Você pode usar SAFE para criar seu embedding de função para usar dentro de regras yara.
Se você estiver interessado, dê uma olhada em nosso artigo de pesquisa: https://arxiv.org/abs/1811.05296
Se você estiver usando isso para sua pesquisa, por favor cite:
@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 não é o código para reproduzir os experimentos do artigo. Se você estiver interessado, dê uma olhada em: https://github.com/gadiluna/SAFE
Se você preferir usar PyTorch, dê uma olhada em SAFEtorch: https://github.com/facebookresearch/SAFEtorch
Usando o yarasafe, você pode criar facilmente assinaturas para funções binárias sem precisar olhar para o código assembly! Você só precisa instalar os Plugins do IDA Pro que estão na pasta IDA Pro Plugin deste repositório. Depois de instalar o plugin, você pode começar a criar embeddings para as funções que deseja corresponder. Esses embeddings podem ser inseridos em regras yara para corresponder funções usando yara. Para criar regras poderosas, você pode combinar embeddings de múltiplas funções com regras yara padrão. Neste repositório você encontrará o plugin para IDA Pro e o módulo yarasafe. O Yarasafe pode corresponder funções com mais de 50 instruções e menos de 150.
Primeiramente, instale o plugin do IDA Pro. Você pode encontrar as instruções para isso na pasta ida-pro-plugin deste repositório. Depois, você pode usar nosso contêiner docker ou compilar o yara com o módulo yarasafe.
A maneira mais rápida de usar o yarasafe é usar nosso contêiner docker.
Baixe as imagens:
docker pull massarelli/yarasafeInicie o docker montando a pasta que contém a regra e o arquivo a ser analisado:
docker run -v {FOLDER_TO_MOUNT}:/home/yarasafe/test -it massarelli/yarasafe bashLance o yara dentro do docker com sua regra!
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
Instale as dependências do yarasafe:
cd yarasafe/python_script
pip3 install -r requirements.txt
./bootstrap.sh
./configure.sh
make
export YARAPYSCRIPT={PATH_TO_YARASAFE_REPO}/python_script
Dentro da pasta rules você pode encontrar a regra sample_safe_rule.yar. Esta regra deve disparar com qualquer arquivo PE:
yara {PATH_TO_YARASAFE_REPO}/rules/sample_safe_rule.yar {FILES}
Para criar sua regra safe-yara, primeiro você precisa criar os embeddings para sua função. Para fazer isso, você pode usar o plugin IDA Pro fornecido neste repositório. Dentro da pasta ida-pro-plugin você encontra todas as informações sobre como executar o plugin! Depois de obter os embeddings para suas funções, você só precisa criar a regra. Um exemplo de regra 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
}
A regra será satisfeita se dentro da amostra houver pelo menos uma função cuja similaridade com o alvo seja superior a 0,95.
Se você quiser adicionar safe ao seu repositório yara:
Instale todas as dependências
Copie o arquivo libyara/modules/safe.c para your_rep/libyara/modules/safe.c
Copie a pasta libyara/include/python para your_rep/libyara/include
No final de libyara/modules/module_list adicione ``` MODULE(safe)
Modifique libyara/Makefile.am:
libyara_la_LDFLAGS = -version-number 3:8:1
libyara_la_LDFLAGS += -LPATH_TO_PYTHON3.*_LIB -lpython3.*m -ljansson
Compile!