Ανάλυση του CVE-2025-13032: Εκμετάλλευση double-fetch στον kernel driver της Avast
Πρωτότυπος τίτλος: "CVE-2025-13032: Entering and Breaking the Avast Antivirus Sandbox Part 2" (από safateam)
Η έρευνα αναλύει την εκμετάλλευση μιας ευπάθειας double-fetch στον kernel driver της Avast, η οποία οδηγεί σε heap pool overflow. Μέσω της χειραγώγησης αντικειμένων I/O Ring, οι ερευνητές πέτυχαν αυθαίρετη ανάγνωση και εγγραφή (arbitrary read/write) στον kernel, καταλήγοντας σε κλιμάκωση προνομίων (local privilege escalation).
Η αρχιτεκτονική της ευπάθειας double-fetch
Το CVE-2025-13032 εντοπίστηκε σε έναν kernel driver της Avast, όπου η τιμή Length μιας δομής _UNICODE_STRING ανακτάται πολλαπλές φορές από τον χρήστη. Αυτό επιτρέπει σε ένα δεύτερο thread να μεταβάλλει την τιμή μεταξύ του ελέγχου μεγέθους για την δέσμευση μνήμης (allocation) και της εκτέλεσης της memmove, προκαλώντας υπερχείλιση (overflow) στον pool.
Από το heap overflow στο arbitrary R/W
Η εκμετάλλευση στοχεύει τον PAGED_POOL των Windows. Με τη χρήση heap spraying, οι ερευνητές αντικατέστησαν τα δεδομένα ενός _IORING_OBJECT. Συγκεκριμένα, η αλλοίωση του πίνακα RegBuffers επιτρέπει την ανακατεύθυνση των I/O λειτουργιών σε μια ψευδή δομή _IOP_MC_BUFFER_ENTRY που ελέγχεται από το userland. Ελλείψει SMAP (Supervisor Mode Access Prevention), ο kernel αποαναφέρεται (dereference) σε δείκτες του χρήστη, μετατρέποντας τις λειτουργίες IoRingReadFile και IoRingWriteFile σε ισχυρά εργαλεία ανάγνωσης και εγγραφής μνήμης του kernel.
Διαρροή δεδομένων και κλιμάκωση προνομίων
Για την ολοκλήρωση της επίθεσης, απαιτείται η γνώση της διεύθυνσης του _EPROCESS της διεργασίας. Οι ερευνητές εκμεταλλεύτηκαν το γεγονός ότι το MDL που συνδέεται με το corrupted buffer entry περιέχει δείκτη προς το _EPROCESS. Διαβάζοντας αυτό το πεδίο μέσω του arbitrary read primitive, απέκτησαν πρόσβαση στο token του SYSTEM, το οποίο αντικατέστησαν στο δικό τους process token, επιτυγχάνοντας πλήρη κλιμάκωση προνομίων.
Σταθεροποίηση και αποφυγή συστημικής κατάρρευσης
Η επίθεση περιλαμβάνει κρίσιμα βήματα για την αποφυγή του Blue Screen of Death (BSOD). Η διόρθωση του πεδίου ProcessBilled στο header του pool chunk είναι απαραίτητη, καθώς και η διαχείριση του reference count του fake buffer entry, ώστε να αποφευχθεί η προσπάθεια του kernel να αποδεσμεύσει (free) μνήμη που ανήκει στο userland κατά το teardown του αντικειμένου.
Ανακαλύψτε καινοτόμα open-source εργαλεία και κρυμμένα διαμάντια ανοιχτού κώδικα.