Ένας ερευνητής ανακάλυψε μια νέα ευπάθεια που ονομάζεται "Dirty_Sock" στο REST API για το snapd deamon της Canonical που μπορεί να επιτρέψει στους επιτιθέμενους να αποκτήσουν root access σε μηχανές Linux.
Για να καταδείξει πώς μπορούν να αξιοποιηθούν αυτές οι ευπάθειες, ο ερευνητής έχει κυκλοφορήσει proof of concepts που χρησιμοποιούν διαφορετικές μεθόδους γιανα πραγματοποιήσουν το privilege escalation.
Καθώς αυτά τα socket τρέχουν κάτω από το περιβάλλον ασφαλείας του root user, άρχισε να ψάχνει για μεθόδους του API που θα μπορούσαν να επωφεληθούν από αυτά τα δικαιώματα και να αυξήσουν τα προνόμια του στο server.
Κατά την ανάλυση του API, ο Moberly ανακάλυψε ότι είναι δυνατό να δημιουργηθεί ένας τοπικός λογαριασμός χρήστη χρησιμοποιώντας την εντολή του API
Όταν ανέλυσε τον τρόπο με τον οποίο το snapd καθορίζει αν ένας χρήστης έχει δικαιώματα root, είδε ότι δημιουργεί μια συμβολοσειρά που αποτελείται από το pid, το uid του προγράμματος που είναι συνδεδεμένο στο sοcket , το path του socket και το remoteAddr. Για παράδειγμα, μια σύνθετη συμβολοσειρά θα είναι κάπως έτσι:
Κάθε τμήμα αυτής της συμβολοσειράς διαιρείται στο ";" και αντιστοιχείται σε διάφορες μεταβλητές. Χρησιμοποιώντας το παραπάνω παράδειγμα, η μεταβλητή uid θα οριστεί στο 1000 και όχι στο 0 και έτσι δεν θα είναι σε θέση να εκτελέσει την εντολή δημιουργίας-χρήστη, καθώς όπως προαναφέραμε χρειάζεται root access (uid =0) .
Ωστόσο, ο Moberly έμαθε ότι το τμήμα @ της συμβολοσειράς αντιπροσωπεύει το RemoteAddr του socket με το οποίο επικοινωνεί το snapd.
Αυτό του επέτρεψε να δημιουργήσει ένα socket που περιέχει: uid = 0; στο όνομά του, όπως φαίνεται παρακάτω, που θα αντικαταστήσει τότε το uid όταν η συμβολοσειρά περάσει.
Όπως μπορείτε να δείτε παρακάτω, όταν τρέχετε τον παραπάνω κώδικα η σειρά @ έχει αντικατασταθεί από το uid = 0;
Όταν το snapd αναλύει τη συμβολοσειρά, καθώς το uid = 0 είναι το τελευταίο μέρος, θα αντικαταστήσει το προηγούμενο uid και θα ξεγελάσει το snapd να σκεφτεί ότι καλείται από τον χρήστη root και θα επιτρέπει σε έναν τοπικό χρήστη να δημιουργηθεί.
Για να καταδείξει πώς μπορούν να αξιοποιηθούν αυτές οι ευπάθειες, ο ερευνητής έχει κυκλοφορήσει proof of concepts που χρησιμοποιούν διαφορετικές μεθόδους γιανα πραγματοποιήσουν το privilege escalation.
Το σφάλμα στο REST API που οδηγεί στο privilege escalation
Κατά την ανάλυση της εγκατάστασης του snapd στο Ubuntu, ο Moberly ανακάλυψε ότι ο deamon χρησιμοποιεί UNIX sockets για να επιτρέπει στους προγραμματιστές να επικοινωνούν μαζί του χρησιμοποιώντας το REST API.
Καθώς αυτά τα socket τρέχουν κάτω από το περιβάλλον ασφαλείας του root user, άρχισε να ψάχνει για μεθόδους του API που θα μπορούσαν να επωφεληθούν από αυτά τα δικαιώματα και να αυξήσουν τα προνόμια του στο server.
Κατά την ανάλυση του API, ο Moberly ανακάλυψε ότι είναι δυνατό να δημιουργηθεί ένας τοπικός λογαριασμός χρήστη χρησιμοποιώντας την εντολή του API
"POST / v2 / create-user"
του deamon. Αυτή η εντολή API, ωστόσο, απαιτεί από το πρόγραμμα να έχει άδεια root ή uid = 0, προκειμένου να δημιουργήσει έναν χρήστη.Όταν ανέλυσε τον τρόπο με τον οποίο το snapd καθορίζει αν ένας χρήστης έχει δικαιώματα root, είδε ότι δημιουργεί μια συμβολοσειρά που αποτελείται από το pid, το uid του προγράμματος που είναι συνδεδεμένο στο sοcket , το path του socket και το remoteAddr. Για παράδειγμα, μια σύνθετη συμβολοσειρά θα είναι κάπως έτσι:
pid=5127;uid=1000;socket=/run/snapd.socket;@ .
Κάθε τμήμα αυτής της συμβολοσειράς διαιρείται στο ";" και αντιστοιχείται σε διάφορες μεταβλητές. Χρησιμοποιώντας το παραπάνω παράδειγμα, η μεταβλητή uid θα οριστεί στο 1000 και όχι στο 0 και έτσι δεν θα είναι σε θέση να εκτελέσει την εντολή δημιουργίας-χρήστη, καθώς όπως προαναφέραμε χρειάζεται root access (uid =0) .
Ωστόσο, ο Moberly έμαθε ότι το τμήμα @ της συμβολοσειράς αντιπροσωπεύει το RemoteAddr του socket με το οποίο επικοινωνεί το snapd.
Αυτό του επέτρεψε να δημιουργήσει ένα socket που περιέχει: uid = 0; στο όνομά του, όπως φαίνεται παρακάτω, που θα αντικαταστήσει τότε το uid όταν η συμβολοσειρά περάσει.
Όπως μπορείτε να δείτε παρακάτω, όταν τρέχετε τον παραπάνω κώδικα η σειρά @ έχει αντικατασταθεί από το uid = 0;
Όταν το snapd αναλύει τη συμβολοσειρά, καθώς το uid = 0 είναι το τελευταίο μέρος, θα αντικαταστήσει το προηγούμενο uid και θα ξεγελάσει το snapd να σκεφτεί ότι καλείται από τον χρήστη root και θα επιτρέπει σε έναν τοπικό χρήστη να δημιουργηθεί.
Σχόλια
Δημοσίευση σχολίου
Ευχαριστούμε για την αποψή σας! Εκτιμούμε το γεγονός πως αφιερώσατε χρόνο για να την καταθέσετε!