Page 28

Esta función anónima (sin nombre) es lo que se llama la función Fallback, que se ejecuta cuando se llama al contrato con una función que no reconoce o sin ningún dato (campo data vacío). Si la transacción que ejecuta el contrato tiene vinculados Ethers, los deposita. Sin embargo, si no se envían Ethers sino que se llama a alguna función, lo delega, como en la función constructora, a la librería wallet… Y aquí se encuentra el problema: _walletLibrary.delegatecall(msg.data);

Esta línea hace pública cualquier función de la librería, incluida la initWallet, haciendo posible que un atacante se haga propietario del wallet y sus fondos. Para entender mejor el problema, vamos a desplegar nuestros contratos y realizar el hackeo por nosotros mismos siguiendo la estrategia expuesta. Código vulnerable de ejemplo – WalletLibrary: pragma solidity ^0.4.19; contract WalletLibrary { address owner; function initWallet(address _owner) public { owner = _owner; } }

Código vulnerable de ejemplo – Wallet: pragma solidity ^0.4.19; contract Wallet { address public owner; address public walletLibrary; function Wallet(address _owner, address _walletLibrary) public { walletLibrary = _walletLibrary; bytes4 sig = bytes4(keccak256(“initWallet(address)”)); assembly { mstore(0x0, sig) mstore(0x4, _owner) delegatecall(sub(gas, 10000), _walletLibrary, 0x0, add(0x4,32), 0x0, 0x0) pop } } function () public payable { walletLibrary.delegatecall(msg.data); } }

Para probarlo, podéis utilizar Remix (https://remix.ethereum.org) y Metamask en la testnet de Ropsten, por ejemplo. Podéis solicitar Ether gratis en el faucet de Metamask: https://faucet.metamask.io.

28

Agorachain#2  
Agorachain#2  

En esta edición más cuidada a todos los niveles, hemos optado por escoger un diseño que enlazara el primer número, cuya repercusión nos ha s...

Advertisement