Problema con tx.origin

3/15
Recursos

Aportes 3

Preguntas 0

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Esto, m谩s que un problema, es una precauci贸n que debemos tener por una vulnerabilidad que tiene que ver con el 鈥渙rigen 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 鈥渢x.origin鈥 puede dar un valor distinto al 鈥渕sg.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 鈥渃ae 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 鈥渙rigen de la transacci贸n鈥 y el 鈥渆nv铆o del mensaje鈥. El 鈥渆nv铆o del mensaje鈥 va a indicar que la direcci贸n es la del contrato intermediario, pero el 鈥渙rigen de la transacci贸n鈥 sigue siendo la cuenta original.

Por lo tanto, si el chequeo del permiso lo hacemos contra 鈥渢x.origin鈥 lo que vamos a tener es la cuenta del usuario, y por ende, nos va a dar la 鈥渟ensaci贸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 鈥渢x.origin鈥 para el chequeo de permisos y de roles puede ser un problema.

Diferencias
tx.origin = el origen del mensaje
msg.sender = emisor del mensaje