Κρίσιμη ευπάθεια στο Exim που επιτρέπει την εκτέλεση κώδικα στον διακομιστή με δικαιώματα root

Στον διακομιστή αλληλογραφίας Exim αναγνωρισθείς κρίσιμος τρωτό (CVE-2019-10149), το οποίο μπορεί να οδηγήσει σε απομακρυσμένη εκτέλεση κώδικα στον διακομιστή με δικαιώματα ρίζας κατά την επεξεργασία ενός ειδικά διαμορφωμένου αιτήματος. Η δυνατότητα εκμετάλλευσης του προβλήματος σημειώθηκε σε εκδόσεις από 4.87 έως 4.91 συμπεριλαμβανομένων ή κατά την κατασκευή με την επιλογή EXPERIMENTAL_EVENT.

Στην προεπιλεγμένη διαμόρφωση, η επίθεση μπορεί να πραγματοποιηθεί χωρίς περιττές επιπλοκές από έναν τοπικό χρήστη, αφού εφαρμόζεται το ACL "verify = παραλήπτης", το οποίο εκτελεί πρόσθετους ελέγχους για εξωτερικές διευθύνσεις. Μια απομακρυσμένη επίθεση μπορεί να συμβεί όταν αλλάζουν οι ρυθμίσεις, όπως η λειτουργία ως δευτερεύον MX για έναν άλλο τομέα, η κατάργηση του ACL "verify=recipient" ή ορισμένες αλλαγές στο επίθημα local_part_suffix). Μια απομακρυσμένη επίθεση είναι επίσης δυνατή εάν ο εισβολέας μπορεί να διατηρήσει τη σύνδεση με τον διακομιστή ανοιχτή για 7 ημέρες (για παράδειγμα, στέλνοντας ένα byte ανά λεπτό για να παρακάμψει ένα χρονικό όριο λήξης). Ταυτόχρονα, είναι πιθανό να υπάρχουν απλούστερα διανύσματα επίθεσης για απομακρυσμένη εκμετάλλευση του προβλήματος.

Η ευπάθεια προκαλείται από εσφαλμένη επαλήθευση της διεύθυνσης του παραλήπτη στη συνάρτηση deliver_message() που ορίζεται στο αρχείο /src/deliver.c. Με το χειρισμό της μορφοποίησης της διεύθυνσης, ένας εισβολέας μπορεί να επιτύχει την αντικατάσταση των δεδομένων του στα ορίσματα μιας εντολής που καλείται μέσω της συνάρτησης execv() με δικαιώματα ρίζας. Η λειτουργία δεν απαιτεί τη χρήση πολύπλοκων τεχνικών που χρησιμοποιούνται για υπερχείλιση buffer ή καταστροφή της μνήμης αρκεί η απλή αντικατάσταση χαρακτήρων.

Το πρόβλημα σχετίζεται με τη χρήση της κατασκευής για τη μετατροπή διευθύνσεων:

deliver_localpart = expand_string(
string_sprintf("${local_part:%s}", new->address));
deliver_domain = expand_string(
string_sprintf("${domain:%s}", new->address));

Η συνάρτηση expand_string() είναι ένας πολύπλοκος συνδυασμός, συμπεριλαμβανομένης της αναγνώρισης της εντολής "${run{command ορίσματα}", η οποία οδηγεί στην εκκίνηση ενός εξωτερικού χειριστή. Έτσι, για να επιτεθεί σε μια περίοδο λειτουργίας SMTP, ένας τοπικός χρήστης χρειάζεται μόνο να στείλει μια εντολή όπως "RCPT TO "username+${run{...}}@localhost"", όπου ο localhost είναι ένας από τους κεντρικούς υπολογιστές από τη λίστα local_domains, και όνομα χρήστη είναι το όνομα ενός υπάρχοντος τοπικού χρήστη.

Εάν ο διακομιστής λειτουργεί ως αναμετάδοση αλληλογραφίας, αρκεί να στείλετε εξ αποστάσεως την εντολή 'RCPT ΣΤΟ "${run{...}}@relaydomain.com"', όπου το relaydomain.com είναι ένας από τους κεντρικούς υπολογιστές που αναφέρονται στο relay_to_domains ενότητα ρυθμίσεων. Εφόσον το Exim δεν ορίζει από προεπιλογή την απόρριψη της λειτουργίας προνομίου (deliver_drop_privilege = false), οι εντολές που περνούν μέσω του "${run{...}}" θα εκτελούνται ως root.

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

Μια επιδιόρθωση για προηγούμενες εκδόσεις που συνεχίζουν να χρησιμοποιούνται σε διανομές είναι προς το παρόν διαθέσιμη μόνο ως κηλίδα. Διορθωτικές εκδόσεις για προηγούμενα υποκαταστήματα για την επίλυση του προβλήματος έχουν προγραμματιστεί για τις 11 Ιουνίου. Οι ενημερώσεις πακέτων είναι έτοιμες Debian, Ubuntu, openSUSE. Arch Linux и Μαλακό καπέλλο Παρέχουν την έκδοση 4.92, στην οποία το πρόβλημα δεν εμφανίζεται. Πρόβλημα RHEL και CentOS ανεπίδεκτος, αφού το Exim δεν περιλαμβάνεται στο τυπικό αποθετήριο πακέτων.

Πηγή: opennet.ru

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