Πώς να ξεφύγετε από τα έξυπνα συμβόλαια από τον συμπλέκτη των επιθέσεων επανεισόδου; Ευφυΐα Δεδομένων PlatoBlockchain. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Πώς να ξεφύγετε από τα έξυπνα συμβόλαια από τον συμπλέκτη των επιθέσεων επανεισόδου;

Ώρα ανάγνωσης: 6 πρακτικά

Αν ρίξουμε μια πιο προσεκτική ματιά στα μεγαλύτερα hacks κρυπτογράφησης και τις εντυπωσιακές φιγούρες που χάθηκαν από αυτά, θα είχαν ριζώσει βαθιά από τα ελαττώματα κωδικοποίησης.

Ένα τέτοιο συνηθισμένο φαινόμενο ευπάθειας ασφαλείας είναι η επίθεση Reentrancy. Ωστόσο, το καταστροφικό αποτέλεσμα που προκαλείται λόγω της κακής διαχείρισης της επανεισόδου μπορεί να μην ακούγεται τόσο απλό όσο η έναρξη της ίδιας της επίθεσης.

Παρά το γεγονός ότι είναι ένα οικείο και πολυδιαφημισμένο θέμα, η εμφάνιση του σφάλματος Reentrancy στα έξυπνα συμβόλαια είναι πάντα αναπόφευκτη. 

Πόσο συχνά είχε γίνει εκμετάλλευση της ευπάθειας Reentrancy από χάκερ τα τελευταία χρόνια; Πώς λειτουργεί; Πώς να περιορίσετε τα έξυπνα συμβόλαια από την απώλεια κεφαλαίων σε σφάλματα επανεισόδου; Βρείτε απαντήσεις σε αυτές τις ερωτήσεις σε αυτό το blog.

Έτσι, σύντομα, ας δούμε τις μεγαλύτερες επιθέσεις επανεισόδου στη μνήμη. 

Μερικά από τα πιο διαβόητα hacks επανεισόδου σε πραγματικό χρόνο 

Οι επιθέσεις επανεισόδου που προκάλεσαν τα πιο καταστροφικά αποτελέσματα στα έργα κατέληξαν να κάνουν ένα από αυτά τα δύο ή και τα δύο. 

  • Αδειάστε εντελώς τον Αιθέρα από τα έξυπνα συμβόλαια
  • Χάκερ εισχωρούν κρυφά στον κώδικα έξυπνων συμβολαίων

Μπορούμε τώρα να παρατηρήσουμε μερικές περιπτώσεις επιθέσεων Reentrancy και τον αντίκτυπό τους. 

Ιουν 2016: Επίθεση DAO – 3.54 εκατομμύρια ή 150 εκατομμύρια δολάρια Αιθέρας

Απρίλιος 2020: Uniswap/Lendf.Me hack – 25 εκατομμύρια $

Μπορεί 2021: Το χάκ BurgerSwap – 7.2 εκατομμύρια δολάρια

2021 Αυγούστου: Χακ CREAM FINANCE – 18.8 εκατομμύρια $

Μάρτιος 2022: Ola Finance – 3.6 εκατομμύρια δολάρια

Ιούλιος 2022: Πρωτόκολλο OMNI – 1.43 εκατ. $

Είναι ξεκάθαρο ότι οι επιθέσεις Reentrancy δεν έχουν βγει ποτέ εκτός μόδας. Ας αποκτήσουμε βαθιές γνώσεις σχετικά με αυτό στα ακόλουθα αποσπάσματα. 

Επισκόπηση της επίθεσης επανεισόδου

Όπως από το όνομα "Επανεισαγωγή", που σημαίνει "Επανεισαγωγή ξανά και ξανά". Η επίθεση επανεισόδου περιλαμβάνει δύο συμβόλαια: Το συμβόλαιο με το θύμα και το συμβόλαιο με τον επιτιθέμενο. 

Το συμβόλαιο του εισβολέα εκμεταλλεύεται την ευπάθεια επανεισόδου στο συμβόλαιο του θύματος. Χρησιμοποιεί τη λειτουργία απόσυρσης για να το πετύχει. 

Το συμβόλαιο του εισβολέα καλεί τη συνάρτηση απόσυρσης για την εξάντληση των χρημάτων από το συμβόλαιο του θύματος πραγματοποιώντας επαναλαμβανόμενες κλήσεις προτού ενημερωθεί το υπόλοιπο στο συμβόλαιο του θύματος. Το συμβόλαιο του θύματος θα ελέγξει το υπόλοιπο, θα στείλει κεφάλαια και θα ενημερώσει το υπόλοιπο. 

