Κάθε εβδομάδα, ακούω για ένα νέο και (υποθετικά) ασφαλές λογισμικό που έχει σχεδιαστεί για να προστατεύει την ιδιωτικότητά σας, να παρεμποδίζει την NSA / GCHQ και να σώζει γάτες που έχουν σκαρφαλώσει σε δέντρα. Τις περισσότερες φορές, όμως, τέτοιες δηλώσεις γίνονται από ανθρώπους που είναι πολύ ενθουσιώδεις αλλά ανειδίκευτοι στην σχεδίαση ασφαλών ψηφιακών συστημάτων.

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

Ξοδεύουν το περισσότερο χρόνο τους λέγοντας πράγματα όπως:

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

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

Για να σχεδιαστεί ένα πραγματικά ασφαλές σύστημα χρειάζονται:

  • ανάπτυξη ενός μοντέλου απειλών (threat model design)
  • θεωρητικά εργαλεία για την αντιμετώπιση των εν λόγω απειλών
  • αλγόριθμοι που θα πραγματώσουν τα συγκεκριμένα θεωρητικά εργαλεία

Όπως βλέπετε, τα περισσότερα από τα project που αντιμετωπίζετε στην καθημερινότητά σας έχουν μόνο το τρίτο στοιχείο και αυτό είναι ανεπαρκές για το σχεδιασμό ενός σωστού συστήματος. Αν δεν έχετε καλό μοντέλο απειλής, δεν έχετε καλό πνευματικό μοντέλο για τους χρήστες και τους επιτιθέμενους, τα μέσα και τους στόχους τους. Αν δεν έχετε τα θεωρητικά εργαλεία, θα προσπαθήσετε να “πετάξετε” τον αγαπημένο σας αλγόριθμο στο πρόβλημα χωρίς να ξέρετε αν ταιριάζει πραγματικά (παράδειγμα: χρησιμοποιώντας αλγόριθμους hash για την αποθήκευση κωδικών πρόσβασης).

Πρώτον, πρέπει να ξεχάσετε έννοιες όπως η “ιδιωτικότητα”, ενώ θα πρέπει να χρησιμοποιήσετε οποιονδήποτε από αυτούς τους όρους για να περιγράψετε τις ιδιότητες που θέλετε να επιτύχετε:

  • επαλήθευση ταυτότητας: μπορείτε να αναγνωρίσετε την οντότητα με την οποία επικοινωνείτε
  • εξουσιοδότηση: η οντότητα δεν μπορεί να αποκτήσει πρόσβαση σε δεδομένα στα οποία δεν έχει άδεια (σημειώστε ότι διαφέρει από τον έλεγχο ταυτότητας)
  • εμπιστευτικότητα: τα δεδομένα δεν πρέπει να διαβάζονται από μια οντότητα που δεν έχει καμία εξουσιοδότηση σε αυτήν (μπορεί να προστατευθεί με κρυπτογράφηση, αλλά και με κολπάκια στον κώδικα)
  • ακεραιότητα: η μη εξουσιοδοτημένη τροποποίηση των δεδομένων μπορεί να ανιχνευθεί και να επισημανθεί ως άκυρη
  • μη απόρριψη: μια οντότητα δεν μπορεί να αρνηθεί ότι έχει εκτελέσει μια ενέργεια
  • απόρριψη: μια οντότητα μπορεί να ισχυριστεί ότι δεν πραγματοποίησε αυτή μια ενέργεια

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

Aς δούμε κάποιες ιδέες για το είδος των επιθέσεων που θα μπορούσαν να συμβούν στο σύστημά σας, επειδή πιθανώς δεν σκεφτήκατε τα πάντα. Διαχωρίστε τα συστήματά σας σε λογικά μέρη (όπως “client” και “server”, κ.λπ.), παρατηρήστε τα και σημειώστε πώς επικοινωνούν.

Ακολουθούν ορισμένες ιδιότητες ασφαλείας που θα είναι χρήσιμες όταν θα προσπαθήσετε αργότερα να επιλέξετε αλγορίθμους:

  • Μαντείο των Δελφών: ένα σύστημα που απαντά αποφασιστικά σε κάθε ερώτηση με τυχαία απάντηση από προκαθορισμένες απαντήσεις. Δεν μπορείτε να προβλέψετε τι θα απαντήσει, αλλά αν στείλετε την ίδια ερώτηση δύο φορές, θα απαντήσει το ίδιο και τις δύο φορές.
  • Τέλεια μυστικότητα: για οποαδήποτε δύο μηνύματα plaintext ίδιου μεγέθους, ένας εισβολέας δεν μπορεί να διακρίνει ποιο plaintext αντιστοιχεί σε πιο ciphertext. Βασικά, ο αντίπαλος δεν μαθαίνει τίποτε από το κρυπτοκείμενο κομμάτι.
  • Σημασιολογική ασφάλεια: το ίδιο πράγμα με την τέλεια μυστικότητα, εκτός από το γεγονός πως ό,τι μαθαίνει ο αντίπαλος στο απλό κείμενο, είναι αμελητέο. παράδειγμα: One Time Pad

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

  • Επιθέσεις επανάληψης (replay attacks): ο εισβολέας έχει παρατηρήσει κάποια έγκυρα (κρυπτογραφημένα ή μη) δεδομένα που βρίσκονται στο δίκτυο και προσπαθεί να τα στείλει ξανά. Προφανώς, δεν πρέπει να γίνει αποδεκτό.
  • MITM (Man In The Middle): ο εισβολέας μπορεί να παρατηρήσει και να τροποποιήσει ζωντανά δεδομένα που τρέχουν μεταξύ δύο κόμβων του συστήματος. Στη χειρότερη περίπτωση, ο εισβολέας δεν θα πρέπει να είναι σε θέση να δημιουργήσει έγκυρα δεδομένα, να αποκρυπτογραφήσει δεδομένα ή να μιμηθεί έναν από τους χρήστες. Στην καλύτερη περίπτωση, θα πρέπει να είναι ανιχνεύσιμη.
  • Επίθεση προφήτη (Oracle attack): Όταν ένας αλγόριθμος ή πρωτόκολλο έχει ένα μέρος που μπορεί να λειτουργήσει ως μαντείο (μπορεί να ερωτηθεί κάτι και να δώσει απάντηση, όπως ένας διακομιστής), ένας εισβολέας θα μπορούσε να εκμεταλλευτεί ελαττώματα στον αλγόριθμο για να πάρει χρήσιμες πληροφορίες για τα δεδομένα (τότε δεν είναι τυχαίο μαντείο). Οι επιθέσεις χρονισμού είναι μέρος αυτού του τύπου επίθεσης. Δείτε επίσης επιθέσεις με παρεκκλίσεις στο μαντείο ή την πρόσφατη επίθεση BREACH στο TLS.

