Μετάβαση στο κύριο περιεχόμενο
Υποστήριξη
Είσοδος με Microsoft
Είσοδος ή δημιουργία λογαριασμού.
Γεια σας,
Επιλέξτε διαφορετικό λογαριασμό.
Έχετε πολλούς λογαριασμούς
Επιλέξτε τον λογαριασμό με τον οποίο θέλετε να εισέλθετε.

Η υποστήριξη για το Windows Vista Service Pack 1 (SP1) λήγει στις 12 Ιουλίου 2011. Για να συνεχίσετε να λαμβάνετε ενημερώσεις ασφαλείας για τα Windows, βεβαιωθείτε ότι χρησιμοποιείτε τα Windows Vista με Service Pack 2 (SP2). Για περισσότερες πληροφορίες, ανατρέξτε σε αυτή την ιστοσελίδα της Microsoft: Η υποστήριξη για ορισμένες εκδόσεις των Windows λήγει.

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

Σύνοψη

Περιγραφή των επιθέσεις προφόρτωσης DLL

Επιθέσεις βάσει LoadLibrary

Όταν μια εφαρμογή φορτώνει δυναμικά ένα αρχείο DLL χωρίς να καθορίσει μια πλήρως προσδιορισημένη διαδρομή, τα Windows προσπαθούν να εντοπίσουν αυτό το αρχείο DLL κάνοντας γραμμική αναζήτηση μέσα σε ένα σαφώς καθορισμένο σύνολο καταλόγων, γνωστό ως ΣΕΙΡΆ αναζήτησης DLL. Εάν τα Windows εντοπίσουν τη βιβλιοθήκη DLL στη σειρά αναζήτησης DLL, θα φορτώσει τη βιβλιοθήκη DLL. Ωστόσο, εάν τα Windows δεν εντοπίσουν τη βιβλιοθήκη DLL σε κάποιον από τους καταλόγους της σειράς αναζήτησης DLL, θα επιστρέψει μια αποτυχία στη λειτουργία φόρτωσης DLL. Ακολουθεί η σειρά αναζήτησης DLL για τις συναρτήσεις LoadLibraryκαι LoadLibraryEx,οι οποίες χρησιμοποιούνται για τη δυναμική φόρτωση DLL:

  1. Ο κατάλογος από τον οποίο έχει φορτωθεί η εφαρμογή

  2. Ο κατάλογος συστήματος

  3. Ο κατάλογος συστήματος 16 bit

  4. Ο κατάλογος των Windows

  5. Ο τρέχων κατάλογος εργασίας (CWD)

  6. Οι κατάλογοι που παρατίθενται στη μεταβλητή περιβάλλοντος PATH



Εξετάστε το ακόλουθο σενάριο:


  • Μια εφαρμογή φορτώνει ένα αρχείο DLL χωρίς να καθορίσει μια πλήρως προσδιορισθείσα διαδρομή που αναμένει να βρει στην CWD της εφαρμογής.

  • Η εφαρμογή είναι πλήρως έτοιμη να χειριστεί την περίπτωση όταν δεν βρει τη βιβλιοθήκη DLL.

  • Ο εισβολέας γνωρίζει αυτές τις πληροφορίες σχετικά με την εφαρμογή και ελέγχει το CWD.

  • Ο εισβολέας αντιγράφει τη δική του ειδικά σχεδιασμένη έκδοση της βιβλιοθήκης DLL στο CWD. Αυτό προϋποθέτει ότι ο εισβολέας έχει δικαιώματα για να το κάνει αυτό.

  • Τα Windows αναζητούν τους καταλόγους στη σειρά αναζήτησης DLL και βρίσκουν τη βιβλιοθήκη DLL στη βιβλιοθήκη αρχείων CWD της εφαρμογής.

Σε αυτό το σενάριο, το ειδικά δημιουργημένο DLL εκτελείται μέσα στην εφαρμογή και αποκτά τα δικαιώματα του τρέχοντος χρήστη.

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



Γνωρίζουμε επίσης ότι ορισμένοι προγραμματιστές χρησιμοποιούν τη δυνατότητα LoadLibrary για να επαληθεύσουν εάν υπάρχει ένα συγκεκριμένο αρχείο DLL, προκειμένου να προσδιορίσουν ποια έκδοση των Windows εκτελείται από το χρήστη. Θα πρέπει να γνωρίζετε ότι αυτό μπορεί να κάνει την εφαρμογή ευάλωτη. Εάν η βιβλιοθήκη που επηρεάζεται πράγματι δεν υπάρχει στην έκδοση των Windows στην οποία εκτελείται η εφαρμογή, ένας εισβολέας θα μπορούσε να εισαγάγει μια βιβλιοθήκη με το ίδιο όνομα στο CWD. Συνιστάται ιδιαίτερα η χρήση αυτής της τεχνικής. Αντί για αυτό, χρησιμοποιήστε τις προτεινόμενες τεχνικές που περιγράφονται στο άρθρο "MSDN", "Λήψη της έκδοσης συστήματος".

