Juan Fuente

jfuentet@gmail.com

Signature Replay

Signature Replay

La importancia de la seguridad en los smart contracts. Qué es la vulnerabilidad Signature replay y como solucionarla.

Vulnerabilidades_Smart_Contracts_Solidity_Signature_Replay_JuanFuente_Desarrollador_Smart_Contracts

Los ataques de Signature Replay (Reutilización de firmas) son una vulnerabilidad de seguridad en los contratos inteligentes que puede permitir a los actores maliciosos realizar transacciones no autorizadas. En el contexto de Solidity, un ataque de reutilización de firmas puede ocurrir cuando un atacante intercepta una transacción firmada y la reenvía en otra red donde la transacción no debería ser válida.

Por ejemplo, considera una transacción firmada que transfiere 1 Ether de la cuenta A a la cuenta B en la red principal de Ethereum. Si un atacante intercepta esta transacción y la reenvía en la red de prueba de Ethereum, la transacción aún será válida y el 1 Ether se transferirá de la cuenta A a la cuenta B en la red de prueba también. En ese caso no habría problema real, al ser solo en la red de pruebas.

Aquí hay un ejemplo de un contrato vulnerable a ataques de reutilización de firmas:

Vulnerabilidades_Smart_Contracts_Solidity_Ejemplo_Vulnerable_Signature_Replay

En este contrato, la función transfer requiere una firma del propietario para enviar la cantidad solicitada al destinatario. Sin embargo, el mensaje firmado en este código solo contiene el destinatario y la cantidad, por lo que no hay nada que se pueda usar para prevenir que la misma firma se use varias veces.

Para prevenir este tipo de ataque, es posible usar una técnica de prevención llamada «nonce». Un nonce es un número único que se crea para cada transacción. El uso de un nonce único para cada transacción asegura que cada transacción es distinta y no puede ser replicada. Aquí hay un ejemplo de cómo se puede implementar un nonce en un contrato:

Vulnerabilidades_Smart_Contracts_Solidity_Ejemplo_Seguro_SignatureReplay

En este contrato, la función transfer requiere un número de secuencia cada vez que se llama y este número único se usa en el mensaje firmado. De esta manera, cada firma solo permitirá una ejecución exitosa de transferencia, ya que el número cambiará y si se intenta una segunda vez el número será distinto, por lo que cualquier intento de reutilizarla revertirá con «Invalid nonce».

Además de usar un nonce, hay otras buenas prácticas para prevenir ataques de reutilización de firmas, como usar un ID de red diferente para cada red a la que se despliega, usar un esquema de firma específico de la cadena, como EIP-155 en Ethereum, que incluye el ID de la cadena en el mensaje firmado, y cifrar el mensaje firmado antes de enviarlo a través de la red.

En conclusión, los ataques de reutilización de firmas representan una amenaza de seguridad seria para los contratos inteligentes de Solidity, pero pueden prevenirse mediante la creación de firmas únicas que no den opción a la rehutilización.

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