Comprensión de los ataques de desbordamiento y desbordamiento en contratos inteligentes

Guía de ataques de desbordamiento y desbordamiento en contratos inteligentes.

Considere el siguiente diagrama:

Comprensión de los ataques de desbordamiento y desbordamiento en contratos inteligentes

Ese es un odómetro normal que calcula la distancia que ha recorrido su automóvil. Este odómetro va de 000000 – 999999. Es por eso que en el momento en que cruza a 1,000,000 km, su odómetro volverá a 000000.

Esto puede tener repercusiones muy graves..

Comprensión de los ataques de desbordamiento y desbordamiento en contratos inteligentes

Piense en el cambio de milenio y el problema del año 2000. Y2K era una clase de errores informáticos que amenazaban con causar estragos durante el cambio de milenio. Para que sea lo más simple posible, muchos programas representan años de cuatro dígitos con solo los dos últimos dígitos. Por lo tanto, 1998 se almacenó como 98 y 1999 como 99. Sin embargo, esto sería problemático cuando el año cambia a 2000, ya que el sistema lo guardará como 00 y volverá a 1900..

Los dos ejemplos que le hemos dado anteriormente son una clase de errores denominados “desbordamiento de enteros”. En esta guía, vamos a explorar los efectos perjudiciales de los ataques de desbordamiento y desbordamiento en los contratos inteligentes..

#Crypto ExchangeBenefits

1

Binance
Best exchange


VISIT SITE
  • ? The worlds biggest bitcoin exchange and altcoin crypto exchange in the world by volume.
  • Binance provides a crypto wallet for its traders, where they can store their electronic funds.

2

Coinbase
Ideal for newbies


Visit SITE
  • Coinbase is the largest U.S.-based cryptocurrency exchange, trading more than 30 cryptocurrencies.
  • Very high liquidity
  • Extremely simple user interface

3

eToro
Crypto + Trading

VISIT SITE
  • Multi-Asset Platform. Stocks, crypto, indices
  • eToro is the world’s leading social trading platform, with thousands of options for traders and investors.

El error de desbordamiento

Se produce un desbordamiento cuando un número se incrementa por encima de su valor máximo. Supongamos que declaramos una variable uint8, que es una variable sin signo y puede tomar hasta 8 bits. Esto significa que puede tener números decimales entre 0 y 2 ^ 8-1 = 255.

Teniendo esto en cuenta, considere el siguiente ejemplo.

uint a = 255;

a ++;

#CRYPTO BROKERSBenefits

1

eToro
Best Crypto Broker

VISIT SITE
  • Multi-Asset Platform. Stocks, crypto, indices
  • eToro is the world’s leading social trading platform, with thousands of options for traders and investors.

2

Binance
Cryptocurrency Trading


VISIT SITE
  • ? Your new Favorite App for Cryptocurrency Trading. Buy, sell and trade cryptocurrency on the go
  • Binance provides a crypto wallet for its traders, where they can store their electronic funds.

#BITCOIN CASINOBenefits

1

Bitstarz
Best Crypto Casino

VISIT SITE
  • 2 BTC + 180 free spins First deposit bonus is 152% up to 2 BTC
  • Accepts both fiat currencies and cryptocurrencies

2

Bitcoincasino.io
Fast money transfers


VISIT SITE
  • Six supported cryptocurrencies.
  • 100% up to 0.1 BTC for the first
  • 50% up to 0.1 BTC for the second

Esto dará lugar a un desbordamiento porque el valor máximo de a es 255.

Solidity puede manejar números de hasta 256 bits. Incrementar en 1 haría una situación de desbordamiento:

Esto conducirá a un desbordamiento, porque el valor máximo de a es 255.

Solidity puede manejar números de hasta 256 bits. Incrementar en 1 haría una situación de desbordamiento:

0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

+ 0x000000000000000000000000000000000001

—————————————-

= 0x000000000000000000000000000000000000

Revisemos el error de desbordamiento con un simple contrato de transferencia de token (código tomado de GitHub):

mapeo (dirección => uint256) public balanceOf;

// INSEGURO

transferencia de función (dirección _to, uint256 _value) {

/ * Comprueba si el remitente tiene saldo * /

require (balanceOf [msg.sender] >= _valor);

/ * Suma y resta nuevos saldos * /

balanceOf [msg.sender] – = _value;

balanceOf [_to] + = _value;

}

// SEGURO

transferencia de función (dirección _to, uint256 _value) {

/ * Comprueba si el remitente tiene saldo y si hay desbordamientos * /

require (balanceOf [msg.sender] >= _valor && balanceOf [_to] + _value >= balanceOf [_to]);

/ * Suma y resta nuevos saldos * /

balanceOf [msg.sender] – = _value;

balanceOf [_to] + = _value;

}

Entonces que tenemos aqui?

Hay dos funciones de “transferencia” que se utilizan en el programa anterior. Uno está comprobando si hay un desbordamiento, mientras que el otro no lo está comprobando. La función de transferencia segura verifica si el saldo alcanza el valor máximo.

