Έχετε βρεθεί στη περίπτωση που ενώ κάνετε debugging βρίσκετε μπροστά σε κάτι πολύ πιο τρομακτικό από αυτό που περιμένατε να βρείτε;

php_ghost-680x400

Αυτή είναι η ιστορία ενός μηχανικού στη Google ο οποίος παρατήρησε πως ο SSH client ο οποίος χρησιμοποιούνταν παρουσίαζε προβλήματα κάθε φορά που προσπαθούσε να συνδεθεί με κάποιο host. Ο μηχανικός δήλωσε πως εντόπισε το πρόβλημα και κατόπιν ενδελεχούς ελέγχου οι μηχανικοί αποφάνθηκαν πως το πρόβλημα δεν βρισκόταν στο πρωτόκολλο SSH αλλά στη βιβλιοθήκη glibc.

Χάρη στη παρατήρηση του συγκεκριμένου μηχανικού στη Google διαπίστωσαν πως είναι πολύ πιθανό κάποιος να χρησιμοποιήσει το bug στο κώδικα έτσι ώστε να εκτελέσει απομακρυσμένες εντολές στο σύστημα. Μετά από κάποιες συνεδρίες hacking οι μηχανικοί στη Google κατάφεραν να εκμεταλλευτούν το κενό ασφαλείας και έγραψαν ένα απόλυτα λειτουργικό exploit.

Η Google ενημερώθηκε πως οι συντηρητές της βιβλιοθήκης glibc είχαν ήδη εντοπίσει το bug τον Ιούλιο του 2015. Η ομάδα της Google ήρθε σε επικοινωνία με την ομάδα συντήρησης της βιβλιοθήκης και συνδυάζοντας τη τεχνογνωσία τους έγραψαν ένα patch έτσι ώστε να επιδιορθώσουν το κενό ασφαλείας.

Το επιδιορθωτικό patch μπορείτε να το βρείτε εδώ και αν τρέχετε κάποια έκδοση Linux, ή κάποιο web framework το οποίο χρησιμοποιεί τη βιβλιοθήκη glibc, όπως frameworks της PHP (το πολύ γνωστό WordPress), της Python αλλά και της Ruby on Rails, τότε καλό θα ήταν να επισπεύσετε τη διαδικασία της αναβάθμισης.

Αν θέλετε να δείτε τις τεχνικές λεπτομέρειες του bug συνεχίστε την ανάγνωση:

Το bug επηρεάζει όλες τις εκδόσεις της βιβλιοθήκης από την έκδοση 2.9 και μετά. Συγκεκριμένα, ο resolver του συστήματος ονοματοδοσίας (DNS) από τη πλευρά του πελάτη είναι ευάλωτος σε buffer overflow όταν η συνάρτηση getaddrinfo() χρησιμοποιείται. Τα λογισμικά που χρησιμοποιούν αυτή τη βιβλιοθήκη μπορούν να γίνουν θύματα επιθέσεων στο τομέα του DNS, όπως ο hacker να αντικαταστήσει τους προδιαγεγραμμένους DNS servers με άλλους ή να κάνει μια man-in-the-middle επίθεση.

Περεταίρω, η βιβλιοθήκη glibc κάνει χρήση 2048 byte μέσω της συνάρτησης alloca() για την απάντηση στη συνάρτηση _nss_dns_gethostbyname4_r() για τις ερωτοαποκρίσεις του DNS.

Αργότερα, με τη χρήση των συναρτήσεων send_dg() και της send_vc(), αν η απάντηση είναι μεγαλύτερη από 2048 byte, νέες θέσεις μνήμης διατίθενται από το σωρό της μνήμης και όλες οι πληροφορίες για το buffer αναβαθμίζονται.

Κάτω από συγκεκριμένες συνθήκες υπάρχει περίπτωση να υπάρχει ένα “κακό ταίρι” ανάμεσα στο αρχικό buffer και στη νέα διάθεση της μνήμης. Το αποτέλεσμα αυτού είναι πως το αρχικό buffer θα χρησιμοποιηθεί για την αποθήκευση όλου του μέρους της απάντησης από το DNS, ακόμη και αν είναι μεγαλύτερο από 2048 byte και τελικά θα οδηγήσει στην υπερχείλιση του buffer.

ΑΦΗΣΤΕ ΕΝΑ ΣΧΟΛΙΟ