Μια εφαρμογή που φορτώνει προσθήκες τρίτων και που δεν μπορεί να επιβάλει στις προσθήκες να χρησιμοποιήσουν μια κατάλληλη διαδρομή για τις κλήσεις LoadLibrary θα πρέπει να καλέσει τον κατάλογο SetDllDirectory("") για να καταργήσει το CWD και, στη συνέχεια, να καλέσει την Υπηρεσία καταλόγου SetDllDirectory("τοποθεσία εγκατάστασης προσθήκης") για να προσθέσει τον κατάλογο εγκατάστασης της προσθήκης στη διαδρομή αναζήτησης DLL.

Επιθέσεις που βασίζονται στο SearchPath

Παρόμοια επίθεση υπάρχει όταν μια εφαρμογή χρησιμοποιεί το API του SearchPath για να εντοπίσει μια βιβλιοθήκη DLL και να φορτώσει δυναμικά τη διαδρομή που επιστρέφεται από το SearchPath. Ακολουθεί η προεπιλεγμένη σειρά αναζήτησης για το API του SearchPath:

  • Ο κατάλογος από τον οποίο έχει φορτωθεί η εφαρμογή

  • Ο τρέχων κατάλογος εργασίας (CWD)

  • Ο κατάλογος συστήματος

  • Ο κατάλογος συστήματος 16 bit

  • Ο κατάλογος των Windows

  • Οι κατάλογοι που παρατίθενται στη μεταβλητή περιβάλλοντος PATH

Δεν συνιστάται αυτό το μοτίβο, επειδή δεν είναι ασφαλές. Δεν συνιστάται η συνάρτηση SearchPath ως μέθοδος εντοπισμού ενός αρχείου .dll, εάν η επιδιωκόμενη χρήση του αποτελέσματος είναι σε μια κλήση με τη συνάρτηση LoadLibrary. Αυτό μπορεί να έχει ως αποτέλεσμα τον εντοπισμό εσφαλμένου αρχείου .dll, επειδή η σειρά αναζήτησης της συνάρτησης SearchPath διαφέρει από τη σειρά αναζήτησης που χρησιμοποιείται από τη συνάρτηση LoadLibrary. Εάν πρέπει να εντοπίσετε και να φορτώσετε ένα αρχείο .dll, χρησιμοποιήστε τη συνάρτηση LoadLibrary.

ShellExecute και CreateProcess


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

Προτεινόμενα βήματα για προγραμματιστές λογισμικού

Συνιστάται στους προγραμματιστές να κάνουν τα εξής:

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

    • Η χρήση του SearchPath για τον προσδιορισμό της θέσης μιας βιβλιοθήκης ή στοιχείου.

    • Η χρήση της LoadLibrary για τον προσδιορισμό της έκδοσης του λειτουργικού συστήματος.

  • Χρησιμοποιήστε πλήρως προσδιορισμενές διαδρομές για όλες τις κλήσεις προς LoadLibrary, CreateProcess και ShellExecute όπου μπορείτε.

  • Εφαρμόστε κλήσεις στην υπηρεσία καταλόγου SetDll με μια κενή συμβολοσειρά ("") για να καταργήσετε τον τρέχοντα κατάλογο εργασίας από την προεπιλεγμένη σειρά αναζήτησης DLL όπου απαιτείται. Πρέπει να γνωρίζετε ότι η κατεύθυνση SetDll επηρεάζει ολόκληρη τη διαδικασία. Επομένως, αυτό πρέπει να το κάνετε μία φορά νωρίτερα στην προετοιμασία της διαδικασίας και όχι πριν και μετά τις κλήσεις στο LoadLibrary. Επειδή η κατεύθυνση SetDll επηρεάζει ολόκληρη τη διαδικασία, πολλά νήματα που καλούν την κατεύθυνση SetDll με διαφορετικές τιμές θα μπορούσαν να προκαλέσουν απροσδιόριστη συμπεριφορά. Επιπλέον, εάν η διαδικασία έχει σχεδιαστεί για τη φόρτωση DLL τρίτων κατασκευαστών, θα χρειαστεί έλεγχος για να προσδιοριστεί εάν η πραγματοποίηση μιας ρύθμισης σε επίπεδο διεργασίας θα προκαλέσει ασυμβατότητες. Ένα γνωστό πρόβλημα είναι ότι όταν μια εφαρμογή εξαρτάται από τη Visual Basic for Applications, μια ρύθμιση σε επίπεδο διεργασίας μπορεί να προκαλέσει ασυμβατότητες.

  • Χρησιμοποιήστε τη συνάρτηση SetSearchPathModeγια να ενεργοποιήσετε τη λειτουργία αναζήτησης ασφαλούς διεργασίας για τη διεργασία. Η επιλογή αυτή μετακινεί τον τρέχοντα κατάλογο εργασίας στην τελευταία θέση στη λίστα αναζήτησης του SearchPath για όλη τη διάρκεια ζωής της διαδικασίας.

  • Αποφύγετε τη χρήση του SearchPath για να ελέγξετε την ύπαρξη ενός αρχείου DLL χωρίς να καθορίσετε μια πλήρως προσδιορισμενική διαδρομή, ακόμη και εάν είναι ενεργοποιημένη η ασφαλής λειτουργία αναζήτησης, επειδή αυτό μπορεί να οδηγήσει σε επιθέσεις προφόρτωσης DLL.

