Ερευνητές ασφαλείας από την Qualys
Το πρόβλημα προκαλείται από μια υπερχείλιση ακέραιου αριθμού στη συνάρτηση stralloc_readyplus(), η οποία μπορεί να προκύψει κατά την επεξεργασία ενός πολύ μεγάλου μηνύματος. Η λειτουργία απαιτούσε ένα σύστημα 64-bit με περισσότερα από 4 GB εικονικής μνήμης. Όταν η ευπάθεια αναλύθηκε αρχικά το 2005, ο Daniel J. Bernstein υποστήριξε ότι η υπόθεση στον κώδικα ότι το μέγεθος του εκχωρημένου πίνακα είναι πάντα εντός της τιμής των 32 bit βασίζεται στο γεγονός ότι κανείς δεν παρέχει gigabyte μνήμης σε κάθε διεργασία. Τα τελευταία 15 χρόνια, τα συστήματα 64 bit σε διακομιστές έχουν αντικαταστήσει τα συστήματα 32 bit και η ποσότητα της παρεχόμενης μνήμης και το εύρος ζώνης δικτύου έχουν αυξηθεί δραματικά.
Οι συντηρητές πακέτων qmail έλαβαν υπόψη τη σημείωση του Bernstein και περιόρισαν τη διαθέσιμη μνήμη κατά την εκκίνηση της διαδικασίας qmail-smtpd (για παράδειγμα, στο Debian 10 το όριο έχει οριστεί στα 7MB). Αλλά οι μηχανικοί από την Qualys διαπίστωσαν ότι αυτό δεν είναι αρκετό και, εκτός από το qmail-smtpd, μπορεί να πραγματοποιηθεί μια απομακρυσμένη επίθεση στην τοπική διαδικασία qmail, η οποία παρέμεινε απεριόριστη σε όλα τα δοκιμασμένα πακέτα. Ως απόδειξη, ετοιμάστηκε ένα πρωτότυπο exploit που ήταν κατάλληλο για επίθεση στο πακέτο του Debian με το qmail στην προεπιλεγμένη διαμόρφωση.
Για να οργανώσει την απομακρυσμένη εκτέλεση κώδικα κατά τη διάρκεια μιας επίθεσης, ο διακομιστής απαιτεί 4 GB ελεύθερου χώρου στο δίσκο και 8 GB μνήμης RAM.
Το exploit σάς επιτρέπει να εκτελείτε οποιεσδήποτε εντολές φλοιού με τα δικαιώματα οποιουδήποτε χρήστη στο σύστημα, εκτός από χρήστες root και συστήματος που δεν έχουν δικό τους υποκατάλογο στον κατάλογο "/home" (η διαδικασία qmail-local εκκινείται με τα δικαιώματα του τοπικού χρήστη στον οποίο πραγματοποιείται η παράδοση).
Η επίθεση εκτελείται
μέσω της αποστολής ενός πολύ μεγάλου μηνύματος αλληλογραφίας, συμπεριλαμβανομένων πολλών γραμμών κεφαλίδας, μεγέθους περίπου 4 GB και 576 MB. Η επεξεργασία μιας τέτοιας συμβολοσειράς στο qmail-local έχει ως αποτέλεσμα μια υπερχείλιση ακέραιου αριθμού κατά την προσπάθεια παράδοσης ενός μηνύματος στον τοπικό χρήστη. Στη συνέχεια, μια υπερχείλιση ακέραιου αριθμού οδηγεί σε υπερχείλιση buffer κατά την αντιγραφή δεδομένων και τη δυνατότητα αντικατάστασης σελίδων μνήμης με κώδικα libc. Με τον χειρισμό της διάταξης των μεταδιδόμενων δεδομένων, είναι επίσης δυνατό να ξαναγραφεί η διεύθυνση της συνάρτησης «open()», αντικαθιστώντας τη με τη διεύθυνση της συνάρτησης «system()».
Στη συνέχεια, στη διαδικασία κλήσης της qmesearch() στο qmail-local, ανοίγει το αρχείο ".qmail-extension" μέσω της συνάρτησης open(), η οποία οδηγεί στην πραγματική εκτέλεση της συνάρτησης
system(".qmail-επέκταση"). Αλλά επειδή το τμήμα "επέκταση" του αρχείου δημιουργείται με βάση τη διεύθυνση του παραλήπτη (για παράδειγμα, "localuser-extension@localdomain"), οι εισβολείς μπορούν να κανονίσουν την αποστολή της εντολής για εκτέλεση καθορίζοντας τον χρήστη "localuser-;εντολή" ;@localdomain" ως παραλήπτης του μηνύματος.
Κατά την ανάλυση κώδικα, εντοπίστηκαν επίσης δύο τρωτά σημεία στην πρόσθετη ενημέρωση κώδικα qmail-verify, η οποία αποτελεί μέρος του πακέτου για το Debian. Πρώτη ευπάθεια (
Για να επιλύσετε το πρόβλημα, ο Bernstein συνέστησε την εκτέλεση διεργασιών qmail με συνολικό όριο στη διαθέσιμη μνήμη (“softlimit -m12345678”), οπότε το πρόβλημα αποκλείεται. Ως εναλλακτική μέθοδος προστασίας αναφέρεται επίσης ο περιορισμός του μέγιστου μεγέθους του επεξεργασμένου μηνύματος μέσω του αρχείου «control/databytes» (από προεπιλογή δεν δημιουργείται με προεπιλεγμένες ρυθμίσεις το qmail παραμένει ευάλωτο). Επιπλέον, το "control/databytes" δεν προστατεύει από τοπικές επιθέσεις από χρήστες του συστήματος, αφού το όριο λαμβάνεται υπόψη μόνο στο qmail-smtpd.
Το πρόβλημα επηρεάζει το πακέτο
Πηγή: opennet.ru