Przez BlockSec

8 listopada 2022 r. wykryliśmy, że niektóre ataki skutecznie wyczerpały zasoby z pul zbudowanych na oficjalnym kontrakcie KashiPairMediumRiskV1 firmy Sushi (lub niektórych kontraktach, które się z niego rozwidlają). Po zbadaniu sprawy odkryliśmy, że przyczyną jest błąd logiczny, który powoduje błędne obliczenie cen tokenów.

Natychmiast skontaktowaliśmy się z zespołem ds. bezpieczeństwa Sushi, a oni potwierdzili nasze ustalenia. Dobrą rzeczą było to, że podejmowali działania w celu ochrony niektórych cennych, ale podatnych na ataki puli. Ponadto udostępnili również procedury rekompensaty tym, którzy stracili fundusze z powodu exploita. W związku z tym uważamy, że teraz można bezpiecznie ujawnić szczegóły dotyczące podatności i ataków. W tym raporcie chcielibyśmy przedstawić szczegółową analizę.

Analiza podatności

Po przeanalizowaniu kodu źródłowego kontraktu KashiPairMediumRiskV1 doszliśmy do wniosku, że błąd ten leży w funkcji pożyczania, która używa przestarzałego exchangeRate do weryfikacji pożyczonego udziału w modyfikatorze rozpuszczalnika. Dokładniej rzecz biorąc, weryfikacja zostanie przeprowadzona na podstawie bieżącej wartości exchangeRate w funkcji _isSolvent.

Podczas gdy funkcja liquidate jest wywoływana na samym początku, funkcja updateExchangeRate jest wywoływana. W związku z tym weryfikacja i obliczenia zostaną wykonane na podstawie zaktualizowanej wartości.

Oczywiste jest, że błąd ten można wykorzystać do spowodowania (ogromnej) różnicy cen.

Analiza ataków

Zaobserwowaliśmy dwa ataki:

  1. https://etherscan.io/tx/0xcf8f242ea83100b6d43e659f7f53a698d304fc6ac2ca6fe79e3e07ee05fefe58: ofiara korzysta z kontraktu KashiPairMediumRiskV1, a strata wynosi około 9466 USDC.

  2. https://etherscan.io/tx/0x3d163bfbec5686d428a6d43e45e2626a220cc4fcfac7620c620b82c1f2537c78: ofiarą jest kontrakt strategiczny wykorzystujący CauldronMediumRiskV1 (fork KashiPairMediumRiskV1), a strata wynosi około 110 911 MIM.

Należy pamiętać, że pierwsza transakcja ataku została uruchomiona przez bota, który wyprzedza oryginalną transakcję ataku: https://etherscan.io/tx/0x7a845d8d2af7919f5b9e22dd5571305cb5347d17986a8402715c1463d515fc18, a oryginalny adres atakującego to 0xb7ea0f0f8c6df7a61bf024db21bbe85ac5688005.

Jako przykład weźmiemy pierwszą transakcję ataku, która składa się z następujących kroków:

  1. Pożyczenie błyskawicznej pożyczki w wysokości 40 900 BADGER i 121 904 USDC od Balancer.

  2. Wpłata 40 900 BADGER i 113 599 USDC na konto BentoBox.

  3. Wywołanie funkcji addCollateral w kmBADGER/USDC-LINK w celu zdeponowania 40 900 000 000 000 000 000 000 akcji BADGER.

  4. Wywołanie funkcji addAsset programu kmBADGER/USDC-LINK w celu zdeponowania 112 529 000 000 akcji USDC.

  5. Wywołanie funkcji pożyczki w celu pożyczenia 120 755 095 093 akcji USDC.

  6. Wywołanie funkcji UpdateExchangeRate.

  7. Wywołanie funkcji likwidującej w celu likwidacji samego siebie.

  8. Wypłać 40 899 BADGER i 123 006 USDC z BentoBox.

  9. Spłata pożyczki błyskawicznej i uzyskanie zysku w wysokości około 9466 USDC.

Należy pamiętać, że krok 6 nie jest konieczny, ponieważ funkcja pożyczenia wywoła funkcję UpdateExchangeRate.

Kluczowe kroki są następujące:Łatwo zauważyć, że wartość parametru exchangeRate używana w funkcji pożyczkowej różni się od wartości używanej w funkcji likwidacyjnej:

  • W funkcji pożyczania: 250 997 938 545 109 237 740 214 705 193

  • W funkcji likwidacyjnej: 328 266 883 541 864 569 505 752 156 794

Wpływ

Istnieją dziesiątki pul (zarówno na Ethereum, jak i BSC), których może dotyczyć ten błąd. Tymczasową metodą złagodzenia tego problemu jest zmniejszenie lub wyeliminowanie odchylenia poprzez okazjonalne (lub okresowe) wywoływanie funkcji UpdateExchangeRate. Tę metodę przyjęto już w wielu dotkniętych tym problemem projektach, a odpowiadające im transakcje można zaobserwować w praktyce.