Ζούμε στο 2018. Ζούμε στο μέλλον. Μπορούμε να παραγγείλουμε μια πίτσα, να δούμε ζωντανά πως γίνεται και να τη δούμε να έρχεται σπίτι μας. Γιατί λοιπόν δεν μπορούμε να ψηφίσουμε ηλεκτρονικά;

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

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

Έτσι αντ ‘αυτού, οι επιστήμονες των υπολογιστών εφήυραν τις “γλώσσες μηχανής”. Αυτές είναι οι μικροκανονισμοί που αλλάζουν τον δυαδικό κώδικα σε κάτι που είναι τουλάχιστον λίγο πιο κοντά στις γλώσσες που ο άνθρωπος μιλάει. Είναι ακόμα πολύ βασικές, αλλά είναι ένα βήμα κοντύτερα στη σωστή κατεύθυνση. Οι γλώσσες μηχανής βασίζονται σε – και συνδέονται με – το υλικό οποιασδήποτε μηχανής για την οποία έχουν σχεδιαστεί. Έτσι, ενώ δεν μπορείτε να πείτε κάτι εύκολο όπως “προσθέστε 10 και 20 μαζί και εκτυπώστε αυτό το αποτέλεσμα στην οθόνη”, μπορείτε να πείτε “τοποθετήστε την τιμή 10 στο μητρώο ένα, τοποθετήστε την τιμή 20 στο μητρώο δύο, τροφοδοτήστε και τα δύο αυτά μητρώα σε αθροίζοντας τα, και βάζετε την έξοδο στο τρίτο μητρώο και εκτυπώνετε τα περιεχόμενα του μητρώου τρία στην οθόνη.”Στη συνέχεια μεταφράζεται στηη γλώσσα του μηχανήματος – αυτό ονομάζεται  “compile”- στα δυαδικά 1 και 0 που απαιτούνται για την πραγματική εκτέλεση στον υπολογιστή σας .

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

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

Το επόμενο βήμα είναι να αφαιρέσετε το υλικό, έτσι ώστε να μην χρειάζεται να γνωρίζετε την τοποθεσία των “adders” και των “registers”. Εάν δημιουργήσετε έναν αρκετά έξυπνο μεταγλωττιστή, μπορείτε να σχεδιάσετε γλώσσες προγραμματισμού ανεξάρτητες από το μηχάνημα, με πιο αφηρημένες οδηγίες που θα μπορούσαν εύκολα να χειριστούν πράγματα όπως “προσθέστε 10 και 20 μαζί και εκτυπώστε το αποτέλεσμα στην οθόνη.” Στη συνέχεια θα βασιζόταν στον μεταγλωττιστή για να μεταφράσει αυτό στη γλώσσα μηχανής και μετά σε δυαδικό.

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

print 10+20; 

Μήπως τώρα αντιληφθήκατε τον λόγο για τον οποίο δεν μπορείτε να εμπιστευτείτε κανέναν υπολογιστή;

Hint: η αιτία κρύβεται στον compiler.

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

Για παράδειγμα, αν αλλάξω την εντολή “print” έτσι ώστε πάντα να προσθέσετε 1 στους αριθμούς που δώσατε, το πρόγραμμά σας δεν θα τρέξει σωστά – ακόμα κι αν το προγραμματίσατε σωστά. Ποτέ δεν θα βρείτε το σφάλμα απλά κοιτάζοντας τον πηγαίο κώδικα σας, επειδή δεν είναι εκεί όπου είναι το πρόβλημα. Είναι κρυμμένο στον μεταγλωττιστή.

Αυτό το παράδειγμα είναι απλοϊκό και θα το ανιχνεύσετε αρκετά γρήγορα, επειδή το πρόγραμμά σας θα είναι προφανώς κατακερματισμένο. Τι γίνεται όμως αν έκανα κάτι πιο διακριτικό; Τι θα συμβεί αν αντί να μπερδέψω την εντολή “print”, άλλαζα τον μεταγλωττιστή έτσι ώστε όταν εντοπιστεί κώδικας που να περιλαμβάνει κωδικούς πρόσβασης, το έκανε έτσι ώστε ο κωδικός “ryaniscool” να δούλευε επίσης για όλους τους χρήστες;

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

Προφανώς, αυτό είναι ένα πρόβλημα. Και ίσως να σκεφτείτε: “Οι μεταγλωττιστές είναι προγράμματα ηλεκτρονικών υπολογιστών όπως κάθε άλλο πρόγραμμα. Θα μπορούσα να δω τον πηγαίο κώδικα του μεταγλωττιστή μου για να βεβαιωθώ ότι δεν υπάρχει κακόβουλος κώδικας εκεί. Το μόνο που θα έπρεπε να κάνω είναι να βρω το μέρος που μιλά για την προσθήκη του ‘ryaniscool’ ως κωδικό πρόσβασης, να το απομονώσω και θα ήμουν καλά. Σωστά?

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

Εδώ είναι όλα αυτά που πρέπει να κάνω για να εκμεταλλευτώ αυτό:

βήμα 1