Όμως, εντός του χρονικού πλαισίου αποστολής των κεφαλαίων και ενημέρωσης του υπολοίπου στο συμβόλαιο, το συμβόλαιο του επιτιθέμενου κάνει τη συνεχή κλήση για ανάληψη χρημάτων. Ως αποτέλεσμα, το υπόλοιπο δεν ενημερώνεται στο συμβόλαιο του θύματος έως ότου το συμβόλαιο του εισβολέα εξαντλήσει όλα τα χρήματα.

Η σοβαρότητα και το κόστος της εκμετάλλευσης της επανεισδοχής ανησυχούν για την απόλυτη ανάγκη για εκτέλεση Έξυπνοι έλεγχοι συμβολαίου για να αποκλειστεί η πιθανότητα παράβλεψης τέτοιων σφαλμάτων. 

Ενδεικτική άποψη του Reentrancy Attack

Ας κατανοήσουμε την έννοια της επίθεσης επανεισόδου από την απλοποιημένη εικόνα παρακάτω. 

Εδώ είναι δύο συμβόλαια: Το συμβόλαιο ευάλωτων και το συμβόλαιο χάκερ

Το συμβόλαιο χάκερ κάνει μια κλήση για υπαναχώρηση από το ευάλωτο συμβόλαιο. Μόλις λάβει την κλήση, το ευάλωτο συμβόλαιο ελέγχει για τα χρήματα στο συμβόλαιο χάκερ και στη συνέχεια μεταφέρει τα χρήματα στον χάκερ. 

Ο χάκερ λαμβάνει τα κεφάλαια και εφαρμόζει την εφεδρική συνάρτηση, η οποία καλεί ξανά στο ευάλωτο συμβόλαιο ακόμη και πριν ενημερωθεί το υπόλοιπο στο συμβόλαιο ευάλωτων. Επαναλαμβάνοντας έτσι την ίδια λειτουργία, ο χάκερ αποσύρει πλήρως τα κεφάλαια από το ευάλωτο συμβόλαιο. 

Πώς να ξεφύγετε από τα έξυπνα συμβόλαια από τον συμπλέκτη των επιθέσεων επανεισόδου;

Χαρακτηριστικά της λειτουργίας Fallback που χρησιμοποιούνται από τον Attacker 

  • Είναι εξωτερικά καλούμενοι. Δηλ. δεν μπορούν να κληθούν από μέσα στο συμβόλαιο που είναι γραμμένα
  • Συνάρτηση χωρίς όνομα
  • Η εναλλακτική συνάρτηση δεν περιλαμβάνει αυθαίρετη λογική μέσα της
  • Το εφεδρικό ενεργοποιείται όταν το ETH αποστέλλεται στο έξυπνο συμβόλαιο που περικλείει και δεν δηλώνεται καμία συνάρτηση λήψης ().

Ανάλυση της επίθεσης επανεισόδου από τεχνική άποψη 

Ας πάρουμε ένα δείγμα συμβολαίου και ας καταλάβουμε πώς συμβαίνει η επίθεση επανεισόδου.

Κακόβουλο συμβόλαιο

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


}

Αυτό είναι το συμβόλαιο του επιτιθέμενου στο οποίο ο εισβολέας καταθέτει 2ETH. Ο εισβολέας καλεί τη συνάρτηση απόσυρσης στο ευάλωτο συμβόλαιο. Μόλις ληφθούν τα κεφάλαια από το ευάλωτο συμβόλαιο, ενεργοποιείται η εφεδρική συνάρτηση. 

Στη συνέχεια, το εφεδρικό εκτελεί τη λειτουργία ανάληψης και αποστραγγίζει το κεφάλαιο από το ευάλωτο συμβόλαιο. Αυτός ο κύκλος συνεχίζεται μέχρι να εξαντληθούν πλήρως τα κεφάλαια από το ευάλωτο συμβόλαιο.

Ευάλωτη σύμβαση

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


}

Το ευάλωτο συμβόλαιο έχει 30ΕΘ. Εδώ η συνάρτηση αποσύρσεως() στέλνει το ζητούμενο ποσό στον εισβολέα. Δεδομένου ότι το υπόλοιπο δεν ενημερώνεται, τα διακριτικά μεταφέρονται στον εισβολέα επανειλημμένα. 

Τύποι επιθέσεων επανεισόδου

  • Επανεισαγωγή μιας λειτουργίας 
function withdraw() external {
   uint256 amount = balances[msg.sender];
   require(msg.sender.call.value(amount)());
   balances[msg.sender] = 0;
}

