Vulnerabilidad encontrada en el contrato inteligente `vaults.sx` (ataque EOS SX Vault)

Nuestro análisis del ataque al EOS SX Vault en Mayo 2021.

Estamos investigando un ataque a la bóveda. La mayoría de EOS y USDT en la bóveda han sido robados.❗️SX ataque a la bóvedaNO DEPOSITAR en bóvedaActualizaremos EOSX para evitar que las personas depositen más lo antes posible.Le proporcionaremos un análisis completo tan pronto como completamos nuestra investigación.
EOS Nation ofrece una recompensa de 100.000 USDT al hacker de sombrero blanco que identificó el ataque de reentrada en el contrato inteligente flash.sx.La recompensa se transferirá a la cuenta de su elección una vez que los 1'180,142.5653 el EOS y el 461,796.8968 USDT se devuelvan a la cuenta flash.sx.
https://www.bloks.io/account/potghpfcmocs
# Solo un ejemplopotghpfcmocs → vaults.sx 2 USDTvaults.sx → flash.sx 2 USDTtoken.sx issue 20 SXUSDT a vaults.sxvaults.sx → potghpfcmocs 20 SXUSDT
// deposit - handle issuance (ex: EOS => SXEOS)if ( deposit_itr != _vault.end() ) {
potghpfcmocs → vaults.sx 10 SXUSDT
require_recipient( from );require_recipient( to );
// withdraw - handle retire (ex: SXEOS => EOS)} else if ( supply_itr != _vault_by_supply.end() ) {
const extended_asset out = calculate_retire( id, quantity );​extended_asset sx::vaults::calculate_retire( const symbol_code id, const asset payment )...const int64_t S0 = vault.deposit.quantity.amount;const int64_t R0 = vault.supply.quantity.amount;const int64_t p  = (uint128_t(payment.amount) * S0) / R0;return { p, vault.deposit.get_extended_symbol() };
// update internal deposit & supply_vault_by_supply.modify( supply_itr, get_self(), [&]( auto& row ) {row.deposit -= out;row.supply.quantity -= quantity;row.last_updated = current_time_point();
transfer( account, get_self(), out, get_self().to_string() );// send underlying assets to sendertransfer( get_self(), from, out, get_self().to_string() );
flash.sx - borrow 0.0001flash.sx → potghpfcmocs 0.0001 USDTpotghpfcmocs → flash.sx 0.0002 USDTvaults.sx - update id: USDT
// get balance from accountconst asset balance = eosio::token::get_balance( contract, account, sym.code() );...// update balance_vault.modify( vault, get_self(), [&]( auto& row ) {row.deposit.quantity = balance + staked;row.staked.quantity = staked;row.last_updated = current_time_point();});
const int64_t S0 = vault.deposit.quantity.amount;const int64_t R0 = vault.supply.quantity.amount;const int64_t p  = (uint128_t(payment.amount) * S0) / R0;
// Just an examplepotghpfcmocs → vaults.sx 10 SXUSDTvaults.sx → potghpfcmocs 2 USDT
// Just an exampletoken.sx - retire quantity: 10 SXUSDTvaults.sx → potghpfcmocs 1 USDTtoken.sx - retire quantity: 10 SXUSDT
Los productores de bloques llegaron a un consenso para defender la intención del código.Aproximadamente 1.2M EOS y 462,000 USDT fueron robados en un exploit de ataque de reentrada en el contrato inteligente de préstamo flash.sx que comenzó el 14 de mayo a las 11:28 UTC.Los contratos inteligentes de vaults.sx y flash.sx eran de código abierto, MSIGed y pasaron las auditorías de seguridad, sin embargo, no se identificó el exploit de reentrada.Todos los fondos están seguros bajo el control de eosio.prods y serán devueltos a los depositantes.

--

--

EOS Block Producer candidate in the heart of the Americas. We stand for liberty and equality. Mainnet BP: costaricaeos · https://t.me/eoscr

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
EOS Costa Rica

EOS Block Producer candidate in the heart of the Americas. We stand for liberty and equality. Mainnet BP: costaricaeos · https://t.me/eoscr