Καλώς ήρθατε στον οδηγό για αρχάριους για τον έξυπνο έλεγχο συμβολαίων! Ένας από τους καλύτερους τρόπους για να ξεκινήσετε με τον έλεγχο έξυπνων συμβολαίων είναι να ανατρέξετε και να εξετάσετε μερικούς συνήθεις τύπους ευπάθειας στα έξυπνα συμβόλαια.
Θα ήταν χρήσιμο αν έχετε ήδη μια βασική κατανόηση της γλώσσας προγραμματισμού Solidity του Ethereum. Όπως θα δούμε μερικούς από τους κώδικες που γράφτηκαν από προγραμματιστές Noob solidity.
Επίθεση επανεισόδου
Σενάριο πραγματικού κόσμου:
Φανταστείτε ότι έχετε 50 σοκολάτες. Έχετε μια άτακτη μικρή αδερφή στην οποία έχετε επιτρέψει να σας πάρει μόνο 2 σοκολάτες ανά πάσα στιγμή. Επίσης, δεν θέλετε να της δώσετε περισσότερες από 10 σοκολάτες σε μια μέρα, φοβούμενοι ότι θα πάθει τερηδόνα. Για να το εξασφαλίσετε αυτό, κάθε απόγευμα μετράτε πόσες σοκολάτες έχουν απομείνει μαζί σας. Πιστεύετε ότι αυτό θα λειτουργούσε; Ή θα σας χακάρει η μικρή σας αδερφή;
Δυστυχώς, δεν θα λειτουργήσει! Η αδερφή σου καταλαβαίνει ότι δεν ξέρεις πόσες σοκολάτες έχεις μέχρι να βραδιάσει. Την επόμενη κιόλας μέρα λοιπόν, η μικρή σου αδερφή σε επισκέπτεται 6 φορές πριν το βράδυ και παίρνει 2 σοκολάτες κάθε φορά! Αυτό είναι αυτό που ονομάζουμε επίθεση επανεισόδου.
Εδώ ενημερώνετε τον αριθμό των σοκολάτες που έχετε το βράδυ αντί να ενημερώνετε τον αριθμό κάθε φορά που η αδερφή σας παίρνει 2 σοκολάτες από εσάς. Αυτό συμβαίνει και με το έξυπνο συμβόλαιο. Το έξυπνο συμβόλαιο αναλαμβάνει μια συγκεκριμένη ισορροπία, ενώ ο εισβολέας είναι πραγματικά απασχολημένος με την απόσυρση ορισμένου ποσού κρυπτογράφησης από το συμβόλαιο πολλές φορές.
Παράδειγμα κώδικα πραγματικού κόσμου:
Αυτός ο κωδικός ανήκει σε ένα έξυπνο συμβόλαιο που ονομάζεται Μη τραπεζική. Οποιοσδήποτε μπορεί να αποσύρει τον αιθέρα από ένα συμβόλαιο Unbanked εφόσον τα υπόλοιπα του msg.sender (δηλ. ο καλών του withdraw
συνάρτηση ) είναι μεγαλύτερη ή ίση με το ποσό που ζητήθηκε για ανάληψη.
function withdraw(uint _amount) { require(balances[msg.sender] >= _amount); msg.sender.call.value(_amount)(); balances[msg.sender] -= _amount;
}
Σημειώστε ότι υπάρχει μια λέξη-κλειδί κλήσης που χρησιμοποιείται για την αποστολή της απαιτούμενης ποσότητας αιθέρα στο msg.sender
. Ένας εισβολέας μπορεί να το εκμεταλλευτεί αυτό δημιουργώντας ένα συμβόλαιο που ονομάζεται Thief στο οποίο καλεί τη συνάρτηση απόσυρσης σε a fallback()
λειτουργία. ΕΝΑ fallback()
Η συνάρτηση στο Solidity είναι μια ειδική συνάρτηση που εκτελείται όταν ο αιθέρας αποστέλλεται στο έξυπνο συμβόλαιο.
Αυτό σημαίνει ότι ένας εισβολέας είναι σε θέση να καλέστε αναδρομικά τη συνάρτηση απόσυρσης. Έτσι, πριν από τις ενημερώσεις του έξυπνου συμβολαίου, τα υπόλοιπα των msg.sender
στην τελευταία γραμμή κώδικα, ο εισβολέας έχει ήδη αποσύρει τον αιθέρα πολλές φορές. Αυτό θα μπορούσε να αποφευχθεί εάν τα υπόλοιπα ενημερωθούν πριν χρησιμοποιήσετε τη λέξη-κλειδί κλήσης, ακολουθώντας έτσι α έλεγχοι-επιπτώσεις-αλληλεπιδράσεις μοτίβο.
Επίπτωση:
Η πρώτη επίθεση επανεισόδου συνέβη το 2016 σε έναν DAO (Αποκεντρωμένη Αυτόνομη Οργάνωση) που οδήγησε σε hacks περίπου 50 εκατομμυρίων δολαρίων. Για να αντιστρέψει αυτό το hack, η κοινότητα του Ethereum χώρισε το blockchain Ethereum που οδήγησε στο ETC (Ethereum Classic) και το ETH (Ethereum).
Αριθμητική Υπερχείλιση και Υπερχείλιση
Σενάριο πραγματικού κόσμου:
Ας παίξουμε ένα παιχνίδι σκέψης. Αποτελείται από ένα Spin-the wheel, και ο νικητής αποφασίζεται με βάση τον μεγαλύτερο αριθμό που μπορεί να πάρει περιστρέφοντας τον τροχό. Ο τροχός σημειώνεται παντού από 256 έως -256.
Οι κανόνες του παιχνιδιού είναι ότι ο δείκτης για όλους τους παίκτες βρίσκεται στο 0 στην αρχή κάθε περιστροφής. Και ένας παίκτης επιτρέπεται να περιστρέφεται μόνο προς την κατεύθυνση αρνητικών αριθμών. Πώς θα κερδίσετε αυτό το παιχνίδι;
Μια καλή στρατηγική για να κερδίζετε αυτό το παιχνίδι κάθε φορά θα ήταν να περιστρέφετε τον τροχό με τέτοια δύναμη ώστε ο τροχός να περιστρέφεται έως και -256 και μετά να γυρίζει στο 256 με μία κίνηση. Αυτό είναι δυνατό επειδή το 256 έρχεται αμέσως μετά το -256 στον τροχό. Αυτό είναι αυτό που ονομάζουμε αριθμητική υποροή. Και η αριθμητική υπερχείλιση είναι ακριβώς το αντίστροφο από αυτό.
Παράδειγμα κώδικα πραγματικού κόσμου:
An υπορροή ή υπερχείλιση συμβαίνει όταν μια αριθμητική πράξη φτάσει το ελάχιστο ή το μέγιστο.
function withdraw(uint _amount) public { require(balances[msg.sender] - _amount > 0); address payable to = payable(msg.sender); to.transfer(_amount); balances[msg.sender] -= _amount;
}
Η _amount
Η παράμετρος της συνάρτησης απόσυρσης είναι ένας ανυπόγραφος ακέραιος αριθμός. Η τιμή της αντιστοίχισης υπολοίπων (η οποία είναι σαν ένα λεξικό σε python ή ένα ζεύγος κλειδιού-τιμής στη C++ ή Java) είναι επίσης ένας ακέραιος χωρίς υπογραφή.
mapping(address => uint256) public balances
Η απαιτούμενη δήλωση ελέγχει εάν τα υπόλοιπα των msg.sender
είναι θετικό ή όχι. Αλλά αυτή η δήλωση θα ισχύει πάντα ακόμα κι αν το ποσό είναι μεγαλύτερο από τα υπόλοιπα του msg.sender
. Αυτό συμβαίνει γιατί τόσο το balances
και _amount
Οι μεταβλητές είναι τύπου unsigned integer και το αριθμητικό τους αποτέλεσμα (μετά την underflow) θα είναι επίσης ένας unsigned integer!
Και όπως ίσως θυμάστε, ένας ανυπόγραφος ακέραιος είναι πάντα θετικός. Αυτό σημαίνει ότι ένας εισβολέας μπορεί να αποσύρει απεριόριστη ποσότητα αιθέρα από το έξυπνο συμβόλαιο! Μπορείτε να βρείτε ένα λεπτομερές παράδειγμα και κώδικα υλοποίησης για αυτήν την ευπάθεια εδώ.
Ένα άλλο κρίσιμο πράγμα που πρέπει να σημειωθεί εδώ είναι ότι η αριθμητική πράξη μεταξύ, ας πούμε, δύο απρόσιτων ακεραίων είναι επίσης ένας ακέραιος χωρίς πρόσημο. Μπορεί να είναι επικίνδυνο εάν αυτό αγνοηθεί στα έξυπνα συμβόλαια, καθώς μπορεί να οδηγήσει σε ανεπιθύμητες παραβιάσεις ασφαλείας!
function votes(uint postId, uint upvote, uint downvotes) { if (upvote - downvote < 0) { deletePost(postId) }
}
Όπως ίσως έχετε παρατηρήσει στο παραπάνω παράδειγμα, η δήλωση if είναι αρκετά άσκοπη upvote - downvote
θα είναι πάντα θετικό. Και η ανάρτηση θα διαγραφεί ακόμα κι αν downvotes
είναι μεγαλύτερη από ό, τι upvotes
. Για να αποφύγετε τέτοιες επιθέσεις, συνιστάται η χρήση έκδοσης μεταγλωττιστή Solidity μεγαλύτερη από 0.8.0.
Επίπτωση:
Ένα νόμισμα που ονομάζεται Κέρμα PoWH κυκλοφόρησε το 2017. Αν και ήταν ένα παιχνίδι Ponzi, το ίδιο παραβιάστηκε λόγω ενός σφάλματος υπερχείλισης αριθμητικής που είχε ως αποτέλεσμα την απώλεια περίπου 866 ETH ή 950,000 $ εκείνη την εποχή. Μπορείτε να διαβάσετε για αυτό λεπτομερώς εδώ.
Πρέπει να διαβάσετε: Μαθήματα από το The Attack On Tinyman, το μεγαλύτερο DEX στο Algorand
Επίθεση άρνησης εξυπηρέτησης
Σενάριο πραγματικού κόσμου:
Φανταστείτε ότι βρίσκεστε σε ένα Πανεπιστήμιο Bitcoin Tech. Όλα φαίνονται καλά εκτός από το ότι υπάρχει ένα κοινό τραπέζι για όλους. Και δυστυχώς, υπάρχουν λίγοι άνθρωποι από άλλη τάξη που καταφέρνουν πάντα να καταλαμβάνουν το τραπέζι πριν από οποιονδήποτε από την τάξη σας.
Στο πρακτικό σενάριο, αρνούνται την ουσιαστική υπηρεσία σε όλους με αποτέλεσμα την απώλεια πολύτιμου χρόνου. Αυτό είναι αυτό που ονομάζουμε «επίθεση άρνησης υπηρεσίας».
Παράδειγμα κώδικα πραγματικού κόσμου:
Στο παιχνίδι που ονομάζεται Βασιλιάς του Αιθέρα, ο καθένας μπορεί να γίνει βασιλιάς. Αλλά ο κανόνας για να γίνει βασιλιάς είναι ότι ένα άτομο πρέπει να καταθέτει περισσότερο αιθέρα από τον σημερινό βασιλιά. Αυτό μπορεί να γίνει καλώντας το claimThrone()
λειτουργία του συμβολαίου του Βασιλιά του Αιθέρα στο οποίο το άτομο στέλνει τον αιθέρα απευθείας στον προηγούμενο βασιλιά και γίνεται ο νέος βασιλιάς.
function claimThrone() external payable { require(msg.value > balance, "Need to pay more to become the king"); (bool sent, ) = king.call{value: balance}(""); require(sent, "Failed to send Ether"); balance = msg.value; king = msg.sender; }
Όπως ίσως μαντέψατε, αυτός ο κώδικας είναι ευάλωτος σε επίθεση DoS, αλλά πώς; Για αυτό, θα πρέπει να καταλάβετε ότι υπάρχουν δύο τύποι διευθύνσεων στο Ethereum - πρώτον είναι ο διεύθυνση ενός εξωτερικού ιδιόκτητο λογαριασμό ή απλά τη διεύθυνση ενός πορτοφολιού, και δεύτερο είναι το διεύθυνση σύμβασης. Τώρα ο αιθέρας μπορεί να σταλεί από οποιονδήποτε από αυτούς τους τύπους διευθύνσεων.
Εάν αυτός ο αιθέρας αποσταλεί από τη διεύθυνση του συμβολαίου, τότε το συμβόλαιο θα γίνει ο βασιλιάς. Ας υποθέσουμε όμως ότι αυτό το νέο συμβόλαιο δεν έχει α fallback()
λειτουργία η οποία είναι απαραίτητη εάν το συμβόλαιο θέλει να δεχθεί αιθέρα. Στη συνέχεια, αν έρθει ένα νέο άτομο και προσπαθήσει να καλέσει το claimThrone()
λειτουργία, πάντα θα αποτυγχάνει!
Σημειώστε ότι αυτό συμβαίνει επίσης εν μέρει επειδή το claimThrone()
Η συνάρτηση ελέγχει ρητά εάν η μεταφορά του αιθέρα ήταν επιτυχής ή όχι στη δεύτερη απαιτούμενη δήλωση. Μπορείτε να βρείτε τον πλήρη κώδικα και να κάνετε μια επίθεση DoS σε αυτόν εδώ.
Είναι επίσης πιθανό ένας κώδικας να είναι ευάλωτος σε επίθεση DoS εάν ο κώδικας έχει βρόχο σε μια σειρά μεγάλων μεγεθών. Αυτό συμβαίνει επειδή το όριο αερίου μπορεί να γίνει υπέρβαση σε τέτοιες περιπτώσεις. Μπορείτε να διαβάσετε σχετικά εδώ.
Επίπτωση:
Ένα παιχνίδι που ονομάζεται Κυβερνητικός, το οποίο ήταν προφανώς ένα σχήμα Ponzi, κόλλησε με 1100 αιθέρα επειδή χρειαζόταν μεγάλη ποσότητα αερίου για την επεξεργασία της πληρωμής.
Ανασφαλής Τυχαιότητα
Σενάριο πραγματικού κόσμου:
Κάποτε ήταν ένας άντρας ονόματι Χέσκι που τον συνόδευε πάντα η μαϊμού του Πέσκι. Ο Hesky διεξήγαγε παιχνίδια λαχειοφόρων αγορών και έκανε καλά κέρδη. Μια μέρα η Άλις παρατήρησε τον Χέσκι να κοιτάζει επίμονα τον πίθηκο του Πέσκι. Μετά τον είδε να γράφει κάτι σε ένα χαρτί και το σφράγισε σε έναν φάκελο. Περίεργη, αποφάσισε να ερευνήσει περαιτέρω.
Αργότερα το ίδιο βράδυ, η Άλις είδε ότι ο νικητής της λοταρίας αποφασιζόταν ανοίγοντας δημόσια τον σφραγισμένο φάκελο. Αφού τον παρακολούθησε για λίγες μέρες, η Άλις κατάλαβε ότι ο Χέσκι αποφάσισε τον νικητήριο αριθμό του λαχείου κοιτάζοντας τις χειρονομίες του Πέσκι (για παράδειγμα, αν ο πίθηκος έξυσε το κεφάλι του, ο Χέσκι έγραψε 10)! Τώρα η Αλίκη είχε τη φόρμουλα για να κερδίσει κάθε λαχείο και έπρεπε απλώς να αγοράσει το λαχείο με τον σωστό αριθμό!
Ο Χέσκι είχε υποθέσει ότι ο «τυχαίος» τρόπος του να αποφασίσει τον νικητή της λαχειοφόρου αγοράς δεν μπορούσε ποτέ να βρεθεί, αλλά ήταν πράγματι λάθος.
Παράδειγμα κώδικα πραγματικού κόσμου:
Σε αυτό το παράδειγμα, δημιουργείται ένας τυχαίος αριθμός με βάση τον κατακερματισμό του συνδυασμού του αριθμού ενός μπλοκ και της χρονικής σφραγίδας του μπλοκ. αυτός ο κατακερματισμός στη συνέχεια εκχωρείται στη μεταβλητή απάντηση. Τώρα όποιος μαντέψει αυτόν τον (φαινομενικά) τυχαίο αριθμό, ανταμείβεται με 1 Αιθέρα. Πιστεύετε ότι αυτό δεν μπορεί να παραβιαστεί;
function guess(uint _guess) public { uint answer = uint( keccak256(abi.encodePacked(blockhash(block.number - 1), block.timestamp)) ); if (_guess == answer) { (bool sent, ) = msg.sender.call{value: 1 ether}(""); require(sent, "Failed to send Ether"); } }
Οχι! Ένας εισβολέας μπορεί ακόμα να μαντέψει αυτόν τον τυχαίο αριθμό απλώς αντιγράφοντας επικολλώντας τον κώδικα για να δημιουργήσει την τιμή που έχει εκχωρηθεί στη μεταβλητή απάντηση και να μεταβιβάσει την ίδια μεταβλητή απάντησης στο guess()
λειτουργία!
guessTheRandomNumber.guess(answer);
Μπορείτε να βρείτε τον πλήρη κωδικό εδώ. Για να αποφύγετε αυτήν την επίθεση, συνιστάται η χρήση μιας επαληθεύσιμης τυχαίας συνάρτησης όπως η VRF Chainlink.
Επίπτωση:
Περίπου 400 ETH χάθηκαν λόγω επίθεσης στο Λοταρία Smart Billions σύμβαση. Παραδόξως, ακόμη και η ίδια η λαχειοφόρος αγορά ήταν ένα σχέδιο Ponzi (ωχ!).
Χειρισμός χρόνου
Σενάριο πραγματικού κόσμου:
Ο Satoshi λατρεύει να τρώει μπισκότα. Λατρεύει όλα τα είδη μπισκότων που φτιάχνει η μητέρα του. Όμως η μητέρα του είναι πολύ αυστηρή και νιώθει ότι το να τρώει πολλά μπισκότα δεν του κάνει καλό. Η μητέρα του λοιπόν βάζει κανόνα ότι θα πάρει τα μπισκότα μόνο στις 8 το βράδυ.
Εκείνη ακριβώς την ημέρα στις 7:45 μ.μ., ο Σατόσι τρέχει στη μητέρα του και ζητά μπισκότα. Η μητέρα του ρωτά: «Τι ώρα είναι;»
«Είναι 8' η ώρα!» – απαντά.
"Εντάξει. Μετά πάρε τα μπισκότα από το ντουλάπι μου».
Και έτσι, ο Satoshi μπόρεσε να χειριστεί το χρόνο με επιτυχία κατά 15 λεπτά, ώστε να μπορεί να πάρει τα μπισκότα του! Τι διψασμένος για μπισκότα αγόρι!
Παράδειγμα κώδικα πραγματικού κόσμου:
Η χρονική σήμανση ενός μπλοκ μπορεί να τροποποιηθεί κατά περίπου 15 δευτερόλεπτα από έναν ανθρακωρύχο. Με αυτόν τον τρόπο, ένας εξορύκτης μπορεί να ορίσει μια ευνοϊκή χρονική σήμανση και να συμπεριλάβει τη συναλλαγή του στο ίδιο μπλοκ που εξορύσσει. Η λειτουργία play()
ανήκει σε ένα συμβόλαιο παιχνιδιού που ονομάζεται G-Dot.
function play() public { require(now > 1640392200 && neverPlayed == true); neverPlayed = false; msg.sender.transfer(1500 ether);
}
Αυτό το συμβόλαιο ανταμείβει 1500 αιθέρες στον παίκτη που είναι ο πρώτος που καλεί τη λειτουργία αναπαραγωγής. Αλλά όπως μπορείτε να δείτε, η συνάρτηση αναπαραγωγής μπορεί να κληθεί μόνο εάν το now ή το block.timestamp της συναλλαγής που περιέχει την κλήση προς το play()
συνάρτηση, είναι μεγαλύτερη από την εποχή εποχής 1640392200.
Ένας εξορύκτης μπορεί εύκολα να χειριστεί αυτή τη χρονική σήμανση και να συμπεριλάβει τη συναλλαγή του για την κλήση του play()
λειτουργεί στο ίδιο μπλοκ έτσι ώστε ο ίδιος να είναι ο πρώτος παίκτης. Με αυτόν τον τρόπο είναι εγγυημένο ότι ο ανθρακωρύχος θα κερδίσει το παιχνίδι!
Επίπτωση:
Το block.timestamp χρησιμοποιήθηκε για τη δημιουργία τυχαίων αριθμών στο Κυβερνητικός και έτσι ήταν ευάλωτος σε επιθέσεις χειραγώγησης χρόνου.
Απευθυνθείτε στο QuillAudits
Το QuillAudits είναι μια ασφαλής πλατφόρμα έξυπνων ελέγχων συμβολαίων που σχεδιάστηκε από QuillHash
Τεχνολογίες.
Πρόκειται για μια πλατφόρμα ελέγχου που αναλύει και επαληθεύει αυστηρά τα έξυπνα συμβόλαια για τον έλεγχο των τρωτών σημείων ασφαλείας μέσω αποτελεσματικής μη αυτόματης αναθεώρησης με εργαλεία στατικής και δυναμικής ανάλυσης, αναλυτές αερίων καθώς και προσομοιωτές. Επιπλέον, η διαδικασία ελέγχου περιλαμβάνει επίσης εκτεταμένες δοκιμές μονάδων καθώς και δομική ανάλυση.
Διενεργούμε τόσο έξυπνους ελέγχους συμβολαίων όσο και δοκιμές διείσδυσης για να βρούμε δυνατότητες
ευπάθειες ασφαλείας που μπορεί να βλάψουν την ακεραιότητα της πλατφόρμας.
Εάν χρειάζεστε βοήθεια στον έλεγχο των έξυπνων συμβολαίων, μη διστάσετε να απευθυνθείτε στους ειδικούς μας εδώ!
Για να είστε ενημερωμένοι με τη δουλειά μας, εγγραφείτε στην κοινότητά μας:-
Twitter | LinkedIn | Facebook | Telegram
Ο ορθοστάτης Οδηγός για αρχάριους για Έξυπνο Έλεγχο Συμβάσεων: Μέρος 1 εμφανίστηκε για πρώτη φορά σε Ιστολόγιο Quillhash.
Πηγή: https://blog.quillhash.com/2022/01/19/beginners-guide-to-smart-contract-auditing-part-1/
- "
- &
- 000
- 2016
- 7
- Σχετικά
- Λογαριασμός
- διεύθυνση
- Όλα
- ήδη
- Αν και
- ανάλυση
- έλεγχος
- αυτονόμος
- Αρχή
- ΚΑΛΎΤΕΡΟΣ
- Bitcoin
- blockchain
- Έντομο
- αγορά
- κλήση
- περιπτώσεις
- έλεγχοι
- κλασικό
- κωδικός
- Κρυπτονόμισμα
- συνδυασμός
- Κοινός
- κοινότητα
- Περιέχει
- σύμβαση
- συμβάσεις
- μπισκότα
- θα μπορούσε να
- δημιουργία
- κρυπτο
- Ρεύμα
- DAO
- ημέρα
- Αποκεντρωμένη
- Denial of Service
- λεπτομέρεια
- Dex
- κάτω
- εύκολα
- τρώνε
- ETH
- Αιθέρας
- ethereum
- Εγκάρσια αλυσίδα
- Ethereum Classic
- παράδειγμα
- Εκμεταλλεύομαι
- τέλος
- Όνομα
- Δωρεάν
- λειτουργία
- παιχνίδι
- Games
- GAS
- παράγουν
- GitHub
- μετάβαση
- καλός
- καθοδηγήσει
- σιδηροπρίονο
- αμυχές
- χασίσι
- κεφάλι
- εδώ
- Πως
- HTTPS
- διερευνήσει
- IT
- Java
- ενταχθούν
- άλμα
- βασιλιάς
- Γλώσσα
- large
- γραμμή
- Μακριά
- κοιτάζοντας
- λαχείο
- άνδρας
- εκατομμύριο
- μητέρα
- αριθμοί
- επιχειρήσεις
- Χαρτί
- πρότυπο
- Πληρωμή
- People
- κομμάτι
- πλατφόρμες
- Δοκιμάστε να παίξετε
- παίχτης
- Ponzi
- Σχέδιο Ponzi
- δύναμη
- διαδικασια μας
- Προγραμματιστές
- Προγραμματισμός
- δημόσιο
- αντιστρέψει
- ανασκόπηση
- Ανταμοιβές
- κανόνες
- Satoshi
- ασφάλεια
- σειρά
- έξυπνος
- έξυπνη σύμβαση
- Έξυπνα συμβόλαια
- So
- στερεότητα
- κάτι
- Γνέθω
- διαίρεση
- ξεκίνησε
- Δήλωση
- Στρατηγική
- επιτυχής
- Επιτυχώς
- tech
- δοκιμές
- Μέσω
- ώρα
- εργαλεία
- συναλλαγή
- unbanked
- πανεπιστήμιο
- ενημερώσεις
- αξία
- Θέματα ευπάθειας
- ευπάθεια
- Ευάλωτες
- Πορτοφόλι
- Τι
- Τροχός
- Ο ΟΠΟΊΟΣ
- νίκη
- Εργασία
- γραφή