Juan Fuente

jfuentet@gmail.com

Sandwich Attack

Sandwich Attack

El ataque sandwich es una estrategia que se utiliza en blockchain para manipular los precios de los activos. En este ataque, un atacante observa una transacción pendiente que afectará significativamente el precio de un activo, y luego coloca transacciones de compra y venta en ambos extremos de la transacción pendiente. Esto puede permitir al atacante obtener una ganancia a expensas de otros usuarios que están tratando de comprar o vender ese activo.

Es similar al front running, pero en esta ocasión lo que se persigue no es adelantarse a la transacción de otro, sino manipular el mercado en el propio beneficio, debido al modo en que se comportan los valores de las criptomonedas en las pools(donde se hace el intercambio entre una y otra) respecto a la demanda de una u otra. Cuanto más demanda hay de una, menos valor tiene, aumentando a la vez el de su par. Y viceversa, a mayor escasez, más valor..

Veamos un ejemplo de cómo podría ocurrir esto en un contrato de intercambio de criptomonedas. Esto podría ser una simple transacción:

Ejemplo1_Vulnerabilidad_Smart_Contracts_solidity_Sandwich_Attack_Que_es_y_como_solucionarlo_JuanFuente

En este contrato, los usuarios pueden intercambiar tokens A por tokens B. Un atacante podría observar una transacción de intercambio pendiente que está a punto de cambiar una gran cantidad de tokens A por tokens B.

El atacante podría entonces colocar una transacción de compra de tokens B antes de la transacción pendiente y una transacción de venta de tokens B después de la transacción pendiente. Esto podría permitir al atacante comprar tokens B a un precio más bajo y luego venderlos a un precio más alto, obteniendo una ganancia a expensas del usuario original que quería realizar la transacción. 

Para prevenir este tipo de ataque, se pueden utilizar varias medidas de defensa. Una podría ser limitar el tiempo entre transacciones. Por ejemplo podría ser algo así:

Ejemplo2_Vulnerabilidad_Smart_Contracts_solidity_Sandwich_Attack_Que_es_y_como_solucionarlo_JuanFuente

En este ejemplo, la variable timeLimit establece el tiempo mínimo que debe transcurrir entre transacciones. La función executeTransaction verifica si ha pasado el tiempo establecido antes de permitir una nueva transacción. Esto puede dificultar la ejecución de un ataque sandwich al limitar la frecuencia de las transacciones en el contrato.


Otra de las posibles medidas de defensa seria usar commit-reveal. Este esquema implica dividir una transacción en dos partes: un «commit» que revela intenciones y un «reveal» que realiza la transacción. El commit se puede hacer de manera que el atacante no pueda predecir la transacción que se revelará, y el reveal se hace de tal manera que el atacante no puede modificar la transacción una vez que se ha revelado.


Aquí hay un ejemplo de cómo se podría implementar un esquema de commit-reveal en Solidity: 

Ejemplo3_Vulnerabilidad_Smart_Contracts_solidity_Sandwich_Attack_Que_es_y_como_solucionarlo_JuanFuente

En este contrato, los usuarios pueden hacer un «commit» enviando un hash de su secreto y un número de bloque en el que se revelará el secreto. Luego, pueden revelar el secreto original para validar que coincide con el hash. Si el secreto es válido y se ha alcanzado el número de bloque de revelación, la bandera isRevealed se establece en true y el secreto revelado puede ser utilizado para un procesamiento posterior.

Es importante adaptar estas medidas a los requisitos específicos de cada caso y considerar otros factores de seguridad relevantes.

También puedes ver este mismo artículo en Linkedin aqui.