Οδηγίες για τον προσδιορισμό μη ασφαλούς φόρτωσης βιβλιοθήκης

Στον πηγαίο κώδικα, ακολουθούν παραδείγματα μη ασφαλούς φόρτωσης βιβλιοθήκης:

  • Στο παρακάτω παράδειγμα κώδικα, η εφαρμογή αναζητά το "schannel.dll" χρησιμοποιώντας τη λιγότερο ασφαλή διαδρομή αναζήτησης. Εάν ένας εισβολέας μπορεί να schannel.dll στο CWD, θα φορτωθεί ακόμα και πριν η εφαρμογή αναζητήσει στους καταλόγους των Windows την κατάλληλη βιβλιοθήκη.

    DWORD retval = SearchPath(NULL, "schannel", ".dll", err, result, NULL); 
    HMODULE handle = LoadLibrary(result);
  • Στο παρακάτω παράδειγμα κώδικα, η εφαρμογή προσπαθεί να φορτώσει τη βιβλιοθήκη από τις διάφορες θέσεις εφαρμογής και λειτουργικού συστήματος που περιγράφονται στην αρχή αυτού του εγγράφου για την κλήση LoadLibrary(). Εάν υπάρχει κίνδυνος να μην υπάρχει το αρχείο, η εφαρμογή ενδέχεται να προσπαθήσει να φορτώσει το αρχείο από τον τρέχοντα κατάλογο εργασίας. Αυτό το σενάριο είναι λίγο λιγότερο επικίνδυνο από το προηγούμενο παράδειγμα. Ωστόσο, εξακολουθεί να εκθέτει τον χρήστη της εφαρμογής σε κίνδυνο εάν το περιβάλλον δεν είναι πλήρως προβλέψιμο.

    HMODULE handle = LoadLibrary("schannel.dll");




Τα παρακάτω είναι παραδείγματα για καλύτερα και πιο ασφαλή φορτία βιβλιοθηκών:

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

    HMODULE handle = LoadLibrary("c:\\windows\\system32\\schannel.dll");



    Σημείωση Για πληροφορίες σχετικά με τον τρόπο με τον οποίο μπορείτε να προσδιορίσετε τον κατάλογο συστήματος, ανατρέξτε στους ακόλουθους πόρους:

    GetSystemDirectory

    http://msdn.microsoft.com/en-us/library/ms724373%28VS.85%29.aspxSHGetKnownFolderPath

    http://msdn.microsoft.com/en-us/library/bb762188%28v=VS.85%29.aspx

  • Στο παρακάτω παράδειγμα κώδικα, ο τρέχων κατάλογος εργασίας καταργείται από τη διαδρομή αναζήτησης πριν από την κλήση του LoadLibrary. Αυτό μειώνει σημαντικά τον κίνδυνο, καθώς ο εισβολέας θα έπρεπε να ελέγχει είτε τον κατάλογο εφαρμογών, τον κατάλογο των Windows ή τυχόν καταλόγους που καθορίζονται στη διαδρομή του χρήστη για να χρησιμοποιήσει μια επίθεση προφόρτωσης DLL.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • Σε όλα τα συστήματα που έχουν εγκαταστήσει την ενημέρωση ασφαλείας 963027 (που περιγράφεται στα MS09-014),ο παρακάτω κώδικας μετακινούσε οριστικά την CWD στο τελευταίο σημείο στη σειρά αναζήτησης. Οποιεσδήποτε μεταγενέστερες κλήσεις στη συνάρτηση SetSearchPathMode από μέσα αυτής της διαδικασίας που προσπαθούν να αλλάξουν τη λειτουργία αναζήτησης θα αποτύχουν.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • Στο παρακάτω παράδειγμα κώδικα, ο τρέχων κατάλογος εργασίας καταργείται από τη διαδρομή αναζήτησης πριν από την κλήση του LoadLibrary. Αυτό μειώνει σημαντικά τον κίνδυνο, καθώς ο εισβολέας θα έπρεπε να ελέγξει είτε τον κατάλογο εφαρμογών, τον κατάλογο των Windows ή τυχόν καταλόγους που καθορίζονται στη διαδρομή του χρήστη για να χρησιμοποιήσει μια επίθεση προφόρτωσης DLL.

    SetSearchPathMode (BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE | BASE_SEARCH_PATH_PERMANENT );
    HMODULE handle = LoadLibrary("schannel.dll");