Το msg.sender.call.value(amount)() μεταφέρει τα κεφάλαια μετά τα οποία η εφεδρική συνάρτηση συμβολαίου εισβολέα καλεί ξανά remove() πριν ενημερωθούν τα υπόλοιπα[msg.sender] = 0.

  • Επανεισαγωγή πολλαπλών λειτουργιών
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;
}

Η επανεισαγωγή πολλαπλών λειτουργιών είναι πολύ πιο περίπλοκη για τον προσδιορισμό. Η διαφορά εδώ είναι ότι η εναλλακτική συνάρτηση καλεί μεταφορά, σε αντίθεση με την επανεισαγωγή μιας λειτουργίας, όπου καλεί την απόσυρση.

Πρόληψη κατά των επιθέσεων επανεισόδου

Μοτίβο ελέγχου-επιπτώσεων-αλληλεπιδράσεων: Το μοτίβο ελέγχου-επιδράσεων-αλληλεπιδράσεων βοηθά στη δόμηση των συναρτήσεων. 

Το πρόγραμμα θα πρέπει να κωδικοποιηθεί με τρόπο που να ελέγχει πρώτα τις συνθήκες. Μόλις περάσουν τους ελέγχους, θα πρέπει να επιλυθούν οι επιπτώσεις στην κατάσταση των συμβάσεων, μετά την οποία μπορούν να κληθούν οι εξωτερικές λειτουργίες. 

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

Ο κώδικας που ξαναγράφεται εδώ ακολουθεί το μοτίβο ελέγχους-εφέ-αλληλεπιδράσεων. Εδώ το υπόλοιπο μηδενίζεται πριν πραγματοποιήσετε μια εξωτερική κλήση. 

Χρήση τροποποιητή

Ο τροποποιητής noReentrant που εφαρμόζεται στη συνάρτηση διασφαλίζει ότι δεν υπάρχουν κλήσεις εκ νέου εισερχομένων. 

contract ReEntrancyGuard {
    bool internal locked;

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

Στο τέλος

Το πιο αποτελεσματικό βήμα είναι να αναλάβετε έξυπνους ελέγχους συμβολαίων από μια κορυφαία εταιρεία ασφάλειας όπως η QuillAudits, όπου οι ελεγκτές παρακολουθούν στενά τη δομή του κώδικα και ελέγχουν πώς αποδίδει η εναλλακτική λειτουργία. Με βάση τα μοτίβα που μελετήθηκαν, δίνονται συστάσεις για αναδιάρθρωση του κώδικα, εάν φαίνεται ότι υπάρχει ευάλωτες συμπεριφορές

Η ασφάλεια των κεφαλαίων διασφαλίζεται ακριβώς πριν πέσετε θύμα οποιασδήποτε ζημίας. 

FAQs

Τι είναι η επίθεση επανεισόδου;

Μια επίθεση επανεισόδου συμβαίνει όταν μια συνάρτηση στο ευάλωτο συμβόλαιο κάνει κλήση σε ένα μη αξιόπιστο συμβόλαιο. Το μη αξιόπιστο συμβόλαιο θα είναι το συμβόλαιο του εισβολέα που κάνει επαναλαμβανόμενες κλήσεις προς το ευάλωτο συμβόλαιο μέχρι να εξαντληθούν πλήρως τα χρήματα. 

Τι είναι ο επανεισαγόμενος;

Η πράξη της επανεισαγωγής σημαίνει διακοπή της εκτέλεσης του κώδικα και εκκίνηση της διαδικασίας από την αρχή, η οποία είναι επίσης γνωστή ως επανεισαγωγή.

Τι είναι ο φύλακας επανεισόδου;

Η προστασία επανεισόδου χρησιμοποιεί έναν τροποποιητή που εμποδίζει την επανειλημμένη κλήση της συνάρτησης. Διαβάστε το παραπάνω ιστολόγιο για να βρείτε το παράδειγμα για τον φύλακα επανεισόδου.

Ποιες είναι μερικές από τις επιθέσεις στα έξυπνα συμβόλαια;

Τα έξυπνα συμβόλαια εκτίθενται σε πολυάριθμα τρωτά σημεία, όπως η επανεισαγωγή, η εξάρτηση από χρονική σήμανση, οι αριθμητικές υπερχειλίσεις, οι επιθέσεις DoS και ούτω καθεξής. Επομένως, ο έλεγχος είναι απαραίτητος για να διασφαλιστεί ότι δεν υπάρχουν σφάλματα που καταρρέουν τη λογική της σύμβασης.

69 Προβολές

Σφραγίδα ώρας:

Περισσότερα από Quillhash