jueves, mayo 12, 2022

Blockchain & SmartContracts: Patrones y buenas prácticas de seguridad

Alrededor de 34 millones de USD, es decir, un total de 11.539ETH en el momento, han sido bloqueados en el SmartContrat de AkuDreams para siempre, y muchos de los usuarios del contrato no podrán recuperar su dinero nunca. A esto hay que sumar que durante lo que llevamos de 2022 se estima que 1.300 millones de USD han sido robados en diferentes ataques a SmartContracts, muchos de estos se produjeron por fallos de seguridad en los propios contratos. 

Figura 1: Blockchain & SmartContracts.
Patrones y buenas prácticas de seguridad

Es por ello que últimamente se escucha mucho por las comunidades de web3 que hay que ocuparse en serio de “auditar contratos” y no es que un equipo legal se encargue de mirar tu contrato, sino que expertos en seguridad de SmartContracts se aseguren de que tu contrato no tenga ningún problema, como los que hemos hablado de D.o.S. a SmartContracts o el Ataque de Rentrancy, por citar solo un par de ellos.

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

En el artículo de hoy os voy a enseñar algunas de las metodologías y herramientas que se suelen utilizar a la hora de auditar contratos, porque los códigos que se programen en ellos pueden hacer que pierdas tus Criptomonedas o Criptotokens.

Patrones y buenas prácticas

Probablemente la parte más importante de securizar un contrato está en la creación. En general a la hora de crear SmartContracts se suelen seguir un mismo conjunto de prácticas y patrones.
  • Caza los bugs antes: es mejor que encuentres los bugs en la fase de creación porque si un contrato es subido a la Blockchain sin usar un Proxy este será inmutable para siempre y en lo que se refiere a SmartContracts los bugs y vulnerabilidades siempre suelen ir parejos a la pérdida de fondos en el contrato.
Figura 3: Tests unitarios de un contrato NFT)

  • Keep it Simple: Mantener los contratos lo más simple posible, cuanto más complejo sea un contrato más fácil será que este tenga algún tipo de error.
  • Factoriza: Solo implementa en el contrato aquello que es crítico que sea descentralizado, si algo no es necesario que sea descentralizado hazlo off-chain para que puedas modificarlo en el futuro si algo malo pasase.
  • Tecnología Probada: Usa código y herramientas ya existentes. La mayoría de ellas habrán sido testeadas a conciencia por muchos desarrolladores experimentados. En nuestro caso sirve como ejemplo las librerías de Openzeppelin que nos aportan muchas funcionalidades con la seguridad que esos contratos han sido auditados por expertos.
Figura 4: Wizard de OpenZeppelin
  • Modularizar el código: Este patrón va muy en la línea del anterior, si puedes dividir un contrato en varios mejor. Así mantendrás la lógica de ambos sencilla y si algún día hay un problema lo más seguro es que solo lo tenga uno de ellos y solventarlo sea más sencillo.
  • Aprende bien de Blockchain: Blockchain es un mundo en sí y mucha de la experiencia en desarrollo fuera de Web3 será útil para crear contratos, pero debes tener en cuenta que  Blockchain y los SmartContracts tienen muchas “propiedades nuevas”.
    • Las llamadas a contratos externos son una herramienta muy útil pero se debe tener cuidado con ella porque puede dar lugar a ejecución remota de código, cambios en el flujo de ejecución como el del ataque de Reentrancy.
    • No existen datos privados en Blockchain, por mucho que declares como privada una variable en tu contrato está siempre estará accesible puesto que todo lo que está en la blockchain es público, lo único a nivel de código otros smart contracts no podrán acceder a esa información directamente.
    • Ten en cuenta el Gas, ya que en la mayoría de Blockchains existe un coste asociado a la ejecución de una instrucción y además existe un número máximos de instrucciones ejecutables en una llamada, lo que significa que puede que una función no sea ejecutable nunca por lo larga que sea.
  • Prepárate para fallar: si tu contrato tiene una cantidad considerable de lógica entonces lo más probable es que tenga algún error y por lo tanto tienes que estar preparado para cuando estos aparezcan en producción. Lo habitual es:
    • Tener un “Circuit Breaker”, que significa que la lógica de tu contrato sea pausable, por ejemplo podríamos heredar el contrato “Pausable” que nos permite justo eso.
    • No pongas todo el dinero en riesgo, mantén muy limitadas las formas de extraer fondos de contratos.
    • Ten una estrategia para solucionar los errores que puedan surgir, como por ejemplo delegar la lógica a un contrato externo y poder cambiar el puntero hacia ese contrato hacia uno nuevo sin los errores.
Figura 5: Contrato NFT actualizable mediante un proxy
  • Favorece el sistema de “Pull over Push”, a la hora de gestionar la lógica en un contrato es mejor permitir que un usuario solo pueda modificar el estado que le afecta a él. Vemos un ejemplo:
Figura 6: Contrato vulnerable a D.oS.

En este caso usuarios diferentes pueden interferir con los fondos de los demás dado que cuando te conviertes en el pujador mayor te encargas también de devolver el dinero, en este caso se podría producir una denegación de servicio.

Figura 7: Contrato que implementa sistema Pull over Push

En este caso evitamos la denegación de servicio al adoptar un “Pull over Push”, de esta manera logramos que un usuario solo pueda interactuar con el estado que le concierne y así nos evitamos muchos problemas como el del D.o.S.

Conocer las vulnerabilidades

Los anteriores patrones y buenas prácticas nos ayudan a evitar bugs y fallos en el futuro, pero también es necesario conocer las vulnerabilidades más comunes y cómo se solucionan para evitar que nuestro contrato las tenga. En este artículo no vamos a tratarlas en profundidad porque poco a poco iremos presentandolas en detalle en otros artículos más adelante como el Ataque de Reentrancy que publicó Pablo Gonzalez. Sin embargo si queréis echar un vistazo por vuestra cuenta en esta web podréis tener una primera toma de contacto con algunas de las vulnerabilidades más conocidas.

En la próxima entrada, vamos a ver algunas herramientas visuales de análisis, ya sea estático o dinámico y de clasificación para ayudarte en en el proceso de tener unos SmartContracts más seguros. Nos vemos en la siguiente parte ;). Más artículos sobre este mundo Web3:
Saludos,

No hay comentarios:

Publicar un comentario