SmartContracts: Bugs que pueden dejar tu contrato ‘fuera de juego’
Hemos hablado sobre el Ataque de Reentrancy y cómo evitarlo en un SmartContract. Vemos que el crecimiento de los SmartContract es rápido y nos abre un mundo nuevo de posibilidades a través de la Web3. Hoy vamos a trabajar otras vulnerabilidades que pueden afectar a las posibilidades de un SmartContract. Las denegaciones de servicio son la pérdida de disponibilidad de un activo y es una vulnerabilidad que afecta a una de las dimensiones de la ciberseguridad.
Por esta razón, un DoS en un contrato puede suponer la pérdida de disponibilidad de dicho contrato y los usuarios que tienen fondos o que tienen que operar con dicho contrato pueden verse afectados no pudiendo realizar operaciones. Esto es un problema que como se irá viendo en el artículo, puede llevar a la pérdida de las operaciones y el bloqueo de fondos en un contrato.
En el ámbito de la denegación de servicios de un contrato existen muchas formas, por lo que desde el punto de vista de desarrollo se deben tener en cuenta muchos aspectos y realizar muchas pruebas antes del despliegue para encontrar fallos que provoquen el bloqueo de operación en el contrato.
Ejemplificando el caso de DoS
Para entender mejor todo esto, vamos a ejemplificar el caso de la denegación de servicio (o un caso) a través de un supuesto. Para ello, vamos a proponer el siguiente escenario:
Figura 1: SmartContracts: Bugs que pueden dejar tu contrato ‘fuera de juego’
Por esta razón, un DoS en un contrato puede suponer la pérdida de disponibilidad de dicho contrato y los usuarios que tienen fondos o que tienen que operar con dicho contrato pueden verse afectados no pudiendo realizar operaciones. Esto es un problema que como se irá viendo en el artículo, puede llevar a la pérdida de las operaciones y el bloqueo de fondos en un contrato.
Figura 2: Libro dedicado a "Bitcoin: La tecnología Blockchain y su investigación" de Yaiza Rubio y Félix Brezo |
Ejemplificando el caso de DoS
Para entender mejor todo esto, vamos a ejemplificar el caso de la denegación de servicio (o un caso) a través de un supuesto. Para ello, vamos a proponer el siguiente escenario:
- Pensemos que tenemos un sistema de pujas a través de un SmartContract.
- El SmartContract tiene una función que se encarga de recibir una puja de un contrato / usuario. Si este contrato / usuario pujan con más cantidad de fondos, lo que hace el contrato es devolver los fondos metidos por el anterior “pujista” y colocan como virtual ganador de la puja al nuevo “pujista”.
- Recibo puja
- Compruebo si la puja es mayor que la que tengo almacenada como ganadora
- Si la puja es mayor, devuelvo los fondos del anterior ‘pujista’ y guardo los nuevos fondos y pongo el nuevo virtual ganador de la puja
La función interactúa en una misma llamada con dos contratos. El contrato al que se le devuelven los fondos, en caso de que haya una puja mayor, y el contrato que está pujando. Si el contrato al que devolvemos los fondos no acepta pagos tenemos un problema, ¿Por qué?
Si el contrato al que se le devuelven los fondos, rechaza esto, la función (dependiendo de cómo se implemente) puede no poder devolver los fondos. Esto produce que el nuevo pujista no pueda ser ‘coronado’ virtual ganador, provocando la denegación de servicio, ya que el SmartContract que gestiona la puja no podrá nunca devolver los fondos y no podrá colocar un nuevo ganador.
En el vídeo anterior de la charla de Open Expo CyberSecurity Talent Day 2022 sobre Seguridad en SmartContrats se puede ver un ejemplo concreto de este caso expuesto con Remix IDE y Ganache como BlockChain local. Además, en el video se pueden ver conceptos básicos por si quieres comenzar a aprender sobre este y ver cómo se puede montar un laboratorio para hacer pruebas con tus SmartContracts.
Figura 3: Esquema del ataque
Si el contrato al que se le devuelven los fondos, rechaza esto, la función (dependiendo de cómo se implemente) puede no poder devolver los fondos. Esto produce que el nuevo pujista no pueda ser ‘coronado’ virtual ganador, provocando la denegación de servicio, ya que el SmartContract que gestiona la puja no podrá nunca devolver los fondos y no podrá colocar un nuevo ganador.
Figura 4: Pablo González "SmartContrats:
En el vídeo anterior de la charla de Open Expo CyberSecurity Talent Day 2022 sobre Seguridad en SmartContrats se puede ver un ejemplo concreto de este caso expuesto con Remix IDE y Ganache como BlockChain local. Además, en el video se pueden ver conceptos básicos por si quieres comenzar a aprender sobre este y ver cómo se puede montar un laboratorio para hacer pruebas con tus SmartContracts.
Mitigando o evitando el DoS
¿Cómo podemos evitar que este tipo de fallo concreto no lo tengamos? Vamos a proponer algunas ideas, aunque no son las únicas. A continuación, enumeramos algunas opciones:
- Lo primero que se nos puede ocurrir es hacer que el usuario sea el que solicite la devolución al ver que ya no es ganador de la puja, por lo que el contrato gestor de la puja debe tener un registro de qué fondos ha aportado cada ‘pujista’ y una función dónde el usuario solicite la devolución de sus fondos.
- Es importante el separar la lógica de interacción con varios usuarios en una función (es justo lo que ocurría en este caso). Ya que, como se ha visto, un usuario puede afectar al resto por una decisión suya.
Figura 5: Retos para probar vulnerabilidades.
El objetivo es concienciar a las personas y que aprendan a evitar estas vulnerabilidades. Seguiremos mostrando más vulnerabilidades en el mundo de los SmartContracts y seguiremos aprendiendo más sobre este interesante mundo de la Web3. Más artículos sobre este mundo Web3:
- Blockchain & SmartContracts: Una serie para aprender
- BlockChain & SmartContrats: 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
- BitCoin: Blockchain y su investigación
- 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
Autor: Pablo González Pérez (@pablogonzalezpe), escritor de los libros "Metasploit para Pentesters", "Hacking con Metasploit: Advanced Pentesting" "Hacking Windows", "Ethical Hacking", "Got Root", “Pentesting con Powershell” y de "Empire: Hacking Avanzado en el Red Team", Microsoft MVP en Seguridad y Security Researcher en el equipo de "Ideas Locas" de la unidad CDCO de Telefónica. Para consultas puedes usar el Buzón Público para contactar con Pablo González
Contactar con Pablo González |
No hay comentarios:
Publicar un comentario