miércoles, junio 01, 2022

Blockchain & SmartContracts: Auditoría y Pentesting de SmartContracts (y BlockChains) con herramientas de análisis de código estático

En las anteriores partes vimos, primero patrones y recomendaciones de seguridad para los SmartContracts y las cadenas de BlockChain y, en segundo lugar una serie de  Herramientas visuales que nos podían ayudar para que nuestros SmartContacts y BlockChain tuvieran una mejor seguridad, dándonos ayudas visuales. En el artículo de hoy vamos a continuar hablando sobre cómo fortificar mejor y auditar SmartContracts, y para ello hoy vamos a ver unas cuantas herramientas de análisis de código estático.

Figura 1: Blockchain & SmartContracts: Auditoría y Pentesting de
SmartContracts (y BlockChains) con herramientas de análisis de código estático

Estas nos van ha ayudar a seguir algunos de los “buenos patrones” que nombramos en el primer artículo, además de avisarnos si tenemos algún tipo de vulnerabilidad en nuestro código. Para conseguir este objetivo, estas herramientas se basan en procesar y analizar el código de nuestros contratos en busca de patrones o similitudes con el de otros que tuvieran problemas. Vamos a ver algunas herramientas.

Herramienta Slither:

Esta es una de las herramientas por excelencia a la hora de auditar contratos. Es capaz de detectar más de 80 vulnerabilidades distintas en un contrato además de sugerir optimizaciones para el mismo. Se instala simplemente ejecutando:
“
pip3 install slither-analyzer
“
Una vez instalado basta con ejecutar el siguiente comando para que busque posibles vectores de ataque en tu contrato.
“
slither . [NombreDeContrato]
“
En mi caso, de todo lo que resaltó Slither lo más importante fue una vulnerabilidad de Reentrancy que tenía una función.


Además algunas de las cosas que también permite son las siguientes:
  • Proxy Upgradeability: Comprobar si tu contrato puede ser actualizado utilizando el patrón Proxy. Si ya tienes instalado Slither basta con ejecutar el siguiente comando.
“
slither-check-upgradeability . [ContractName]
“
Figura 3: Slither evaluando si el contrato es actualizable

  • Code similarity detector: Comprobar si una función en tu contrato es vulnerable si es similar a otras parecidas. Esto lo hace posible un avanzado modelo de machine learning y 60.000 SmartContracts vulnerables de ejemplo. Para usar esta utilidad hace falta instalación adicional, para ello dirígete a este enlace. Una vez instalado todo lo requerido, podremos por ejemplo recopilar información de una función que tenga nuestro contrato.
“
slither-simil test etherscan_verified_contracts.bin --filename [pathDelFichero] --fname [NombreDelContrato].[NombreDeLaFuncion] --input cache.npz --ntop 25 --solc solc-0.4.25
“
Figura 4: Slither encontrando código similar en EtherScan

Además permite que continúes tú mismo entrenando el modelo. Eso sí para lograr algo significativo te harán falta muchos SmartContracts.
  • ERC Conformance: Comprueba si tu contrato cumple a rajatabla los estándares ERC y por lo tanto si otros contratos pueden interactuar con él. No hace falta instalar nada más, con lanzar el siguiente comando basta.
“
slither-check-erc . [Nombre Del Contrato]
“
Figura 5 Slither verificando si el token cumple con los estándares.
Herramienta Gigahorse Toolchain
 
Gigahorse es una herramienta que convierte código compilado a instrucciones de la EVM a un lenguaje de orden más alto basado en funciones, es muy parecido a LLVM solo que en vez de compilar este decompila. Esta es una herramienta de muy bajo nivel, por lo general se utiliza solamente para construir otras herramientas que requieran de decompilar el bytecode de Smart Contracts. Como es una herramienta que no se usa muy a menudo no os enseñaré ni cómo instalarla ni cómo usarla, simplemente os dejo una imagen de qué pasa cuándo se usa. El bytecode que he usado es éste.

Figura 6: Slither decompilando el Bytecode

En la imagen os muestro algunas de la información que saca la herramienta del bytecode, como el nombre de las funciones con sus inputs y tipos de salida, el ensamblador equivalente, algunos metadatos… Además mucha otra información, pero como veis por el carácter de la información que nos proporciona la herramienta está más orientada a ser usada por debajo de otras herramientas, algunas de ellas son MadMax, Ethainter

