Identificación del usuario: problema con tx.origin

Clase 3 de 15Curso de Introducción a Seguridad de Smart Contracts

Resumen

Ya viste algunas buenas prácticas al desarrollar contratos inteligentes. Ahora, es frecuente la necesidad de validar los permisos del usuario y para esto se utiliza la dirección de la billetera que emitió la transacción. Hay que tener algunas precauciones al realizar esta identificación.

Cómo realizar la identificación del usuario en smart contracts

Solidity permite la captura de la dirección del contrato que hizo la transacción y posteriormente se utiliza este dato para identificar al usuario.

Utilizamos msg.sender para obtener el dato, pero el lenguaje también cuenta con la variable global tx.origin que dependiendo la circunstancia devuelve la misma información.

  • msg.sender = Emisor del mensaje
  • tx.origin = Origen de la transacción

A simple vista, pueden parecer exactamente iguales ambas variables, ya que a la hora de hacer una transferencia de cuenta a cuenta van a devolver el mismo valor. ¿Pero qué pasa si quién realiza la transacción es otro contrato inteligente? Aquí es donde los valores de msg.sender y tx.origin van a diferir.

Esta vulnerabilidad de seguridad puede explotarse realizando transacciones al contrato, desde otro contrato. Al cambiar el valor de tx.origin, el atacante puede acceder a partes de la lógica del contrato que no le corresponde.

Diff sender and origin.jpg

En conclusión, se debe tener precaución cuando se utiliza tx.origin para identificar y validar al usuario que emite la transacción. En su lugar, es mejor usar msg.sender.


Contribución creada por Kevin Fiorentino (Platzi Contributor) con aportes de Mauro Legorburu y Adolfo Sebastián Jara Gavilanes.