Esto, más que un problema, es una precaución que debemos tener por una vulnerabilidad que tiene que ver con el “origen de una transacción”. Para esto, vamos a remarcar una de las variables que están disponibles en Solidity, relacionada con la transacción: tx.origin, la cual nos informa sobre el origen de una posible transacción.
- tx.origin = origen de la transacción
- msg.sender = emisor del mensaje
A siemple vista pueden parecer exactamente iguales, porque a la hora de hacer una transferencia de cuenta a cuenta van a devolver el mismo valor, pero qué pasa si, tenemos un usuario que es dueño de un contrato (a través de una cuenta, claramente) y le establece permisos de acceso, cuestión de que solamente esa cuenta pueda acceder al contrato; esta validación de permisos, si se hace con “tx.origin” puede dar un valor distinto al “msg.sender” si la llamada se hace a través de un contrato.
Por ejemplo, en vez de llamar a un contrato que está protegido desde una cuenta, imaginemos el camino en que el dueño del contrato, interactúa con un contrato intermediario, es decir, así como tenemos los problemas de phishing en la red de internet donde un usuario “cae en una trampa”, en este caso, nosotros sin saberlo podemos interactuar o realizar una transacción con un contrato que tiene código malicioso, y este contrato puede realizar una llamada al contrato que está protegido, entonces qué pasa… a la hora de realizar esta segunda transacción, cuando reciba la transacción el contrato protegido, va a recibir valores distintos para el “origen de la transacción” y el “envío del mensaje”. El “envío del mensaje” va a indicar que la dirección es la del contrato intermediario, pero el “origen de la transacción” sigue siendo la cuenta original.
Por lo tanto, si el chequeo del permiso lo hacemos contra “tx.origin” lo que vamos a tener es la cuenta del usuario, y por ende, nos va a dar la “sensación” de que está accediendo el usuario, y que tiene permisos para hacerlo, cuando en realidad quien está accediendo es un contrato intermediario.
En definitiva, el uso de “tx.origin” para el chequeo de permisos y de roles puede ser un problema.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?