Od BlockSec

8. listopadu 2022 jsme zjistili, že některé útoky úspěšně vyčerpaly prostředky z fondů, které jsou postaveny na oficiální smlouvě KashiPairMediumRiskV1 společnosti Sushi (nebo na některých smlouvách, které se z ní vyplňují). Po prošetření jsme zjistili, že hlavní příčinou je logická chyba, která způsobuje chybný výpočet cen tokenů.

Okamžitě jsme kontaktovali Sushiho bezpečnostní tým a ten potvrdil naše zjištění. Dobrá věc byla, že podnikali kroky k ochraně některých cenných, ale zranitelných bazénů před útokem. Kromě toho také poskytli postupy pro odškodnění těch, kteří přišli o finanční prostředky z exploitu. Proto nyní věříme, že je bezpečné zveřejnit podrobnosti o zranitelnosti a útocích. V této zprávě bychom rádi poskytli podrobnou analýzu.

Analýza zranitelnosti

Po analýze zdrojového kódu smlouvy KashiPairMediumRiskV1 jsme dospěli k závěru, že tato chyba spočívá ve funkci vypůjčení, která používá zastaralý směnný kurz k ověření vypůjčené akcie v modifikátoru solventu. Konkrétně bude ověření provedeno na základě aktuální hodnoty exchangeRate ve funkci _isSolvent .

Ve funkci likvidace je funkce updateExchangeRate vyvolána hned na začátku. Proto bude ověření a výpočet proveden na základě aktualizované hodnoty.

Je zřejmé, že tato chyba by mohla být zneužita k (obrovskému) rozdílu v ceně.

Analýza útoku

Zaznamenali jsme dva útoky:

  1. https://etherscan.io/tx/0xcf8f242ea83100b6d43e659f7f53a698d304fc6ac2ca6fe79e3e07ee05fefe58: oběť používá smlouvu KashiPairMediumRiskV1 a ztráta se pohybuje kolem 9 USDC.

  2. https://etherscan.io/tx/0x3d163bfbec5686d428a6d43e45e2626a220cc4fcfac7620c620b82c1f2537c78: Oběť je strategická smlouva využívá CauldronMediumRiskV1 (ztráta je kolem 1R1 vidlice Kashi IM.

Všimněte si, že první útočná transakce byla spuštěna robotem, který spouští původní útočnou transakci: https://etherscan.io/tx/0x7a845d8d2af7919f5b9e22dd5571305cb5347d17986a8402715c1463d8xf, adresa originálu 015fc 7a61bf024db21bbe85ac5688005.

Zde si jako příklad vezmeme první útočnou transakci, která se skládá z následujících kroků:

  1. Půjčení bleskové půjčky ve výši 40 900 BADGER a 121 904 USDC od společnosti Balancer.

  2. Vložení 40 900 BADGER a 113 599 USDC na BentoBox.

  3. Vyvolání funkce addCollateral kmBADGER/USDC-LINK k uložení 40 900 000 000 000 000 000 000 akcií BADGER.

  4. Vyvolání funkce addAsset kmBADGER/USDC-LINK k uložení 112 529 000 000 akcií USDC.

  5. Vyvolání funkce půjčit si za účelem vypůjčení 120 755 095 093 akcií USDC.

  6. Vyvolání funkce UpdateExchangeRate .

  7. Vyvolání funkce likvidace k likvidaci sebe sama.

  8. Vyberte 40 899 BADGER a 123 006 USDC z BentoBoxu.

  9. Splacení flashloan a získání zisku cca 9466 USDC.

Upozorňujeme, že krok 6 není nutný, protože funkce vypůjčit si vyvolá funkci UpdateExchangeRate .

Klíčové kroky jsou následující:Není těžké zjistit, že hodnota směnného kurzu použitá ve funkci půjčit se liší od hodnoty použité ve funkci likvidace:

  • Ve funkci půjčit: 250 997 938 545 109 237 740 214 705 193

  • Ve funkci likvidace: 328,266,883,541,864,569,505,752,156,794

Dopad

Existují desítky fondů (na Ethereu i BSC), které by mohly být touto chybou ovlivněny. Dočasným způsobem, jak tento problém zmírnit, je snížit nebo odstranit odchylku občasným (nebo periodickým) vyvoláním funkce UpdateExchangeRate. Tuto metodu již přijalo mnoho dotčených projektů a odpovídající transakce lze pozorovat ve volné přírodě.