Front Running
La importancia de la seguridad en los smart contracts. Qué es la vulnerabilidad Deneal of service (DOS) y como solucionarla
El front running es un problema en las blockchains públicas donde un actor malicioso puede observar una transacción pendiente y enviar una transacción similar antes de que la transacción original se ejecute. Esto puede resultar en que el actor malicioso tome ventaja de la transacción, como comprar tokens a un precio más bajo o vender tokens a un precio más alto. Este tipo de ataque es particularmente prevalente en aplicaciones de finanzas descentralizadas (DeFi) donde hay grandes sumas de dinero en juego.
El front running puede ocurrir de varias maneras. Un método común es a través del uso de bots que monitorean el mempool, que es una lista de transacciones no confirmadas que esperan ser añadidas a la blockchain. Cuando un bot detecta una transacción que cree que resultará en un intercambio rentable, intentará ejecutar una transacción similar con una tarifa de gas más alta para asegurarse de que se confirme primero.
Es decir, si por ejemplo un UsuarioA quiere comprar 10 ETH de un intercambio descentralizado, envía una transacción al Exchange con una tarifa de gas de 10 Gwei. Poco después, el UsuarioB ve la transacción del UsuarioA en el mempool y decide comprar 10 ETH también. Sin embargo, el UsuarioB establece una tarifa de gas más alta de 20 Gwei, y esto le da ventaja a la hora de que su transacción se ejecute antes que la del UsuarioA.
Si la transacción del UsuarioB se procesa antes que la de UsuarioA, podrá comprar los 10 ETH a un precio más bajo que UsaurioA. Esto se debe a que la pool del Exchange actualiza su precio en función de la última transacción. Si la transacción del UsuarioA se procesa primero, el precio subirá, y el UsuarioB terminará pagando más por la misma cantidad de ETH. Esto es una vulnerabilidad de front running.
Existen varias estrategias para prevenir el front running en Solidity:
– Commit-Reveal Scheme: Este esquema divide la 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.
– Uso de msg.sender en la función hash: Al incluir msg.sender en la función hash, el atacante puede conocer el secreto necesario para realizar la transacción, pero no puede usarlo porque su dirección es diferente.
– Listas de acceso permitidas: Si se conocen todas las direcciones que necesitarán acceder a una función, se puede usar un modificador para permitir solo a esas direcciones.
Argumentos de tiempo de espera y precio mínimo: En el caso de Uniswap, se introdujeron argumentos de amountOutMin (precio mínimo de salida) y deadline (momento máximo en el tiempo) en los métodos de intercambio para minimizar el problema del frontrunning. Si hay transacciones de front running o condiciones de carrera que causen que la cantidad de salida de tokens sea menor que amountOutMin, la transacción se revierte y no se transfieren tokens. Además, si la transacción se incluye en un bloque después del bloque de tiempo de espera especificado, también se revierte la transacción.
Aquí hay un ejemplo de cómo se podría implementar un esquema de commit-reveal en Solidity:
En este contrato, los usuarios pueden hacer un «commit» enviando ether y un valor hash. Luego, pueden revelar el valor original para recuperar el ether. Si otro usuario intenta revelar el mismo valor antes de que el original lo haga, no podrá recuperar el ether porque el contrato ha sido eliminado del mapeo de commitments (compromisos).
Ejemplo ejecución con deadline:
En este contrato, el tiempo límite se establece con la función setExecutionTime y luego se puede verificar con la función checkDeadline. La función performAction comprueba que la «deadline» ya ha pasado, ya que el block.timestamp (momento actual) es mayor o igual.
En resumen, el front running es una vulnerabilidad importante en los contratos inteligentes que puede permitir a los atacantes manipular los fondos y datos almacenados en un contrato. Al comprender cómo funciona y tomar las medidas adecuadas para protegerse contra ella, es posible minimizar los riesgos y garantizar la seguridad de los contratos inteligentes.
También puedes ver este mismo artículo en Linkedin aqui
Pingback: Sandwich Attacck – Juan Fuente Desarrollador