Όπως και πριν, θα γράψω κώδικα που προσθέτει το “ryaniscool” ως έγκυρο κωδικό πρόσβασης σε οτιδήποτε μεταγλωττίζεται και θα το βάλω στο μεταγλωττιστή. Σε αυτό το σημείο, προσθέτω μια πίσω πόρτα σε οτιδήποτε μεταγλωττίζει ο μεταγλωττιστής, αλλά θα “με πιάσουν” αν κάποιος κοιτάξει τον πηγαίο κώδικα του μεταγλωττιστή μου. Συνεπώς, συνεχίζω στο Βήμα 2.

βήμα 2

Εγώ γράφω κώδικα για τον μεταγλωττιστή που ανιχνεύει πότε μεταγλωττίζει τον εαυτό του, και όταν συμβαίνει αυτό, προσθέτει τον κώδικα για το βήμα 1 στον μεταγλωττιστή. Τώρα, όταν μεταγλωττίζω τον μεταγλωττιστή, κάνει μια νέα έκδοση του ίδιου που θα προσθέσει στις οδηγίες του μεταγλωττιστή πώς να εισάγει τον κωδικό “ryaniscool” όποτε ο μεταγλωττιστής ξανα-μεταγλωττιστεί. Και για να καλύψω τα νώτα μου, το μόνο που θα έπρεπε να κάνω είναι να αφαιρέσω τις κακόβουλες οδηγίες από τον πηγαίο κώδικα του μεταγλωττιστή και τελείωσα.

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

Ο μόνος τρόπος για να ανιχνεύσετε αυτό το σφάλμα είναι να διαβάσετε τον ίδιο το δυαδικό κώδικα – ένα έργο που καθίσταται κυριολεκτικά αδύνατο καθώς τα προγράμματα είναι ιδιαίτερα περίπλοκα. Τα πλήρη έργα του William Shakespeare έρχονται περίπου στα 6 megabytes. Το πρόγραμμα περιήγησης Firefox απαιτεί μόνο 200 megabytes για να εγκατασταθεί και αυτό είναι μόνο ένα πρόγραμμα στον υπολογιστή σας. Δεν υπάρχει ζωντανός άνθρωπος που έχει διαβάσει όλα τα 200 megabytes αυτού του κώδικα. Δεν είναι καν γραμμένο σε γλώσσα που έχει σχεδιαστεί για να διαβάζουν άνρθρωποι.

Ken Thompson, Menlo Park, California, 2016.

Τίποτα από αυτά δεν είναι νέο. Το 1984, ο Ken Thompson-ο άνθρωπος που σχεδίασε και υλοποίησε το Unix, τον πρόγονο των λειτουργικών συστημάτων που χρησιμοποιούν οι περισσότεροι υπολογιστές και τηλέφωνα, παρουσίασε ένα έγγραφο με τίτλο “Reflections on Trusting Trust” και κατέληξε στο συμπέρασμα αυτό:

“The moral is obvious. You can’t trust code that you did not totally create yourself… No amount of source-level verification or scrutiny will protect you from using untrusted code.”

Με τον όρο “totally create yourself”, ο Ken δεν εννοεί μόνο ένα πρόγραμμα που γράψατε, αλλά να έχετε γράψει τα ΠΑΝΤΑ γύρω από αυτόν. Τη γλώσσα, το μεταγλωττιστή, το συνδέτη, τις βιβλιοθήκες που χρησιμοποείτε και τον ίδιο το κώδικα του προγράμματος, τον επεξεργαστή που βρίσκετε στον υπολογιστή σας, τη RAM, το μαγνητικό δίσκο που αποθηκεύετε τα δεδομένα σας. Πολύ λίγοι άνθρωποι έχουν το χρόνο, τις δεξιότητες και τα χρήματα για να χτίσουν έναν υπολογιστή από το τίποτα, συμπεριλαμβανομένου του συνόλου του λογισμικού σε αυτό. Όλα αυτά φαίνονται να κάνουν την υπόθεση “εμπιστοσύνη σε κάποιον υπολογιστή” μια επιχείρηση αυτοκτονίας.

Και όμως, εμπιστευόμαστε τους υπολογιστές με όλα τα πράγματα. Λοιπόν, γιατί;  

Λοιπόν, για ένα πράγμα, οι υπολογιστές είναι πραγματικά διασκεδαστικοί και βολικοί. Και είναι πρακτικοί με πολλούς τρόπους. Εκτός αυτού, μια υπολογιστική παραβίαση μπορεί να είναι δύσκολο να εκτελεσθεί στην πράξη: Θα χρειαστείτε χρόνο και κίνητρο για να στοχεύσετε κάποιον. Η αλήθεια είναι ότι υπάρχουν πολλές περιπτώσεις όπου δεν χρειάζεστε απόλυτη εμπιστοσύνη στον υπολογιστή σας: Εξάλλου, δεν είναι το τέλος του κόσμου αν κάποιος μπαίνει μέσα και βλέπει την πίτσα μου από το ClickDelivery. Κανένας δεν νοιάζεται αρκετά για να προσπαθήσει να το σπάσει.

Αλλά η ψηφοφορία δεν είναι μία από τις περιπτώσεις αυτές.

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

Please enter your comment!
Please enter your name here

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