Ευπάθεια στην τυπική βιβλιοθήκη Rust

Εντοπίστηκε ένα θέμα ευπάθειας (CVE-2022-21658) στην τυπική βιβλιοθήκη Rust λόγω μιας συνθήκης αγώνα στη συνάρτηση std::fs::remove_dir_all(). Εάν αυτή η λειτουργία χρησιμοποιείται για τη διαγραφή προσωρινών αρχείων σε μια προνομιακή εφαρμογή, ένας εισβολέας μπορεί να επιτύχει τη διαγραφή αυθαίρετων αρχείων συστήματος και καταλόγων που ο εισβολέας δεν θα είχε κανονικά πρόσβαση να διαγράψει.

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

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

Επηρεάζονται όλες οι εκδόσεις του Rust από 1.0.0 έως 1.58.0. Το ζήτημα έχει επιδιορθωθεί σε μορφή ενημέρωσης κώδικα προς το παρόν (η επιδιόρθωση θα συμπεριληφθεί στην έκδοση 1.58.1, η οποία αναμένεται εντός λίγων ωρών). Μπορείτε να παρακολουθήσετε την εξάλειψη της ευπάθειας στις διανομές σε αυτές τις σελίδες: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch, FreeBSD. Όλοι οι χρήστες προγραμμάτων Rust που εκτελούνται με αυξημένα δικαιώματα και χρησιμοποιούν τη συνάρτηση remove_dir_all συνιστάται να ενημερώσουν επειγόντως το Rust στην έκδοση 1.58.1. Είναι ενδιαφέρον ότι η ενημέρωση κώδικα που κυκλοφόρησε δεν λύνει το πρόβλημα σε όλα τα συστήματα. Για παράδειγμα, στο REDOX OS και στις εκδόσεις του macOS πριν από την 10.10 (Yosemite), η ευπάθεια δεν είναι αποκλεισμένη λόγω της απουσίας της σημαίας O_NOFOLLOW, η οποία απενεργοποιεί τα ακόλουθα συμβολικά συνδέσεις.

Πηγή: opennet.ru

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