Θα πρέπει τώρα να έχετε καλύτερη εικόνα του συστήματος: ποια είναι τα τμήματα του συστήματος που χρειάζονται προστασία, ποιες επιθέσεις πρέπει να αντισταθούν και ποιες ιδιότητες πρέπει να έχουν.

Αυτό σημαίνει ότι μπορούμε να προχωρήσουμε στο επόμενο μέρος: επιλογή των εργαλείων για την υλοποίηση της λύσης. 

Θα επιλέξουμε από μια λίστα κρυπτογραφικών κατασκευών που υλοποιούν μερικές από τις ιδιότητες ασφαλείας του συστήματος που αναφέραμε και θα τις συνδυάζουμε για να καλύψουμε όλες τις απαραίτητες ιδιότητες:

  • Ασφαλής ψευδοτυχαία λειτουργία: λειτουργία από τα διαστήματα K (κλειδιά) και X (μήνυμα) έως Y (άλλο διάστημα μηνυμάτων). Ο βασικός ορισμός είναι ότι αν επιλέξετε τυχαία μία από αυτές τις λειτουργίες (όπως την τυχαία επιλογή ενός k από το K), η παραγωγή της θα εμφανιστεί εντελώς τυχαία (μπορεί να επαληθευτεί με την επίθεση IND-CPA).
  • Ψευδοτυχαία μεταλλαγή: αυτό είναι ένα PRF όπου X και Y είναι ο ίδιος χώρος. Είναι ένα bijective (κάθε y από το Y χαρτώνει ακριβώς ένα x από το X, και κάθε y είναι μια έξοδος της συνάρτησης) και υπάρχει μια αποτελεσματική συνάρτηση αντιστροφής για αυτό (από το Y στο X). Παράδειγμα: AES (στην ΕΚΤ, η οποία δεν είναι ασφαλής για κοινή χρήση)
  • Κωδικός ελέγχου ταυτότητας μηνυμάτων: ορίζει ένα ζεύγος αλγορίθμων. Ένας από αυτούς παίρνει ένα κλειδί k και ένα μήνυμα m και εξάγει έναν κώδικα c. Ο άλλος αλγόριθμος παίρνει k, m, c και εξάγει True ή False. Ένας εισβολέας δεν πρέπει να είναι σε θέση να δημιουργήσει ένα έγκυρο c χωρίς να γνωρίζει το k. Ένα PRF θα μπορούσε να χρησιμοποιηθεί για την κατασκευή ενός συστήματος MAC. Μια λειτουργία κατακερματισμού, επίσης. Παράδειγμα: HMAC
  • Αυστηρή κρυπτογράφηση: μια λειτουργία κρυπτογράφησης (με σημασιολογική ασφάλεια κάτω από την CPA), όπου ο εισβολέας δεν μπορεί να δημιουργήσει νέα κρυπτογραφημένα κείμενα που αποκρυπτογραφούνται σωστά. Παράδειγμα: AES-GCM.
  • Λειτουργία κατακερματισμού: αντίσταση σύγκρουσης (δεν μπορεί να βρει διαφορετικά μηνύματα m1, m2 έτσι ώστε H (m1) == H (m2), με διαφορετικά επίπεδα σύγκρουσης). Δεν είναι εύκολα αντιστρέψιμη. Συνήθως, είναι γρήγορη λύση. Παράδειγμα: SHA2.
  • Trapdoor: μια συνάρτηση που είναι εύκολο να υπολογιστεί, για την οποία η εύρεση του αντίστροφου είναι δύσκολη, εκτός αν έχετε συγκεκριμένες πληροφορίες. (ασφαλές υπό IND-CCA). παραδείγματα: RSA, DSA.
  • Απόδειξη μηδενικής γνώσης: ένας τρόπος να αποδείξουμε κάτι στο άλλο μέλος σε μια επικοινωνία, χωρίς να δώσουμε πληροφορίες, εκτός από την απόδειξη.

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

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

ΑΦΗΣΤΕ ΜΙΑ ΑΠΑΝΤΗΣΗ

Please enter your comment!
Please enter your name here

This site uses Akismet to reduce spam. Learn how your comment data is processed.