Rudy Godoy, Quinpu.com
Presentado por Rudy Godoy
17 de junio 2016. Incidente más importante en Ethereum.
Aprovecha vulnerabilidad de llamada recursiva. Utiliza
funcionalidad de votación propia de la DAO para forzar
creación de DAOs hijos
(splitDAO()
)
que, además, obtengan beneficios y fondos del padre y que
repitan el proceso.
Resultado: Bifurcación de block chain: ETC y ETH.
19 de julio 2017. Código auditado por la Fundación Ethereum.
initWallet()
. Identifica
programas en la red que lo usan.
initWallet()
para hacerse de la propiedad del programa/contratofunction initWallet (address[] _owners, uint _required, uint _daylimit) {
initMultiOwned(_owners, _required);
initDayLimit(_daylimit);
}
Fondos robados: 150,000 ETH, cerca de USD 30MM. Recuperado buena parte usando mismo ataque.
function() payable {
// just being sent some cash?
if (msg.value > 0)
Deposit(msg.sender, msg.value);
else if (msg.data.length > 0)
_walletLibrary.delegatecall(msg.data);
}
7 de noviembre 2017. Código de biblioteca Parity convertido a billetera de firmas múltiples.
initWallet()
para hacerse de
la propiedad de bibliotecaselfdestruct()
para destruirlafunction initWallet(address[] _owners, uint _required, uint _daylimit) only_uninitialized {
initDaylimit(_daylimit);
initMultiowned(_owners, _required);
}
Resultado: Cerca a 513 mil ETH inamovibles en billeteras dependientes de biblioteca (Ejm. Polkadot).
31 de marzo 2017.
Invocación de llamada bajo nivel con un arreglo de bytes como parámetro no intepreta correctamente de acuerdo a definición del ABI, solo lo añade al resto de la cadena.
Informe del problema: https://github.com/ConsenSys/Tokens/pull/45 Todavía no resuelto.
data
en tx para enviar
llamadas codificadas en hexadecimal a método vulnerable.
Web: https://github.com/Arachnid/uscc/blob/master/submissions-2017/martinswende/
Biblioteca de contratos reutilizables y seguros en Solidity.
npm install zeppelin-solidity
,
yarn add zeppelin-solidity
o
git submodule add
https://github.com/OpenZeppelin/zeppelin-solidity
Web: openzeppelin.org
Contratos base o plantillas y ejemplos de implementación con conjunto de pruebas automatizadas
crowdsale
: Crodwsale (ICO)lifecycle
: Destrutible, Pausableownership
: CanReclaim, Claimable, Contactable,
DelayedClaimable, Ownablepayment
: PullPaymenttoken
: Basic, Burnable, Mintable, Pausable, Standard,
Timelock, Vestingpragma solidity ^0.4.11;
import 'zeppelin-solidity/contracts/token/ERC20Basic.sol';
import 'zeppelin-solidity/contracts/math/SafeMath.sol';
contract WhitelistToken is ERC20Basic {
using SafeMath for uint256;
mapping(address => uint256) balances;
mapping(address => bool) whitelist;
pragma solidity ^0.4.13;
import 'zeppelin-solidity/contracts/token/BurnableToken.sol';
contract LimToken is BurnableToken {
function LimToken(address initialAccount, uint initialBalance) {
balances[initialAccount] = initialBalance;
totalSupply = initialBalance;
}
import 'zeppelin-solidity/contracts/crowdsale/CappedCrowdsale.sol';
contract LimaICO is CappedCrowdsale {
function LimaICO ( uint256 _startTime, uint256 _endTime, uint256 _rate, address _wallet, uint256 _cap )
Crowdsale(_startTime, _endTime, _rate, _wallet)
CappedCrowdsale(_cap) { }
}
Documentación: http://zeppelin-solidity.readthedocs.io/en/latest/