Herramienta MadMax

MadMax se encarga de buscar vulnerabilidades asociadas al gas en tus contratos y evitar así posibles ataques de DoS o similares. Esta herramienta por detrás utiliza Gigahorse y para poder usarla hará falta tener Gigahorse instalado. Una vez lo tengamos instalado clonamos el repositorio de MadMax con el parámetro “--recursive” y accedemos al repositorio y compilamos Souflle para poder usarlo.
“””
cd gigahorse-toolchain/souffle-addon && make
“””
Después ejecutamos MadMax pasándole por parámetros el bytecode del contrato.
“””
gigahorse-toolchain/gigahorse.py -C madmax.dl [contract.hex]
“””
Si usáis sistemas operativos basados en Arch lo mas seguro es que no lo podáis ejecutar por problemas con librerías, como me ha pasado a mí. Si queréis ver ejemplos del uso de esta herramienta podéis acceder a esta aplicación web y observar cómo se usa MadMax para realizar parte de la decompilación de bytecode en un lenguaje muy similar a Solidity.

Herramienta Oyente

En su artículo se define la herramienta de la siguiente manera “An Smart Contracts analysis tool based symbolic execution” ergo, una herramienta de análisis que se encarga de analizar para qué entradas un contrato puede tener fallos o vulnerabilidades. 
Se puede instalar de dos formas, una minimal y otra full; en nuestro caso no vamos a necesitar ninguna parte de la herramienta de la parte full así que instalaremos la versión minimal.

Figura 8: Oyente buscando vulnerabilidades en el SmartContract

Para instalar la herramienta simplemente tenemos que ejecutar los siguientes comandos, ya que sólo se puede utilizar en sistemas operativos basados en GNU/Linux.
“””
python2 -m virtualenv env
source env/bin/activate
pip2 install web3==3.6.0
pip2 install oyente
“””
Y para ejecutar la herramienta podemos pasarle un contrato escrito en Solidity o el bytecode de un contrato o una URL con el contrato. En nuestro caso vamos a usar el bytecode anterior.
“””
oyente -s contract.hex -b
“””
Herramienta Echidna

Se basa en Fuzzy Finding para encontrar patrones en tu código que puedan dar lugar a vulnerabilidades, además muy parecida a Slither y de hecho en parte por detrás utiliza Slither. En concreto esta herramienta se enfoca más en CI/CD para que le puedas hacer tests de integración continua a tus contratos y así asegurarte de que nunca subes un error grave.



Entre los proyectos que lo usan se encuentra Uniswap, así que es una herramienta bastante conocida. Para instalarla simplemente tenemos que clonar el repositorio, acceder a él y lanzar los siguientes comandos en la consola:
“””
docker build -t echidna .
“””
Esto puede tardar un rato largo dependiendo del ordenador que tengas, sino si tienes un sistema operativo común como Ubuntu o alguno basado en Debian puedes ir a releases y descargar la última versión para tu sistema operativo. En mi caso como uso Arch pues tengo que compilar desde source. Ahora para probarla podéis ejecutar el siguiente comando:

- Si lo habéis instalado desde docker:
“””
docker run -it -v `pwd`:/src echidna echidna-test /src/tests/solidity/basic/flags.sol
“””
- Si lo habéis instalado normal:
“””
echidna echidna-test [pathDelContrato]
“””
Figura 10: Echidna pasando tests al contrato provisto.

Bien, estas son algunas de las herramientas de análisis estático más importantes a la hora de auditar Smart Contracts sobre todo si son compatibles con la EVM. En un siguiente artículo os mostraré las herramientas de análisis dinámico con las cuales es más fácil detectar de forma satisfactoria bugs o vulnerabilidades que nuestro contrato tenga. Información crítica para mejorar la seguridad, que puedes complementar con lecturas como la de este libro donde vas a aprender qué rastros buscan los investigadores en tus actividades.

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

 Más artículos sobre este mundo Web3:
Saludos,

1 comentario:

  1. Hola Chema, estoy intentando analizar un contrato con slither, como indica en el texto basta con poner slither (nombredearchivo)? me tira un error, también he intentado poner slither (ruta del archivo) pero sigue tirandome errores, como debo hacerlo?

    ResponderEliminar