Καθώς τα πρωτόκολλα DeFi συνεχίζουν να θερμαίνονται εντός του οικοσυστήματος Ethereum, το CipherTrace βλέπει όλο και περισσότερες εκμεταλλεύσεις και διανύσματα επίθεσης που έρχονται στο φως. Την περασμένη εβδομάδα, στις 28 Δεκεμβρίου 2020, εκμεταλλεύτηκε το συμβόλαιο εξόρυξης ασπίδων της Cover Protocol, Blacksmith. Οι χάκερς χρησιμοποίησαν ένα σφάλμα στο συμβόλαιο εξόρυξης για να κόψουν ένα άπειρο ποσό κουπονιών COVER και να απομακρύνουν περισσότερα από 4.4 εκατομμύρια δολάρια από το έργο.
Πρωτόκολλο κάλυψης κυκλοφόρησε το Post-Mortem τους χθες, δηλώνοντας ότι, άγνωστο στους Devs, το σφάλμα υπήρχε από την αρχική ανάπτυξη του συμβολαίου Blacksmith, τονίζοντας τη σημασία των ενδελεχών ελέγχων ασφαλείας και του έξυπνες συμβάσειςΤι είναι τα έξυπνα συμβόλαια; Ένα έξυπνο συμβόλαιο είναι επαγγελματικός υπολογιστής… Περισσότερα.
Ένα χρονοδιάγραμμα άπειρου νομισματοκοπείου
Το χρονοδιάγραμμα του αρχικού εισβολέα
- Η ομάδα ρευστότητας New Balancer ήταν προστιθέμενη στη σύμβαση Blacksmith.sol.
- επιθέσεις καταθέσεις 1,326,879.99 BPT συμβολίζει τη σύμβαση Blacksmith.sol.
- Ο ίδιος εισβολέας τότε εκτελεί την εκμετάλλευση, με ανάληψη χρημάτων από τη σύμβαση.
- Ο εισβολέας ήταν σε θέση να ΣΥΝΕΧΕΙΑ κοπή ανταμοιβών και ανάληψη χρημάτων ύψους περίπου 4.4 εκατομμυρίων δολαρίων.
Σε μια ενδιαφέρουσα σειρά γεγονότων, οι υποτιθέμενοι «λευκοί χάκερ» που συνδέονται με τη Grap Finance εκμεταλλεύτηκαν επίσης το σφάλμα για να κόψουν περίπου 4 εκατομμύρια δολάρια αξίας COVER. Η Grap Finance επέστρεψε τελικά τα χρήματα στο Cover Protocol.
Χρονολόγιο Grap Finance Deployer Externalally Owned Account (EOA)
- Η νέα ομάδα ρευστότητας ήταν εγκεκριμένη για εξόρυξη ρευστότητας.
- Grap Finance Deployer ΕΟΑ κατατεθεί 15,255.55 BPT (DAI / Basis) στην πισίνα στο Cover μέσω της σύμβασης Blacksmith.sol.
- Περίπου τέσσερα λεπτά αργότερα, τα χρήματα ήταν αποτραβηγμένος στην κάλυψη αφήνοντας 1 Wei στο υπόλοιπο EOA του Grap Finance Deployer's.
- Ένας άλλος εξωτερικός χρήστης αποσύρθηκε το μεγαλύτερο μέρος του υπολοίπου τους από τη σύμβαση Blacksmith.sol περίπου την ίδια στιγμή που οδήγησε την Grap Finance σε όλη τη ρευστότητα για το DAI / Basis pool στο συμβόλαιο Blacksmith.sol.
- Grap Finance Deployer κατατεθεί πίσω 15,255.55 BPT (DAI / Basis) στην πισίνα.
- Στη συνέχεια, Grap Finance Deployer αξιώσεις τις ανταμοιβές και, λόγω της εκμετάλλευσης, νομίσματα 40,796,131,214,802,500,000.21 ΚΑΛΥΨΗ.
- Μετά από κάψιμο των νομισμάτων, ο Grap Finance Deployer αποστέλλει πίσω ο Αιθέρας στο εξώφυλλο "Την επόμενη φορά, φροντίστε τα σκατά σας."
Τρόπος νομισματοκοπίας άπειρων κουπονιών - Τεχνική ανάλυση
Ιστορικό
Αυτή η εκμετάλλευση μας οδηγεί πίσω στις βασικές αρχές της γλώσσας προγραμματισμού Solidity, η οποία χρησιμοποιείται για την εφαρμογή έξυπνων συμβάσεων στο Ethereum. Μόλις καταρτιστούν αυτά τα συμβόλαια, η Εικονική Μηχανή Ethereum (EVM) θα είναι σε θέση να κατανοήσει τις οδηγίες (δηλ. Opcodes) που χρησιμοποιούνται για την εκτέλεση διαφόρων λειτουργιών και τον χειρισμό μνήμης και αποθήκευσης. Το EVM έχει τρεις διαφορετικούς τομείς όπου μπορεί να αποθηκεύσει δεδομένα: μνήμη, αποθήκευση και στοίβα. Η κατανόηση αυτών των περιοχών είναι σημαντική για την κατανόηση του τρόπου εκμετάλλευσης του σφάλματος.
Παρόμοια με τη μνήμη τυχαίας προσπέλασης (RAM) σε μια υπολογιστική συσκευή, το “μνήμηΗ λέξη-κλειδί στο Solidity εκχωρεί μνήμη για μια συγκεκριμένη μεταβλητή. Σε αυτήν την περίπτωση, αυτή η μεταβλητή καλύπτει μια συγκεκριμένη συνάρτηση. Η μνήμη εκκαθαρίζεται μετά την εκτέλεση της λειτουργίας, αλλά θα μπορούσε να παραμείνει εάν τα περιεχόμενα αυτής της μνήμης ωθούνται στην αποθήκευση πριν επιστρέψει η συνάρτηση.
Ο "χώρος στο δίσκοΗ λέξη-κλειδί στο Solidity επιτρέπει στις μεταβλητές να λειτουργούν ως δείκτες στην αποθήκευση δεδομένων σε αντιστοιχίσεις ή δομές δεδομένων. Τα δεδομένα αποθήκευσης εξακολουθούν να υφίστανται μεταξύ κλήσεων λειτουργίας και συναλλαγών. Κάτω από την κουκούλα, η αποθήκευση είναι ουσιαστικά ένα κατάστημα κλειδιού-τιμής που χαρτογραφεί λέξεις 256-bit σε λέξεις 256-bit.
Σημειώστε ότι το EVM δεν είναι μηχανή καταχώρησης αλλά μηχανή στοίβας - επομένως όλοι οι υπολογισμοί εκτελούνται σε μια περιοχή δεδομένων που ονομάζεται η στοίβα. Η στοίβα έχει μέγιστη χωρητικότητα 1024 αντικειμένων, αλλά μόνο τα κορυφαία 16 είναι εύκολα προσβάσιμα, τα οποία μπορούν να χρησιμοποιηθούν για την ανταλλαγή του ανώτατου στοιχείου με ένα από τα 16 στοιχεία κάτω από αυτό και πολλά άλλα.
Το σφάλμα
Οι χάκερ εκμεταλλεύτηκαν το Blacksmith.sol του Cover Protocol - ένα συμβόλαιο εξόρυξης ασπίδων που επιτρέπει στα stakers να ανταμείβονται στα διακριτικά του συγκεκριμένου έργου ή ομάδας, όπως τα διακριτικά CLAIM και NOCLAIM, στο Cover Protocol.
Για να κατανοήσουμε καλύτερα το σφάλμα, πρώτα, ας δούμε το κοινό πισίνες μεταβλητή που είναι αντιστοίχιση (δηλ. αποθήκευση δεδομένων):
At γραμμή 118, βλέπουμε ότι η σύμβαση αποθηκεύει προσωρινά τα δεδομένα συγκέντρωσης στη μνήμη μέσω της λέξης-κλειδιού «μνήμη».
Στη συνέχεια γραμμή 121, η σύμβαση ενημερώνει την ομάδα αποθήκευσης ως το updatePool (διεύθυνση _lpToken) λειτουργία χρησιμοποιεί a Πισίνα αποθήκευσης πισίνας μεταβλητός.
Ωστόσο, αν κοιτάξετε πιο μακριά στο κατάθεση (διεύθυνση _lpToken, uint256 _amount) λειτουργία, χρησιμοποιεί το ίδιο πισίνα μεταβλητή από τη γραμμή 118 που αποθηκεύτηκε στην μνήμη μέσα στη συνάρτηση για υπολογισμούς για pool.accRewardsPerToken. Σε αυτό το σημείο, το πισίνα η μεταβλητή αντιγράφηκε από το πισίνες χαρτογράφηση και αποθηκεύτηκε στη μνήμη.
Ως αποτέλεσμα, οποιεσδήποτε αλλαγές έγιναν στο πισίνα μεταβλητή εντός του κατάθεση (διεύθυνση _lpToken, uint256 _amount) η συνάρτηση δεν θα αλλάξει το πισίνες χαρτογράφηση στην αποθήκευση on-chain της σύμβασης λόγω του γεγονότος ότι οι μεταβλητές που χρησιμοποιούν τη λέξη-κλειδί «μνήμη» περιλαμβάνονται μόνο στην ίδια τη συνάρτηση. Από εκεί, η σύμβαση ενημερώνει το pool.accRewardsPerToken μέσα στο updatePool (διεύθυνση _lpToken) συνάρτηση, η οποία χρησιμοποιεί χώρο αποθήκευσης. Τώρα, μέσα στο updatePool (διεύθυνση _lpToken) λειτουργήστε το pool.accRewardsPerToken που ενημερώνεται αυξάνεται σε μεγάλο βαθμό καθώς ήταν τεχνικά μια νέα ομάδα και δεν σχετίζεται με το πισίνα εις μνήμην.
Μετά από αυτήν την ευπάθεια και κατάχρηση μεταξύ μνήμης και αποθήκευσης, το miner.rewardWriteoff μέσα στο κατάθεση (διεύθυνση _lpToken, uint256 _amount) Η συνάρτηση υπολογίζεται εσφαλμένα καθώς και η χρήση του λανθασμένου pool.accRewardsPerToken, καθώς βρισκόμαστε ακόμα στη λειτουργία κατάθεσης που χειρίζεται μια προσωρινή μνήμη στιγμιότυπου πισίνα.
Εκτός από τη λειτουργία κατάθεσης, οποιοσδήποτε, όπως η Grap Finance, μπορεί να αποκτήσει ένα τρελό ποσό νομισματοκοπείων όταν εκτελεί το αξίωση ανταμοιβής (διεύθυνση _lpToken) λειτουργία. Αυτή η λειτουργία, η οποία χρησιμοποιείται για την κατάκτηση των ανταμοιβών τους, καταλήγει να καλεί _claimCoverRewards (Pool memory pool, Miner memory miner) που αναφέρεται στο miner.rewardWriteoff που τονίσαμε παραπάνω. Καθώς αυτή η μεταβλητή είναι πολύ μικρότερη από την πραγματική pool.accRewardsPerToken, το συμβόλαιο έχει ως αποτέλεσμα την κοπή πολλών μαρκών.
Βασικές τακτικές
Η CipherTrace ελπίζει ότι αυτό το υπόβαθρο στο εκμεταλλευόμενο σφάλμα αποκαλύπτει τη σημασία των ενδελεχών ελέγχων ασφαλείας και του ελέγχου των έξυπνων συμβάσεων σε οποιοδήποτε blockchainΈνα blockchain - η τεχνολογία που βασίζεται στο bitcoin και άλλα… Περισσότερα κάποιος επιλέγει να αναπτυχθεί σε. Ενώ η Grap Finance επέστρεψε τα χρήματα που έλαβαν μέσω του exploit, ο αρχικός χάκερ ήταν ακόμη σε θέση να συγκεντρώσει πάνω από 4 εκατομμύρια δολάρια από το πρωτόκολλο DeFi και η αξία του διακριτικού COVER έπεσε έκτοτε κατά σχεδόν 99%.
Πηγή: https://ciphertrace.com/infinite-minting-exploit-nets-attacker-4-4m/