Prin BlockSec
Pe 8 noiembrie 2022, am detectat că unele atacuri au drenat cu succes activele din pool-uri care sunt construite pe baza contractului oficial KashiPairMediumRiskV1 al Sushi (sau a unor contracte care decurg din acesta). După investigație, am constatat că cauza principală se datorează unei erori logice care provoacă calcularea greșită a prețurilor token-ului.
Am contactat imediat echipa de securitate a lui Sushi și ne-au confirmat constatările. Partea bună era că aceștia luau măsuri pentru a proteja unele bazine valoroase, dar vulnerabile, împotriva atacurilor. În plus, au oferit și proceduri de compensare a celor care au pierdut fonduri din exploatare. Ca atare, acum credem că este sigur să dezvăluim detalii despre vulnerabilitate și atacuri. În acest raport, dorim să oferim o analiză detaliată.
Analiza Vulnerabilității
După ce am analizat codul sursă al contractului KashiPairMediumRiskV1, concluzionăm că această eroare se află în funcția de împrumut, care folosește exchangeRate învechit pentru a verifica cota împrumutată în modificatorul solventului. Mai exact, verificarea va fi efectuată pe baza valorii actuale a exchangeRate din funcția _isSolvent .


În timpul funcția lichidare, funcția updateExchangeRate este invocată chiar de la început. Prin urmare, verificarea și calculul vor fi efectuate pe baza valorii actualizate.

Evident, acest bug ar putea fi exploatat pentru a duce la o diferență (uriașă) de preț.
Analiza atacurilor
Am observat două atacuri:
https://etherscan.io/tx/0xcf8f242ea83100b6d43e659f7f53a698d304fc6ac2ca6fe79e3e07ee05fefe58: victima folosește contractul KashiPairMediumRiskV1, iar pierderea este de aproximativ 9,46 USD.
https://etherscan.io/tx/0x3d163bfbec5686d428a6d43e45e2626a220cc4fcfac7620c620b82c1f2537c78: victima este un contract de strategie folosește CauldronMediumRiskV1 și TheMekRiskV1 (TheV1) este în jur de pierderi 110.911 MIM.
Rețineți că, prima tranzacție de atac a fost lansată de un bot care conduce tranzacția de atac inițială: https://etherscan.io/tx/0x7a845d8d2af7919f5b9e22dd5571305cb5347d17986a8402715c1463d515d515 thefc1 adresa originală a atacatorului este 0xb7ea0f0f8c6df7a61bf024db21bbe85ac5688005.
Aici luăm prima tranzacție de atac ca exemplu, care constă din următorii pași:
Împrumutarea unui împrumut rapid de 40.900 BADGER și 121.904 USDC de la Balancer.
Depunând 40.900 BADGER și 113.599 USDC în BentoBox.
Invocarea funcției addCollateral a kmBADGER/USDC-LINK pentru a depune 40.900.000.000.000.000.000.000 de acțiuni ale BADGER.
Invocarea funcției addAsset a kmBADGER/USDC-LINK pentru a depune 112.529.000.000 de acțiuni ale USDC.
Invocarea funcției de împrumut pentru a împrumuta 120.755.095.093 de acțiuni ale USDC.
Invocarea funcției UpdateExchangeRate .
Invocarea funcției lichidare pentru a se lichida.
Retrageți 40.899 BADGER și 123.006 USDC din BentoBox.
Rambursarea împrumutului flash și obținerea unui profit de aproximativ 9466 USDC.
Rețineți că pasul 6 nu este necesar, deoarece funcția de împrumut va invoca funcția UpdateExchangeRate .
Pașii cheie sunt următorii:
Nu este greu de înțeles că valoarea exchangeRate utilizată în funcția de împrumut se abate de la valoarea utilizată în funcția lichidare:
În funcția de împrumut: 250.997.938.545.109.237.740.214.705.193
În funcția lichidare: 328.266.883.541.864.569.505.752.156.794
Impactul
Există zeci de pool-uri (atât pe Ethereum, cât și pe BSC) care ar putea fi afectate de această eroare. O metodă temporară pentru a atenua această problemă este reducerea sau eliminarea abaterii prin invocarea funcției UpdateExchangeRate ocazional (sau periodic). Această metodă a fost deja adoptată de multe proiecte afectate și tranzacțiile corespunzătoare pot fi observate în sălbăticie.
