13. marta ātrā aizdevuma uzbrukums pret Euler Finance radīja vairāk nekā 195 miljonu ASV dolāru zaudējumus. Tas izraisīja infekcijas izplatīšanos, izmantojot vairākus decentralizētās finanšu (DeFi) protokolus, un vismaz 11 protokoli, izņemot Euler, cieta zaudējumus uzbrukuma dēļ.
Nākamo 23 dienu laikā un par lielu atvieglojumu daudziem Euler lietotājiem uzbrucējs atdeva visus izmantotos līdzekļus.
Taču, lai gan kriptogrāfijas kopiena var svinēt līdzekļu atgriešanos, paliek jautājums, vai līdzīgi uzbrukumi nākotnē var radīt milzīgus zaudējumus.
Var būt noderīga analīze par to, kā notika uzbrukums un vai izstrādātāji un lietotāji var kaut ko darīt, lai palīdzētu novērst šāda veida uzbrukumus nākotnē.
Par laimi, Euler izstrādātāju dokumenti skaidri izskaidro, kā darbojas protokols, un pati blokķēde ir saglabājusi pilnīgu uzbrukuma ierakstu.
Kā darbojas Euler Finance
Saskaņā ar protokola oficiālajiem dokumentiem Euler ir aizdevuma platforma, kas ir līdzīga Compound vai Aave. Lietotāji var noguldīt kriptovalūtu un ļaut protokolam to aizdot citiem, vai arī viņi var izmantot depozītu kā nodrošinājumu, lai aizņemtos kriptovalūtu.
Lietotāja nodrošinājuma vērtībai vienmēr ir jābūt lielākai par to, ko viņš aizņemas. Pieņemsim, ka lietotāja nodrošinājums ir zemāks par noteiktu nodrošinājuma vērtības attiecību pret parāda vērtību. Tādā gadījumā platforma ļaus viņiem tikt "likvidētiem", kas nozīmē, ka viņu nodrošinājums tiks pārdots, lai atmaksātu parādus. Precīza lietotājam nepieciešamā nodrošinājuma summa ir atkarīga no noguldītā aktīva un aizņemtā aktīva.
eTokens ir aktīvi, savukārt dTokens ir parādi
Ikreiz, kad lietotāji iemaksā Euler, viņi saņem eTokenus, kas apzīmē noguldītās monētas. Piemēram, ja lietotājs iemaksā 1000 USD monētu (USDC), viņš apmaiņā saņems tādu pašu eUSDC summu.
Tā kā, noguldījumam gūstot procentus, tās kļūst vērtīgākas nekā pamatā esošās monētas, eTokeniem vērtības ziņā nav 1:1 atbilstības bāzes aktīvam.
Euler arī ļauj lietotājiem iegūt sviras efektu, veidojot eTokenus. Bet, ja viņi to izdarīs, protokols viņiem nosūtīs parāda žetonus (dTokens), lai līdzsvarotu izveidotos aktīvus.
Piemēram, dokumentos teikts, ka, ja lietotājs nogulda 1000 USDC, viņš var iemaksāt 5000 eUSDC. Tomēr, ja viņi to izdarīs, protokols viņiem nosūtīs arī 5000 parāda marķiera ar nosaukumu “dUSDC”.
dToken pārsūtīšanas funkcija ir rakstīta savādāk nekā standarta ERC-20 marķieris. Ja jums pieder parāda marķieris, jūs to nevarat nodot citai personai, taču ikviens, ja vēlas, var atņemt no jums dToken.
Saskaņā ar Euler dokumentiem lietotājs var iegūt tikai tik daudz eTokenu, cik viņš būtu varējis, noguldot un aizņemoties atkal un atkal, kā teikts: “Funkcija Mint atdarina to, kas notiktu, ja lietotājs noguldītu USD 1000 USDC, pēc tam aizņemtos USD 900 USDC, pēc tam atkārtoti noguldītu šos USD 900 USDC un vēl aizņemtos USD8 USDC.
Lietotāji tiek likvidēti, ja veselības rādītāji samazinās līdz 1 vai zemāk
Saskaņā ar Euler emuāra ierakstu katram lietotājam ir “veselības rādītājs”, kura pamatā ir viņa makos esošo eTokenu vērtība salīdzinājumā ar turēto dTokenu vērtību. Lietotājam ir jābūt lielākai eTokenu dolāra vērtībai nekā dTokeniem, taču tas, cik daudz vairāk ir atkarīgs no konkrētajām monētām, kuras viņi aizņemas vai nogulda. Neatkarīgi no tā, lietotājam ar pietiekami daudz eTokenu veselības rādītājs būs lielāks par 1.
Ja lietotājs tikko nesasniedz nepieciešamo eTokenu skaitu, viņa veselības rādītājs būs precīzi 1. Tādējādi viņš tiks pakļauts “mīkstai likvidācijai”. Likvidatora robotprogrammatūra var izsaukt funkciju, lai pārsūtītu dažus lietotāja eTokenus un dTokenus sev, līdz aizņēmēja veselības rādītājs atgriežas pie 1,25. Tā kā lietotājam, kurš tikko ir mazāks par nodrošinājuma prasībām, joprojām būs vairāk nodrošinājuma nekā parāds, likvidatoram vajadzētu gūt labumu no šī darījuma.
Ja lietotāja veselības rādītājs nokrītas zem 1, tad likvidatoram tiek piešķirta pieaugoša atlaide atkarībā no tā, cik slikts ir veselības rādītājs. Jo sliktāks veselības rādītājs, jo lielāka atlaide likvidatoram. Tas ir paredzēts, lai pārliecinātos, ka kāds vienmēr likvidēs kontu, pirms tajā uzkrājas pārāk daudz sliktu parādu.
Eilera ieraksts apgalvo, ka citi protokoli piedāvā "fiksētu atlaidi" likvidācijai, un argumentē, kāpēc tā uzskata, ka mainīgās atlaides ir pārākas.
Kā notika Eilera uzbrukums
Blokķēdes dati atklāj, ka uzbrucējs ir iesaistījies virknē uzbrukumu, kas no protokola izņēma dažādus marķierus. Pirmā uzbrukuma rezultātā no Dai depozītu fonda tika iztērēti apmēram $ 8,9 miljoni Dai (DAI). Pēc tam to atkārtoja atkal un atkal citiem noguldījumu fondiem, līdz kopējā summa tika iztukšota.
Lai veiktu uzbrukumu, uzbrucējs izmantoja trīs dažādas Ethereum adreses. Pirmais bija viedais līgums, ko Etherscan ir apzīmējis ar nosaukumu “Euler Exploit Contract 1”, ko izmantoja, lai aizņemtos no Aave. Otrā adrese tika izmantota, lai noguldītu un aizņemtos no Euler, bet trešā tika izmantota, lai veiktu likvidāciju.
Lai izvairītos no nepieciešamības atkārtoti norādīt adreses, kuras Etherscan nav atzīmējis, otrais konts tiks saukts par “Aizņēmējs” un trešais konts “Likvidators”, kā parādīts tālāk.
Ethereum adreses, ko izmanto hakeris. Avots: Etherscan
Pirmais uzbrukums sastāvēja no 20 darījumiem tajā pašā blokā.
Pirmkārt, Euler Exploit Contract 1 aizņēmās 30 miljonus DAI no Aave kā ātro kredītu. Pēc tam tas nosūtīja šo aizdevumu uz aizņēmēja kontu.
Pēc 30 miljonu DAI saņemšanas aizņēmējs noguldīja 20 miljonus no tā Euler. Pēc tam Eilers atbildēja, izkaldinot aptuveni 19,6 miljonus eDAI un nosūtot to aizņēmējam.
Šīs eDAI monētas bija depozīta kvīts, tāpēc atbilstošs dDai daudzums šajā procesā netika izkalts. Un tā kā katru eDAI var izpirkt par nedaudz vairāk nekā vienu DAI, aizņēmējs saņēma tikai 19,6 miljonus visu 20 miljonu vietā.
Pēc šīs sākotnējās iemaksas veikšanas aizņēmējs nokala aptuveni 195,7 miljonus eDAI. Atbildot uz to, Eilers izkala 200 miljonus dDAI un nosūtīja to aizņēmējam.
Šajā brīdī aizņēmējs bija tuvu savam eDAI naudas kaltuves limitam, jo tagad viņš bija aizņēmies apmēram 10 reizes lielāku par DAI summu, ko bija noguldījis. Tāpēc viņu nākamais solis bija dzēst dažus parādus. Viņi noguldīja pārējos 10 miljonus DAI, ko viņi bija turējuši, faktiski atmaksājot 10 miljonus USD no aizdevuma. Atbildot uz to, Eilers no aizņēmēja maka izņēma 10 miljonus dDAI un to sadedzināja, samazinot aizņēmēja parādu par 10 miljoniem USD.
Pēc tam uzbrucējs varēja brīvi kalt vairāk eDAI. Aizņēmējs izkala vēl 195,7 miljonus eDAI, tādējādi viņu kopējais izkaltais eDAI apjoms ir aptuveni 391,4 miljoni. 19,6 miljonu eDAI noguldījumu kvītīs palielināja aizņēmēja eDAI kopējo summu līdz aptuveni 411 miljoniem.
Atbildot uz to, Eilers izkala vēl 200 miljonus dDai un nosūtīja to aizņēmējam, palielinot aizņēmēja kopējo parādu līdz 400 miljoniem USD.
Kad aizņēmējs bija maksimāli palielinājis savu eDAI kalšanas jaudu, viņi nosūtīja 100 miljonus eDai uz nulles adresi, to faktiski iznīcinot.
Tādējādi viņu veselības rādītājs ir krietni zem 1, jo tagad viņiem bija 400 miljonu ASV dolāru parāds, salīdzinot ar aptuveni 320 miljoniem ASV dolāru aktīviem.
Šeit tiek izmantots likvidatora konts. To sauc par likvidācijas funkciju, ievadot aizņēmēja adresi kā likvidējamo kontu.
Eilera uzbrukuma laikā emitēts likvidācijas notikums. Avots: Ethereum blokķēdes dati
Atbildot uz to, Eilers uzsāka likvidācijas procesu. Vispirms no aizņēmēja paņēma aptuveni 254 miljonus dDAI un to iznīcināja, pēc tam izkala 254 miljonus jaunu dDai un nodeva likvidatoram. Šie divi soļi no aizņēmēja likvidatoram pārcēla parādu 254 miljonu ASV dolāru vērtībā.
Pēc tam Eilers izkala papildu 5,08 miljonus dDAI un nosūtīja to likvidatoram. Tas palielināja likvidatora parādu līdz 260 miljoniem USD. Visbeidzot, Euler pārskaitīja aptuveni 310,9 miljonus eDAI no aizņēmēja likvidatoram, pabeidzot likvidācijas procesu.
Galu galā aizņēmējs palika bez eDAI, bez DAI un 146 miljoniem dDAI. Tas nozīmēja, ka kontam nebija aktīvu un parādu 146 miljonu dolāru vērtībā.
No otras puses, likvidatoram bija aptuveni 310,9 miljoni eDAI un tikai 260 miljoni dDAI.
Kad likvidācija bija pabeigta, likvidators izpirka 38 miljonus eDAI (38,9 miljonus ASV dolāru), pretī saņemot 38,9 miljonus DAI. Pēc tam viņi atdeva Euler Exploiter Contract 1 30 miljonus DAI plus procentus, ko līgumā izmantoja, lai atmaksātu aizdevumu no Aave.
Beigās likvidatoram palika apm. 8,9 miljonu dolāru peļņa, kas tika izmantota no citiem protokola lietotājiem.
Šis uzbrukums tika atkārtots vairākiem citiem marķieriem, tostarp Wrapped Bitcoin (WBTC), Staked Ether (stETH) un USDC, kuru apjoms izmantotajās kriptovalūtās sasniedz 197 miljonus USD.
Zaudējumi no Eilera uzbrukuma. Avots: Blocksec Kas nogāja greizi Eilera uzbrukumā
Blockchain drošības firmas Omniscia un SlowMist ir analizējušas uzbrukumu, lai mēģinātu noteikt, kas to varēja novērst.
Saskaņā ar Omniscia 13. marta ziņojumu, galvenā Euler problēma bija tā funkcija “donateToReserves”. Šī funkcija ļāva uzbrucējam ziedot savu eDAI Euler rezervēm, noņemot līdzekļus no sava maka, nenoņemot atbilstošu parāda summu. Omnisica saka, ka šī funkcija nebija sākotnējā Euler versijā, bet tika ieviesta Euler 14. uzlabošanas priekšlikumā (eIP-14).
eIP-14 kods atklāj, ka tas izveidoja funkciju ar nosaukumu donateToReserves, kas ļauj lietotājam pārsūtīt marķierus no sava bilances uz protokola mainīgo ar nosaukumu “assetStorage.reserveBalance”. Ikreiz, kad tiek izsaukta šī funkcija, līgums izstaro notikumu “RequestDonate”, kas sniedz informāciju par darījumu.
Blockchain dati liecina, ka šis RequestDonate notikums tika izsūtīts 100 miljonu marķieru vērtībā. Šī ir precīza Etherscan uzrādītā summa, kas tika sadedzināta, nospiežot kontu uz maksātnespēju.
Uzbrukuma laikā tiek raidīts notikums Eilera RequestDonate. Avots: Ethereum blokķēdes dati
15. marta analīzē SlowMist vienojās ar Omniscia par donateToReserve funkcijas nozīmi, norādot:
"Nespēja pārbaudīt, vai lietotājs pēc līdzekļu ziedošanas rezerves adresei bija likvidācijas stāvoklī, izraisīja tiešu mīkstās likvidācijas mehānisma iedarbināšanu."
Uzbrucējs varēja arī veikt uzbrukumu pat tad, ja ziedošanas funkcija nepastāvētu. Euler “EToken.sol” līguma kods vietnē GitHub satur standarta ERC-20 “pārsūtīšanas” funkciju. Šķiet, ka tas nozīmē, ka uzbrucējs varēja pārsūtīt savus eTokenus citam nejaušam lietotājam vai uz nulles adresi, nevis ziedot, tādējādi nonākot maksātnespējā.
Euler eToken līguma pārsūtīšanas funkcija. Avots: GitHub
Tomēr uzbrucējs izvēlējās līdzekļus ziedot, nevis pārskaitīt, kas liecina, ka pārskaitījums nebūtu izdevies.
Cointelegraph ir sazinājies ar Omniscia, SlowMist un Euler komandu, lai noskaidrotu, vai funkcija donateToReserves bija būtiska uzbrukumam. Tomēr līdz publicēšanas laikam tas nav saņēmis atbildi.
Abas firmas vienojās, ka vēl viena liela Euler ievainojamība bija likvidatoriem piedāvātās krasās atlaides. Saskaņā ar SlowMist teikto, ja aizdevuma protokolam ir "likvidācijas mehānisms, kas dinamiski atjaunina atlaides", tas "rada ienesīgas arbitrāžas iespējas uzbrucējiem, lai izņemtu lielu nodrošinājuma apjomu bez nepieciešamības pēc ķīlas vai parāda atmaksas." Omniscia veica līdzīgus novērojumus, norādot:
"Kad pārkāpējs pats likvidējas, tiek piemērota procentuāla atlaide [..], kas garantē, ka viņi atradīsies "virs ūdens" un uzņemsies tikai parādu, kas atbilst nodrošinājumam, ko viņi iegūs."
Kā novērst turpmāku Eilera uzbrukumu
Savā analīzē SlowMist ieteica izstrādātājiem, kā nākotnē novērst vēl vienu Eilera stila uzbrukumu. Tā apgalvoja, ka aizdevuma protokoliem nevajadzētu ļaut lietotājiem sadedzināt aktīvus, ja tas izraisīs sliktu parādu veidošanos, un apgalvoja, ka izstrādātājiem jābūt uzmanīgiem, izmantojot vairākus moduļus, kas var savstarpēji mijiedarboties neparedzētā veidā.
"SlowMist drošības komanda iesaka aizdevuma protokolos iekļaut nepieciešamās veselības pārbaudes funkcijās, kas saistītas ar lietotāju līdzekļiem, vienlaikus ņemot vērā arī drošības riskus, kas var rasties, apvienojot dažādus moduļus. Tas ļaus izstrādāt drošus ekonomiskus un dzīvotspējīgus modeļus, kas efektīvi mazina šādus uzbrukumus nākotnē."
DeFi izstrādātāja Spool pārstāvis Cointelegraph pastāstīja, ka tehnoloģiskais risks ir DeFi ekosistēmas būtiska iezīme. Lai gan to nevar novērst, to var mazināt, izmantojot modeļus, kas pareizi novērtē protokolu riskus.
Saskaņā ar Spool riska pārvaldības balto grāmatu tā izmanto “riska matricu”, lai noteiktu protokolu riskantumu. Šajā matricā tiek ņemti vērā tādi faktori kā protokola gada procentuālais ienesīgums (APY), tā līgumiem veiktās revīzijas, laiks kopš tā ieviešanas, kopējā bloķētā vērtība (TVL) un citi, lai izveidotu riska novērtējumu. Spool lietotāji var izmantot šo matricu, lai dažādotu DeFi ieguldījumus un ierobežotu riskus.
Pārstāvis pastāstīja Cointelegraph, ka Spool matrica ievērojami samazināja investoru zaudējumus no Eilera incidenta.
"Šajā incidentā vissmagāk skartās viedās glabātuves, kuras lietotāji ir izstrādājuši, lai meklētu augstāku (un riskantāku) ienesīgumu, tika ietekmētas tikai līdz 35%. Salīdzinājumam, vismazāk ietekmētās glabātuves ar Eilera stratēģijām (izmantojot Harvest vai Idle) tika ietekmētas tikai par 6%. Dažām glabātuvēm bija nulle iedarbība, un tāpēc tās netika ietekmētas," viņi norādīja.
Spool turpināja: "Lai gan tas nav ideāli, tas skaidri parāda Smart Vaults spēju nodrošināt pielāgotus riska modeļus un sadalīt lietotāju līdzekļus starp vairākiem ienesīguma avotiem."
Cointelegraph saņēma līdzīgu atbildi no SwissBorg, cita DeFi protokola, kura mērķis ir palīdzēt lietotājiem ierobežot risku, izmantojot diversifikāciju. SwissBorg izpilddirektors Sairuss Fāzels paziņoja, ka SwissBorg lietotnei ir “dažādas ienesīguma stratēģijas, kuru pamatā ir risks/timeAPY”.
Dažas stratēģijas ir norādītas kā "1: kodols = zems", bet citas ir norādītas kā "2: piedzīvojumu = riskants". Tā kā Eileram tika piešķirts vērtējums “2”, protokola radītie zaudējumi bija ierobežoti līdz tikai nelielai daļai no SwissBorg kopējās vērtības, norādīja Fāzels.
SwissBorg inženieru nodaļas vadītājs Nikolass Remonds arī paskaidroja, ka komanda izmanto sarežģītus kritērijus, lai noteiktu, kādus protokolus var uzskaitīt SwissBorg lietotnē.
"Mums ir uzticamības pārbaudes process visām DeFi platformām pirms ieiešanas jebkurā pozīcijā. Un tad, kad esam tur, mums ir darbības procedūras," viņš teica, piebilstot: "Pārbaude ir saistīta ar TVL, komandu, auditiem, atvērtā pirmkoda kodu, TVL, orākulu manipulācijas uzbrukumu utt. […] Darbības procedūra ir saistīta ar platformas uzraudzību, sociālo mediju uzraudzību un dažiem ārkārtas pasākumiem, tāpēc mēs joprojām varam investēt uz manuālu, bet mēs joprojām varam automatizēt. reaģējošs."
13. marta Twitter pavedienā SwissBorg komanda paziņoja, ka, lai gan protokols ir zaudējis 2,2% līdzekļu no viena fonda un 29,52% no cita fonda, SwissBorg kompensēs visiem lietotājiem, ja līdzekļi nebūtu atgūstami no Euler.
Eulera uzbrukums bija 2023. gada 1. ceturkšņa sliktākais DeFi noziegums. Par laimi, uzbrucējs atdeva lielāko daļu līdzekļu, un vairumam lietotāju vajadzētu būt bez zaudējumiem, kad viss ir pateikts un izdarīts. Taču uzbrukums rada jautājumus par to, kā izstrādātāji un lietotāji var ierobežot risku, jo DeFi ekosistēma turpina paplašināties.
Problēmas risinājums var būt izstrādātāja rūpības un investoru diversifikācijas kombinācija. Tomēr, neskatoties uz to, Euler uzlaušana var tikt apspriesta arī nākotnē, ja ne cita iemesla dēļ, kā tikai tā milzīgais izmērs un DeFi izmantošanas risku ilustrācija.
