Μια επιδιόρθωση εξανθήματος οδήγησε σε μια ελλιπή επιδιόρθωση για μια ευπάθεια Spectre στον πυρήνα του Linux

Προγραμματιστές του έργου Grsecurity κοινόχρηστο μια προειδοποιητική ιστορία που δείχνει πώς η απερίσκεπτη εξάλειψη των προειδοποιήσεων μεταγλωττιστή μπορεί να οδηγήσει σε τρωτά σημεία στον κώδικα. Στα τέλη Μαΐου, προτάθηκε μια επιδιόρθωση για τον πυρήνα του Linux για ένα νέο φορέα εκμετάλλευσης της ευπάθειας του Spectre μέσω της κλήσης συστήματος ptrace.

Κατά τη δοκιμή της ενημέρωσης κώδικα, οι προγραμματιστές παρατήρησαν ότι κατά τη δημιουργία, ο μεταγλωττιστής εμφανίζει μια προειδοποίηση σχετικά με την ανάμειξη κώδικα και ορισμών (η δομή ορίστηκε μετά τον κώδικα, εκχωρώντας μια τιμή σε μια υπάρχουσα μεταβλητή):

δείκτης int = n;
if (n < HBP_NUM) { index = array_index_nospec(index, HBP_NUM); struct perf_event *bp = thread->ptrace_bps[index];

Ο Λίνος δέχτηκε διόρθωση στο κύριο υποκατάστημά σας, έχοντας ξεφορτωθεί από την προειδοποίηση μετακινώντας τον ορισμό της μεταβλητής σε ένα μπλοκ if:

if (n < HBP_NUM) { int index = array_index_nospec(n, HBP_NUM); struct perf_event *bp = thread->ptrace_bps[index];

Τον Ιούλιο, η ενημέρωση κώδικα μεταφέρθηκε επίσης στους κλάδους σταθερού πυρήνα 4.4, 4.9, 4.14, 4.19 και 5.2. Οι συντηρητές των στάβλων αντιμετώπισαν επίσης την προειδοποίηση και, αντί να ελέγξουν αν είχε ήδη διορθωθεί στον κύριο κλάδο του Linus, έκαναν μια επιδιόρθωση μόνοι τους. Το πρόβλημα είναι ότι χωρίς να το σκέφτονται πραγματικά, απλώς μετακόμισε ορίζοντας τη δομή προς τα πάνω, έτσι ώστε η κλήση στο array_index_nospec, η οποία παρέχει άμεσα προστασία έναντι της ευπάθειας, δεν χρησιμοποιείται πλέον κατά τον ορισμό της δομής και αντί για τη μεταβλητή "index" χρησιμοποιείται πάντα η μεταβλητή "n":

δείκτης int = n;
if (n < HBP_NUM ){ struct perf_event *bp = thread->ptrace_bps[index];
index = array_index_nospec(index, HBP_NUM);

Πηγή: opennet.ru

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