Ahora, debes tener una cosa en mente. Esta función puede no ser relevante todo el tiempo, especialmente en el escenario indicado anteriormente. Como desarrollador, uno debe pensar si el valor alguna vez alcanzará un nivel tan alto o si simplemente están gastando gas innecesariamente.

El error de desbordamiento

Ahora, llegamos al otro extremo del espectro, el error de desbordamiento. Esto funciona exactamente en la dirección opuesta. ¿Recuerda cómo uint8 puede tomar valores solo entre 0 y 255? Considere el siguiente código.

unint8 a = 0;

a-;

Acabamos de causar un subdesbordamiento que hará que a tenga el valor máximo posible, que es 255.

Aplicando la misma lógica en contratos inteligentes de solidez:

0x000000000000000000000000000000000000

– 0x000000000000000000000000000000000001

—————————————-

= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

Como puede ver, puede dar lugar a una tergiversación grave de datos..

Echemos un vistazo a un fragmento de código y veamos cómo un simple desbordamiento puede causar estragos en un contrato inteligente (código tomado de GitHub):

mapeo (dirección => uint256) public balanceOf;

// INSEGURO

transferencia de función (dirección _to, uint256 _value) {

/ * Comprueba si el remitente tiene saldo * /

require (balanceOf [msg.sender] >= _valor);

/ * Suma y resta nuevos saldos * /

balanceOf [msg.sender] – = _value;

balanceOf [_to] + = _value;

}

// SEGURO

transferencia de función (dirección _to, uint256 _value) {

/ * Comprueba si el remitente tiene saldo y si hay desbordamientos * /

require (balanceOf [msg.sender] >= _valor && balanceOf [_to] + _value >= balanceOf [_to]);

/ * Suma y resta nuevos saldos * /

balanceOf [msg.sender] – = _value;

balanceOf [_to] + = _value;

}

En el ejemplo de código dado anteriormente, un hacker puede aprovechar manipulateMe porque las matrices dinámicas se almacenan de manera secuencial. Todo lo que un hacker necesita hacer es:

Llame a popBonusCode a subdesbordamiento

Calcule la ubicación de almacenamiento de manipulateMe

Modifica y actualiza el valor de manipulateMe usando modifiedBonusCode

Obviamente es sencillo señalar todos los errores en funciones aisladas, sin embargo, imagina un contrato inteligente largo y complicado con miles de líneas de código. Puede ser muy fácil perder la pista de un error de este tipo mientras se verifica el código.

Peligros de ataques de desbordamiento y desbordamiento

Es más probable que ocurra el error de desbordamiento que el error de desbordamiento, porque será algo inviable que alguien obtenga la cantidad requerida de tokens para causar un desbordamiento.

Imagine una situación en la que el poseedor de una ficha solo tiene X fichas. Supongamos que intenta gastar X + 1 fichas. Si el programa ni siquiera verifica eso, existe la posibilidad de que un atacante termine con más tokens de los que realmente tiene y obtenga un saldo máximo.

Considere el siguiente ejemplo (tomado de nethemba):

solidez del pragma ^ 0.4.22;

Token de contrato {

mapeo (dirección => uint) saldos;

transferencia de función (dirección _to, uint _value) public {

require (saldos [msg.sender] – _value >= 0);

saldos [msg.sender] – = _value;

equilibra [_a] + = _valor;

}

}

En el código dado anteriormente, la condición requerida en la función de “transferencia” puede parecer correcta a primera vista, pero solo hasta que se dé cuenta de que las operaciones entre dos unidades producen un valor unitario.

Lo que esto significa en última instancia es que el valor de saldos [msg.sender] – _value >= 0 siempre será cierto independientemente de la condición.

Debido a esta condición, un pirata informático puede poseer más fondos de los que realmente posee y maximizar su saldo. P.ej. si el pirata informático posee 100 tokens e intenta poseer 101 tokens, terminará con 100-101 tokens, lo que le da 2 ^ 256-1 tokens como resultado del desbordamiento!

Esto simplemente puede romper todo el sistema..

Problemas del mundo real causados ​​por ataques de desbordamiento

4chan’s / biz / agrupados crearon una “Moneda de prueba de manos débiles” o POWH. Era un esquema Ponzi legítimo, sin embargo, la gente todavía lo compró y creció a más de un millón de dólares..

Sin embargo, resulta que los desarrolladores de POWH coin no aseguraron todas las operaciones y no pudieron colocar las defensas adecuadas contra los ataques de desbordamiento y subdesbordamiento. Por esta misma razón, un pirata informático desconocido pudo desviar 2000 ETH, que valía ~ $ 2.3 millones.

Como puede ver, es importante que un desarrollador fortalezca sus defensas contra los ataques de overflow y underflows. Como cazarrecompensas, debe estar atento a los ataques de desbordamiento / desbordamiento.

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me