Ευπάθεια ρίζας στην εργαλειοθήκη διαχείρισης πακέτων Snap

Η Qualys εντόπισε το τρίτο επικίνδυνο θέμα ευπάθειας φέτος (CVE-2022-3328) στο βοηθητικό πρόγραμμα snap-confine, το οποίο συνοδεύεται από τη σημαία ρίζας SUID και καλείται από τη διαδικασία snapd να δημιουργήσει ένα εκτελέσιμο περιβάλλον για εφαρμογές που διανέμονται σε αυτόνομα πακέτα σε μορφή snap. Η ευπάθεια επιτρέπει σε έναν τοπικό μη προνομιούχο χρήστη να επιτύχει την εκτέλεση κώδικα ως root στην προεπιλεγμένη διαμόρφωση του Ubuntu. Το πρόβλημα διορθώθηκε στην έκδοση snapd 2.57.6. Έχουν κυκλοφορήσει ενημερώσεις πακέτων για όλα τα υποστηριζόμενα υποκαταστήματα του Ubuntu.

Είναι ενδιαφέρον ότι η εν λόγω ευπάθεια εισήχθη κατά τη διαδικασία επιδιόρθωσης μιας παρόμοιας ευπάθειας του Φεβρουαρίου σε snap-confine. Οι ερευνητές μπόρεσαν να προετοιμάσουν ένα λειτουργικό exploit που παρέχει πρόσβαση root στον διακομιστή Ubuntu 22.04, ο οποίος, εκτός από την ευπάθεια στο snap-confine, περιλαμβάνει επίσης δύο τρωτά σημεία στη διαδικασία πολλαπλών διαδρομών (CVE-2022-41974, CVE-2022-41973) , που σχετίζεται με την παράκαμψη του ελέγχου εξουσιοδότησης κατά τη μετάδοση προνομιακών εντολών και την μη ασφαλή εργασία με συμβολικούς συνδέσμους.

Η ευπάθεια στο snap-confine προκαλείται από μια συνθήκη κούρσας στη συνάρτηση must_mkdir_and_open_with_perms(), που προστέθηκε για προστασία από την αντικατάσταση του καταλόγου /tmp/snap.$SNAP_NAME με έναν συμβολικό σύνδεσμο μετά τον έλεγχο του ιδιοκτήτη, αλλά πριν καλέσετε το σύστημα προσάρτησης κλήση για σύνδεση-προσάρτηση καταλόγων σε αυτό για ένα πακέτο σε μορφή snap. Η προστιθέμενη προστασία ήταν να μετονομάσετε τον κατάλογο /tmp/snap.$SNAP_NAME σε άλλον κατάλογο στο /tmp με τυχαίο όνομα, εάν υπάρχει και δεν ανήκει στον root.

Κατά την εκμετάλλευση της λειτουργίας μετονομασίας καταλόγου /tmp/snap.$SNAP_NAME, οι ερευνητές εκμεταλλεύτηκαν το γεγονός ότι το snap-confine δημιουργεί επίσης έναν κατάλογο /tmp/snap.rootfs_XXXXXX για τη ρίζα των περιεχομένων του πακέτου snap. Το τμήμα "XXXXXX" του ονόματος επιλέγεται τυχαία από το mkdtemp(), αλλά ένα πακέτο με το όνομα "rootfs_XXXXXX" μπορεί να επικυρωθεί στη συνάρτηση sc_instance_name_validate (δηλ. η ιδέα είναι ότι το $SNAP_NAME θα οριστεί σε "rootfs_XXXXXX" και στη συνέχεια η λειτουργία μετονομασίας θα έχει ως αποτέλεσμα την αντικατάσταση του καταλόγου /tmp/snap.rootfs_XXXXXX με το root snap).

Για να επιτευχθεί ταυτόχρονη χρήση του /tmp/snap.rootfs_XXXXXX και μετονομασία του /tmp/snap.$SNAP_NAME, κυκλοφόρησαν δύο περιπτώσεις snap-confine. Μόλις η πρώτη παρουσία δημιουργούσε το /tmp/snap.rootfs_XXXXXX, η διαδικασία θα αποκλειστεί και μια δεύτερη παρουσία θα ξεκινούσε με το όνομα πακέτου rootfs_XXXXXX, με αποτέλεσμα ο προσωρινός κατάλογος /tmp/snap.$SNAP_NAME της δεύτερης παρουσίας να γίνει ο ριζικός κατάλογος /tmp/snap .rootfs_XXXXXX του πρώτου. Αμέσως μετά την ολοκλήρωση της μετονομασίας, η δεύτερη παρουσία διακόπηκε και το /tmp/snap.rootfs_XXXXXX αντικαταστάθηκε με χειραγώγηση συνθηκών φυλής, όπως κατά την εκμετάλλευση της ευπάθειας του Φεβρουαρίου. Μετά την αντικατάσταση, το κλείδωμα εκτέλεσης αφαιρέθηκε από την πρώτη περίπτωση και οι εισβολείς απέκτησαν τον πλήρη έλεγχο του ριζικού καταλόγου snap.

Το τελευταίο βήμα ήταν η δημιουργία ενός συμβολικού συνδέσμου /tmp/snap.rootfs_XXXXXX/tmp, ο οποίος χρησιμοποιήθηκε από τη συνάρτηση sc_bootstrap_mount_namespace() για τη δέσμευση-προσάρτηση του εγγράψιμου πραγματικού καταλόγου /tmp σε οποιονδήποτε κατάλογο στο σύστημα αρχείων, αφού η κλήση mount() ακολουθεί συμβολικούς συνδέσμους πριν από την τοποθέτηση. Μια τέτοια τοποθέτηση αποκλείεται από περιορισμούς AppArmor, αλλά για να παρακάμψει αυτό το μπλοκ, το exploit χρησιμοποίησε δύο βοηθητικά τρωτά σημεία σε multipathd.

Πηγή: opennet.ru

Προσθέστε ένα σχόλιο