Nesenā Curve pūla ievainojamība atšķiras no iepriekš redzētajiem kriptovalūtu uzlaušanas incidentiem, jo ​​šoreiz problēma nav tieši saistīta ar paša viedā līguma ievainojamību, bet gan ar izmantotās programmēšanas valodas Vyper kompilatoru.

Vyper ir vieda, uz līgumiem orientēta programmēšanas valoda, kas izmanto Python līdzīgu stilu un ir īpaši izstrādāta, lai mijiedarbotos ar Ethereum virtuālo mašīnu (EVM).

Šīs ievainojamības ietekme ir ļoti nopietna, un katru dienu ziņās tiek ziņots par milzīgiem zaudējumiem. Šķiet, ka situācija tiek kontrolēta, taču ne agrāk, kad hakeri nozaga vairāk nekā 70 miljonus ASV dolāru. Saskaņā ar LlamaRisk veikto pēcnovērtējumu hakeri uzbruka arī dažiem DeFi projektu pūliem, tostarp PEGD pETH/ETH pūlam, kas zaudēja 11 miljonus ASV dolāru, Metronome msETH/ETH kopu, kas zaudēja 3,4 miljonus ASV dolāru, un Alchemix alETH/ETH pūlam, kas zaudēja 11 ASV dolārus. 22,6 miljonus ASV dolāru, savukārt Curve DAO pūls zaudēja aptuveni 24,7 miljonus ASV dolāru.

Šo ievainojamību sauc par atkārtotas ievadīšanas kļūdu, un tā galvenokārt parādās dažās Vyper programmēšanas valodas versijās, īpaši v0.2.15, v0.2.16 un v0.3.0. Tāpēc projekti, kas izmanto šīs īpašās Vyper versijas, var kļūt par uzbrukumu mērķiem.

Kas ir atgriešanās? )

Lai saprastu, kāpēc šī ievainojamība radās, vispirms sapratīsim, kas ir atkārtota ievadīšana un kā tā darbojas.

Tā sauktā atkārtotā ievadīšana nozīmē, ka funkciju izpildes laikā var pārtraukt un droši izsaukt vēlreiz pirms iepriekšējā zvana pabeigšanas. Šo mehānismu bieži izmanto tādās lietojumprogrammās kā aparatūras pārtraukumu apstrāde un rekursija.

Lai funkciju varētu izmantot atkārtoti, tai ir jāatbilst dažiem nosacījumiem:

Pirmkārt, tas nevar izmantot globālos un statiskos datus. Šī ir vienošanās, kas nozīmē, ka, kad funkcija tiek izpildīta, nepaļaujieties uz globāliem datiem vai statiskiem mainīgajiem. Jo, ja funkcija tiek pārtraukta izpildes laikā un pēc tam atkal izsaukta, globālie un statiskie dati var tikt bojāti vai informācija var tikt zaudēta.

Otrkārt, tā nevar modificēt savu kodu. Neatkarīgi no tā, kad funkcija tiek pārtraukta, tai jāspēj turpināt izpildi tādā pašā veidā. Ja funkcija izpildes laikā maina savu kodu, atkārtoti izsaucot, var rasties kļūda.

Visbeidzot, tas nevar izsaukt citas funkcijas, kas nav atkārtoti ienākošas. Tas nozīmē, ka atkārtotas ievadīšanas funkcijā nevajadzētu izsaukt citas funkcijas, kas var nebūt atkārtotas. Jo, ja jūs to darāt, tas var izraisīt neparedzamus rezultātus, izraisot programmas avāriju vai kļūdas.

To ir pārāk grūti saprast, tāpēc mēs neiedziļināsimies detaļās.

Kā tas tika izmantots?

Paskaidrosim, kā atkārtotas ieejas uzbrukumi izraisīja līdzekļu zādzību un 70 miljonu dolāru zaudējumus uzbrukumā Curve.

Pirmkārt, mēs zinām, ka atkārtotas ienākšanas uzbrukums attiecas uz metodi, kurā ļaunprātīgs līgums atkārtoti izsauc funkciju viedajā līgumā. Uzbrukumā Curve šī funkcija tiek izmantota, lai izņemtu lietotāja likviditāti pūlā. Šai funkcijai ir trūkums, jo tā neveic pietiekami daudz pārbaužu pirms summas atjaunināšanas.

Apskatīsim konkrēto uzbrukuma procesu:

  1. Pieņemsim, ka neaizsargātam viedajam līgumam ir 10 ēteri.

  2. Uzbrucējs izsauc depozīta funkciju un nogulda 1 Ethereum.

  3. Pēc tam uzbrucējs izsauc izņemšanas funkciju un gatavojas izņemt 1 Ethereum. Šajā funkcijā tas pārbauda, ​​vai uzbrucēja kontā ir 1 Ethereum.

  4. Tomēr šī funkcija neatjaunina atlikumu līgumā pirms 1 Ether pārsūtīšanas uz uzbrucēja kontu. Tas nozīmē, ka līgums joprojām uzskata, ka iekšpusē ir 10 ētera.

  5. Uzbrucējs vēlreiz izsauc izņemšanas funkciju (re-entry) un gatavojas vēlreiz izņemt 1 Ethereum.

  6. Tā kā līgumā joprojām tiek uzskatīts, ka iekšā ir 10 ēteri, tas atkal nodos 1 ēteri uzbrucējam.

  7. Šis process atkārtojas, līdz līgumā vairs nav likviditātes.

Tādā veidā uzbrucējs var atkārtoti izsaukt izņemšanas funkciju un pārskaitīt gandrīz visu līgumā paredzēto likviditāti uz savu kontu, izraisot līgumā esošo līdzekļu nozagšanu.

Šī ievainojamība ir ļoti izdevīga uzbrucējam, jo ​​līgumā norādītā summa netiek atjaunināta reāllaikā, ļaujot uzbrucējam atkārtot uzbrukumu, līdz līgumā nav pieejami līdzekļi atsaukšanai. #Crv