Ataques de reenvío en contratos inteligentes

Un ataque de reenvío es un tipo de exploit en el que un atacante puede enviar una transacción a un contrato inteligente y luego «reenviar» esa transacción a otro contrato sin la autorización del usuario original. Esto puede llevar a la pérdida de fondos para el usuario original, ya que el atacante puede enviar la transacción a un contrato que no es legítimo o que no tiene el comportamiento deseado por el usuario.

Un ejemplo de código de un contrato vulnerable a un ataque de reenvío podría ser el siguiente:

pragma solidity ^0.6.0;

contract Attacker {
function execute(address _to) public {
_to.call(bytes4(keccak256(«execute()»)));
}
}

contract Victim {
function execute() public {
// Realiza alguna acción que no es deseada por el usuario original
}
}

En este caso, el contrato «Attacker» tiene una función «execute» que simplemente llama a la función «execute» del contrato especificado en el parámetro _to. Si un usuario envía una transacción al contrato «Victim» con la intención de realizar alguna acción legítima, pero el atacante reenvía esa transacción al contrato «Attacker» en su lugar, el atacante podría utilizar la función «execute» para realizar una acción no deseada por el usuario original.

Para protegerse de este tipo de ataque, es importante asegurarse de que los contratos no permiten el reenvío de transacciones a otros contratos sin la autorización del usuario original. Esto se puede hacer mediante el uso de la directiva «payable» en las funciones de los contratos, lo que impide que se llamen a ellas de manera indirecta. También es importante utilizar contratos «Proxy» seguros, que controlan qué transacciones se pueden enviar a otros contratos y evitan los reenvíos no autorizados.

Un contrato Proxy es un contrato que actúa como intermediario entre un contrato principal y el usuario que desea interactuar con él. El contrato Proxy se encarga de recibir las transacciones del usuario y de enviarlas al contrato principal de manera segura.

Un contrato Proxy seguro está diseñado para proteger al usuario de posibles exploits o ataques. Por ejemplo, podría evitar que un usuario envíe transacciones a contratos malintencionados o que no tienen el comportamiento deseado por el usuario.

Un ejemplo de código de un contrato Proxy seguro podría ser el siguiente:

 

pragma solidity ^0.6.0;

contract SafeProxy {
address public target;

constructor(address _target) public {
target = _target;
}

function execute(bytes calldata _data) public {
// Verifica que la transacción solo se envía al contrato especificado en el campo «target»
require(msg.sender == target, «Unauthorized»);
(bool success, bytes memory returnData) = target.call(_data);
require(success, «Execution failed»);
}
}

En este caso, el contrato «SafeProxy» tiene una dirección pública «target» que especifica el contrato al que se deben enviar las transacciones. La función «execute» del contrato «SafeProxy» verifica que la transacción solo se envía al contrato especificado en el campo «target» y luego llama a la función del contrato especificada en los datos _data. De esta manera, el contrato «SafeProxy» actúa como un intermediario seguro entre el usuario y el contrato principal, evitando reenvíos no autorizados a contratos malintencionados.

Existen varios ejemplos de ataques de reenvío que han ocurrido en la historia de la cadena de bloques de Ethereum. Algunos de los más conocidos son:

  • Ataque de reenvío de Parity Wallet: En 2017, un atacante explotó una vulnerabilidad en el contrato de Parity Wallet, un monedero de Ethereum, para reenviar transacciones a contratos malintencionados. Como resultado, el atacante fue capaz de robar más de $30 millones en criptomonedas.
  • Ataque de reenvío de dApp Bancor: En 2018, un atacante explotó una vulnerabilidad en el contrato de Bancor, una aplicación descentralizada (dApp) de intercambio de criptomonedas, para reenviar transacciones a un contrato malintencionado. Como resultado, el atacante fue capaz de robar más de $23 millones en criptomonedas.
  • Ataque de reenvío de dApp SpankChain: En 2018, un atacante explotó una vulnerabilidad en el contrato de SpankChain, una dApp de pagos basada en Ethereum, para reenviar transacciones a un contrato malintencionado. Como resultado, el atacante fue capaz de robar más de $38,000 en criptomonedas.

Estos son solo algunos ejemplos de los muchos ataques de reenvío que han ocurrido en la historia de Ethereum. Demuestran la importancia de diseñar contratos inteligentes de manera segura y de utilizar medidas de seguridad adicionales, como contratos Proxy seguros, para proteger a los usuarios de posibles exploits.

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.