Explicando exploit batchOverflow en contratos inteligentes ERC20

BlockchainLab 26 Abr 2018,
Explicando exploit batchOverflow en contratos inteligentes ERC20

Introducción

Según un grupo de investigadores en ciberseguridad han descubierto una nueva vulnerabildiad en los tokens de Ethereum. Esta vez se trata de una vulnerabilidad en algunos tokens basados en el estándar ERC-20.

La vulnerabilidad, denominada batchOverFlow, es descrita por la startup PeckShield en Medium en el siguiente artículo: New batchOverflow Bug in Multiple ERC20 Smart Contracts (CVE-2018–10299) del 22 de abril.

Según explica, su equipo y él han descubierto una transacción inusual en el token de BeautyChain (BEC), donde alguien habría transferido una cantidad enorme.
Analizando el smart contract del token basado en el estándar de ERC-20, el autor del artículo comprueba que dicha transferencia proviene de un ataque «in-the-wild» que explota un bug previamente desconocido en el contrato.

Realizando una búsqueda fuzzy entre repositorios de smart contracts hemos encontrado que esta función se encuentra en otros contratos, como ejemplo, uno de ellos es UPCToken (UPCT) que ya ha empleado medidas para evitar que se explote esta vulnerabilidad bloqueando esta función (explicado más abajo).

 

¿Qué hace el ataque?

Fuente del artículo de PeckShield en Medium: https://medium.com/@peckshield/alert-new-batchoverflow-bug-in-multiple-erc20-smart-contracts-cve-2018-10299-511067db6536

Esta vulnerabilidad es, tal como se muestra en la imagen superior, consiste en provocar un desbordamiento (overflow en inglés) en la variable local amount, de tipo uint256, confundiendo al contrato con la cantidad de tokens que tenemos y los que mandamos, permitiéndonos mandar muchos tokens sin tener ninguno.

 

¿Cómo funciona exactamente?

  1. El atacante introduce una cantidad _value (la cantidad que se va a enviar a cada usuario) que multiplicada por el número de _recievers de 2^256
  2. Al calcularse la variable amount, se multiplica _value por _receivers, como el resultado es una unidad más que el valor máximo representable por un dato uint256 (2^256-1), se produce un overflow que convierte el valor de la variable amount en 0.
  3. Las condiciones del require se cumplen, en particular, hay que fijarse en balances[msg.sender] >= amount, al ser 0, se cumple la condición, y se puede realizar la transacción sin tener ningún token.
  4. La transacción se ejecuta y se le envía a cada _receiver la cantidad _value.

Cómo podemos evitar estos problemas:

Hemos visto que estos problemas pueden afectar mucho el precio y la confianza en el token, pero ¿cómo podemos evitarlo?, ¿hay alguien que haya pensado en esto?

La respuesta es que sí, incluso los creadores de esa función pensaron cómo protegerse aunque no demasiado bien.

Normalmente, para evitar overflows, se usa una librería originalmente desarrollada por OpenZeppeling, llamada safeMath, que consiste en funciones creadas para realizar las operaciones “-+*/” haciendo checkeos de overflow, aquí vemos como el creador usa .sub y .add en vez de “-” y “+” respectivamente, el fallo fué realizar “*” en vez de .mul.

Otra defensa es poder pausar sl funcionamiento del smart contract mediante un modificador, esta opción es muy poco popular porque da mucho poder al dueño del token, cargándose un poco la descentralización del mismo. Este sistema también fue implementado como vemos aquí.

Actualmente existen varias iniciativas para ofrecer programas de Bug Bounty en smart contracts como Solidified que permiten recompensar vulnerabilides encontradas.

Cabe destacar la importancia de realizar análisis técnico de código en smart contracts. Desde Grant Thornton tenemos un equipo multidisciplinar trabajando en el laboratorio Blockchain que está realizándo análisis técnico y estudiando smart contracts así como nuevas posibles vulnerabilidades para detectarlas y reportarlas a tiempo.

Probando el exploit de forma segura

Hay que notar que todos los contratos mencionados están pausados y por lo tanto no son explotables, si se quiere probar el exploit, hemos subido contratos vulnerables a Ropsten: 0x0b3b8e8e48018fA9f29b15146ca20B3dFB2f04FC y Rinkeby 0xF8fB4dAeA58D2aE779DEb550B7D3E374fCe7B283 el BatchOverflow token.

Más vulnerabilidades

Dos días después de reportar esta vulnerabilidad, el mismo grupo de ciberseguriad reportó otro bug denominado proxyOverflow con la misma técnica. En el siguiente artículo “Integer Overflow (i.e., proxyOverflow Bug) Found in Multiple ERC20 Smart Contracts (CVE-2018–10376)” se describen los detalles de como a través de dos parámetros de entrada en el método proxyTransfer se podría provocar un desbordamiento a 0 con los parámetros de entrada.

Conclusiones

Este problema descrito ya había sido planteado y debatido en julio de 2016 en un hilo de ethereum.stackexchange para conocer el valor máximo posible de los enteros sin signo uint256. Funciones como .mul, o .sub permiten realizar operaciones más seguras. Siempre es recomendable realizar análisis técnico del código de un smart contract para revisar todos los puntos de fallo posibles.

Durante el día de ayer, varias casas de cambio han tenido que congelar los movimientos temporalmente debido a que esto podría provocar que usuarios con grandes cantidades de tokens puedan manipular el mercado. Algunas han habilitado de nuevo los depósitos horas más tarde.

Blockchain y el Sector Salud

Introducción a Blockchain Blockchain es un protocolo distribuido que permite el intercambio de información o valor (tokens), entre dos o

Criptografía básica para entender la tecnología blockchain

Criptografía. Del gr. κρυπτός kryptós ‘oculto’ y -grafía. 1. f. Arte de escribir con clave secreta o de un modo enigmático.

Blockchain & GDPR

La tecnología Blockchain y sus aplicaciones han supuesto un reto regulatorio para los legisladores de todo el mundo. La definición