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.
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.
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:
Además algunas de las cosas que también permite son las siguientes:
Además permite que continúes tú mismo entrenando el modelo. Eso sí para lograr algo significativo te harán falta muchos SmartContracts.
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.
Figura 2:Vulnerabilidad de Reentrancy
- 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.
- Análisis Propios: Incluso permite automatizar tus propios análisis usando una API de Python3 “sencilla”.
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
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.
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.
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.
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.
Figura 9: Docker: SecDevOps 2ª Edición
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:
- Blockchain & SmartContracts: Una serie para aprender
- Blockchain & SmartContracts: Primer SmartContract con Solidity
- Blockchain & SmartContracts: Cómo probar y desplegar un SmartContract en Ethereum
- WWW, Web 1.0, Web 2.0, Web 3.0, Web3 y ¿Web 4.0?
- Metaverso, multiverso y las tierras digitales en que vivimos en forma de avatar
- Los Fan Tokens vs. las Criptomonedas y los NFTs: Level 101
- Tokenomics: Las criptomonedas y las "Proof-of-work": Level 101
- Los NFTs y el registro mundial de los dueños de activos digitales en el Metaverso
- El-Italiano.docx: Las obras de arte únicas en el mundo digital y el expolio de los maestros
- BitCoin: Blockchain y su investigación
- Cada día nuevas Criptomonedas: Cada día nuevos Ups & Downs
- BlockChain & SmartContrats: El Internet descentralizado y el almacenamiento off-chain en IPFS
- Reentrancy Attack: Cómo te roban criptomonedas por un bug en tu SmartContract
- BlockChain & SmartContract: Bugs que pueden dejar tu SmartContrat "fuera de juego"
- Blockchain & SmartContracts: Patrones y buenas prácticas de seguridad
- Blockchain & SmartContracts: Herramientas de Auditoría de Seguridad de SmartContracts
- Blockchain & SmartContracts: Herramientas de análisis de código estático
Saludos,
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