Χρήση της Εποπτείας διεργασιών για τον δυναμικό εντοπισμό μη ασφαλή φορτίων

Η Microsoft δημοσιεύει ένα εργαλείο που ονομάζεται Εποπτεία διαδικασίας. Αυτό το εργαλείο επιτρέπει στους προγραμματιστές και τους διαχειριστές να παρακολουθούν στενά τη συμπεριφορά μιας διεργασίας που εκτελείται. Η Εποπτεία διεργασιών μπορεί να χρησιμοποιηθεί για να εντοπίσει δυναμικά εάν μία από τις εφαρμογές σας μπορεί να είναι ευάλωτη σε αυτό το είδος προβλήματος.

  • Για να κάνετε λήψη του Process Monitor, επισκεφθείτε την ακόλουθη ιστοσελίδα της Microsoft:

    http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

  • Προσπαθήστε να ξεκινήσετε την εφαρμογή σας χρησιμοποιώντας το CWD που έχει οριστεί σε έναν συγκεκριμένο κατάλογο. Για παράδειγμα, κάντε διπλό κλικ σε ένα αρχείο με επέκταση της οποίας το στοιχείο χειρισμού αρχείων έχει εκχωρηθεί στην εφαρμογή σας.

  • Ρύθμιση εποπτείας διαδικασίας με τα παρακάτω φίλτρα:



    εναλλακτικό κείμενο

  • Εάν υπάρχει μια ευάλωτη διαδρομή, θα δείτε κάτι που είναι παρόμοιο με το εξής: εναλλακτικό κείμενοΗ κλήση προς το απομακρυσμένο κοινόχρηστο αρχείο για τη φόρτωση ενός αρχείου DLL υποδεικνύει ότι πρόκειται για ένα ευάλωτο

    πρόγραμμα.

Περισσότερες πληροφορίες

Για περισσότερες πληροφορίες, επισκεφθείτε τις ακόλουθες ιστοσελίδες της Microsoft:

Σειρά αναζήτησης βιβλιοθήκης δυναμικής σύνδεσης

http://msdn.microsoft.com/library/ms682586(VS.85).aspxΤεκμηρίωση MSDN στη συνάρτηση SearchPath

http://msdn.microsoft.com/library/aa365527(VS.85).aspxΤεκμηρίωση MSDN στη συνάρτηση LoadLibrary

http://msdn.microsoft.com/library/ms684175(VS.85).aspxΤεκμηρίωση MSDN στη συνάρτηση SetDllDirectory

http://msdn.microsoft.com/library/ms686203(VS.85).aspxΤεκμηρίωση MSDN για τη συνάρτηση SetSearchPathMode

http://msdn.microsoft.com/library/dd266735(VS.85).aspxΔημοσίευση ιστολογίου από τον David Leblanc, κύριο μηχανικό ασφαλείας με το Microsoft Office

http://blogs.msdn.com/b/david_leblanc/archive/2008/02/20/dll-preloading-attacks.aspxΔημοσίευση ιστολογίου από τον Andrew Roths, ομάδα μηχανικών του MSRC σε επιθέσεις προφόρτωσης DLL

http://blogs.technet.com/b/srd/archive/2009/04/14/ms09-014-addressing-the-safari-carpet-bomb-vulnerability.aspx

Πρόσθετοι πόροι

Χρειάζεστε περισσότερη βοήθεια;

Θέλετε περισσότερες επιλογές;

Εξερευνήστε τα πλεονεκτήματα της συνδρομής, περιηγηθείτε σε εκπαιδευτικά σεμινάρια, μάθετε πώς μπορείτε να προστατεύσετε τη συσκευή σας και πολλά άλλα.

Οι κοινότητες σάς βοηθούν να κάνετε και να απαντάτε σε ερωτήσεις, να δίνετε σχόλια και να ακούτε από ειδικούς με πλούσια γνώση.

Σας βοήθησαν αυτές οι πληροφορίες;

Πόσο ικανοποιημένοι είστε με τη γλωσσική ποιότητα;
Τι επηρέασε την εμπειρία σας;
Πατώντας "Υποβολή" τα σχόλια σας θα χρησιμοποιηθούν για τη βελτίωση των προϊόντων και των υπηρεσιών της Microsoft. Ο διαχειριστής IT θα έχει τη δυνατότητα να συλλέξει αυτά τα δεδομένα. Δήλωση προστασίας προσωπικών δεδομένων.

Σας ευχαριστούμε για τα σχόλιά σας!

×