miércoles, junio 22, 2022

BlockChain & SmartContracts: Herramientas de análisis dinámico

A lo largo de los dos últimos artículos de esta serie de SmartContracts & Blockchain hemos visto diferentes recursos (parte 1, parte 2) que nos pueden ayudar a la hora de auditar SmartContracts. En el artículo de hoy vamos a ver algunas de las más usadas herramientas de análisis dinámico a la hora de auditar SmartContracts, sobre todo para aquellos compatibles con la EVM.

Figura 1: Blockchain & SmartContracts: Herramientas de análisis dinámico

Las herramientas de análisis dinámico son aquellas que nos proporcionan resultados dependiendo de la ejecución del código en runtime. En estas se despliega el bytecode del contrato compilado a una EVM local y se tratará de seguir el flujo del contrato para los inputs que se le den.
La primera herramienta que os muestro es Myth, que analiza, despliega y prueba el bytecode del contrato que le provee ais. Soporta contratos de Ethereum, Hedera, Quórum, Tron… Utiliza ejecución simbólica para detectar parte de las vulnerabilidades. Esta es una de las herramientas más usadas y conocidas para revisar la seguridad de SmartContracts.

Figura 2: Mypth analizando un SmartContract
(clic para ver en grande)

En la imagen tenemos Myth mostrando posibles vulnerabilidades de un SmartContratPara instalarlo simplemente tenemos que ejecutar lo siguiente en la consola.
“””
pip3 install mythril
“””
Y para ejecutarlo solo hay que lanzar el comando:
“””
myth analyze [smartContractFiles]
myth analyze -a [address]
“””
Es otra herramienta de ejecución simbólica para SmartContracts y Blockchains. Entre sus posibilidades permite explorar todos los posibles estados que puede alcanzar una función en un contrato, generar inputs conflictivos, detectar malos controles de flujo, acceder al análisis mediante una API de Python, etcétera.

Figura 3: Manticore detectando un overflow  

Puede analizar SmartContracts basados en EVM y WASM (Web Assembly Binaries). Para instalarla solamente tenemos que usar PIP:
“””
pip install manticore
(optional) pip install “manticore[native]”
“””
Y para usarla:
“””
manticore [file]
“”” 
MAIAN se encarga de detectar tres tipos de vulnerabilidades en SmartContracts basados en la EVM: Prodigal, Suicidal y Greedy. Funciona ejecutando el bytecode del contrato y trazando diferentes llamadas para confirmar la presencia de estos bugs. Si quieres entrar en profundidad en cómo funciona la herramienta aquí tienes su whitepaper.


Para instalarla simplemente tenemos que clonar su repositorio e instalar algunas dependencias:
“””
git clone https://github.com/ivicanikolicsg/MAIAN
pip3 install web3
sudo pacman -S ethereum evm solc python-pyqt5
“””
Y para ejecutarla tenemos varias opciones, la primera de ellas es usando el código fuente del contrato por ejemplo un contrato hecho en Solidity:
“””
python maian.py -s [file.sol] [contractName]
“””
La segunda es usando el bytecode del contrato en forma hexadecimal:
“””
python maian.py -bs [file.hex]
“””
Y la tercera y última usando el bytecode compilado:
“””
python maian.py -b [evmCompiledBytecode]
“””
Vertigo es un framework de Mutation testing hecho para testear SmartContracts. Para quien no sepa que es Mutation testing, es una forma de testing en la que se cambian componentes clave de código para asegurarse de que el software será capaz de detectar los errores en tiempo de ejecución. Su filosofía es más un voy a romper partes de tu programa a ver si este se da cuenta.

Figura 5: Libro dedicado a "Bitcoin: La tecnología Blockchain y su investigación"
de Yaiza Rubio y Félix Brezo

Cabe destacar que este framework está preparado para usarse en proyectos de Solidity como Hardhat o Truffle. Para poder usarlo solo tenemos que usar pip:
“””
pip3 install eth-vertigo
“””
Después dependiendo si tenemos nuestro proyecto con Hardhat(1) o Truffle y de las redes que tengamos configuradas en el proyecto deberemos usar los siguientes comandos:
“””
(1) vertigo run --hardhat-parallel 2
“””
“””
(2) vertigo run --network [configuredNetWorkInTruffle]
“””
Un ejemplo de la información que nos da la herramienta sería:
…
[*] Running analysis on 5 mutants
100%|████████████████████████████████████████████████████| 5/5
[00:17<00:00,  4.38s/mutant]
[*] Done with campaign run
[+] Report:
Mutation testing report:
Number of mutations:    5
Killed:                 4 / 5
Mutations:
[+] Survivors
Mutation:
   File: /Users/chgara/temp/tasks/contracts/Tasks.sol
   Line nr: 19
   Result: Lived
   Original line:
        if (balances[msg.sender] < amount) return false;
Mutated line:
        if (balances[msg.sender] <= amount) return false;
...
Un framework de análisis para Web Assembly y SmartContracts tanto EVM como BTC. Ofrece una sencilla API sobre la que construir herramientas que necesiten decompilar el bytecode de un contrato, trazar la llamada a una función, controlar el flujo de ejecución…

Figura 6: Resultado del código anterior
(Clic para agrandar)

Para instalarla nos basta con lanzar:
“””
pip3 install octopus
“””
Y un ejemplo del uso de la API de manera sencilla para observar el flujo de ejecución podría ser el siguiente:
from octopus.analysis.graph import CFGGraph
from octopus.platforms.ETH.cfg import EthereumCFG

file_name = "temp/tasks/evm_bytecode/Zeppelin_ethernaut0.bytecode"
with open(file_name) as f:
   bytecode_hex = f.read()
cfg = EthereumCFG(bytecode_hex)
graph = CFGGraph(cfg)
graph.view()
Esta ejemplo anterior es una API para usar análisis estático, pero la mayoría de las otras son para realizar análisis dinámico.

Conclusión

Cada poco tiempo suele saltar alguna noticia de un ataque a un SmartContract que hace perder millones a la comunidad y a sus desarrolladores. Con las herramientas y buenas prácticas que hemos visto en estos 4 últimos artículos de la serie de SmartContracts & Blockchain podemos tratar de verificar nosotros mismos la seguridad de los proyectos que usamos o creamos. Nos vemos en el próximo artículo. Más artículos sobre este mundo Web3:
Saludos,

AutorChema Garabito. Desarrollador Full-Stack. Ideas Locas Telefónica CDO.


No hay comentarios:

Publicar un comentario