Rudy Godoy, Quinpu.com
Presentado por Rudy Godoy
Cada año muere más gente asesinada por cerdos que por tiburones, lo que demuestra cuan buenos somos evaluando el riesgo.
Si crees que la tecnología puede resolver los problemas de seguridad, entonces no entiendes los problemas y tampoco la tecnología.
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);
}
Hello, first of all i'm not the owner of that contract. I was able to make myself the owner of that contract because its uninitialized. These multi_sig wallets deployed using Parity were using the library located at "0x863df6bfa4469f3ead0be8f9f2aae51c91a907b4" address. I made myself the owner of "0x863df6bfa4469f3ead0be8f9f2aae51c91a907b4" contract and killed it and now when i query the dependent contracts "isowner(<any_addr>)" they all return TRUE because the delegate call made to a died contract. I believe some one might exploit.
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/