Ping του θανάτου! Το FreeBSD διορθώνει crashtastic bug στο εργαλείο δικτύου PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Ping του θανάτου! Το FreeBSD διορθώνει crashtastic bug στο εργαλείο δικτύου

Ένα από τα πρώτα εργαλεία δικτύου χαμηλού επιπέδου για τα οποία μαθαίνει οποιοσδήποτε χρήστης υπολογιστή είναι το σεβαστό ping χρησιμότητα.

Ονομάστηκε από το ομώνυμο ηχητικό εφέ από οποιαδήποτε και κάθε σκηνή πολεμικής ταινίας παλιάς σχολής που περιλαμβάνει υποβρύχια, η εντολή είναι μια μεταφορική ηχώ (δείτε τι κάναμε εκεί;) της υποβρύχιας έκδοσης του RADAR, γνωστής ως SONAR.

Στέλνεις ένα ping (περισσότερο σαν θόρυβος, μέσα πραγματικότητα) στα αλμυρά βάθη και μετρώντας πόσο χρόνο χρειάζεται για να επιστρέψει η απόκοσμη ηχώ του και υπολογίζοντας την ταχύτητα του ήχου στον περιβάλλοντα ωκεανό, μπορείτε να υπολογίσετε την απόσταση από το αντικείμενο που παρήγαγε την ηχώ.

Είναι ενδιαφέρον, δεδομένου ότι πιθανότατα έχετε ακούσει τη συντομογραφία TCP/IP που χρησιμοποιείται ως γενική περιγραφή της κόλλας πρωτοκόλλου που τροφοδοτεί το διαδίκτυο, ping τεχνικά δεν χρησιμοποιεί καθόλου TCP/IP.

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

Για παράδειγμα, στις συνδέσεις TCP, τυχόν κομμάτια δεδομένων που στέλνετε είναι εγγυημένα είτε ότι θα φτάσουν άθικτα στο άλλο άκρο είτε θα προκαλέσουν σφάλμα, ώστε να γνωρίζετε ότι δεν τα κατάφεραν.

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

Το ping είναι διαφορετικό

Η ping Η εντολή, ωστόσο, χρησιμοποιείται συνήθως για να επαληθεύσει εάν ένας υπολογιστής που σας ενδιαφέρει είναι καθόλου συνδεδεμένος, ειδικά εάν δεν δέχεται το είδος των συνδέσεων TCP υψηλού επιπέδου που θα περιμένατε, όπως η λήψη email ή η δυνατότητα σύνδεσης SSH.

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

Ως αποτέλεσμα, ping χρησιμοποιεί πρωτόκολλο πολύ χαμηλότερου επιπέδου από το TCP.

Πράγματι, ping δεν χρησιμοποιεί καν το πιο περιστασιακό UDP του TCP, συντομογραφία πρωτόκολλο datagram χρήστη, που είναι ένας τρόπος μετάδοσης κομματιών δεδομένων που είναι γρήγορος και εύκολος, αλλά αναφέρεται ευρέως ως send-and-hope (ή, αν είστε κυνικός τύπος, ως spray-and-pray).

Το ίδιο το UDP δεν σας ενημερώνει εάν τα δεδομένα σας έφτασαν στο άλλο άκρο ή όχι, και ακόμη και αν φτάσουν άθικτα, το UDP δεν παρακολουθεί τη σειρά με την οποία στάλθηκαν αρχικά τα πακέτα σας, επομένως δεν μπορεί να τα αναδιατάξει στο το άλλο άκρο αν φτάσουν εκεί εκτός σειράς.

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

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

  • Τύπος 0x08. Επισήμως καλείται ICMP Echo, Αυτό είδος πακέτου συνήθως ονομάζεται Αίτημα Echo. Είναι αυτό που το ping το πρόγραμμα αποστέλλεται για να διερευνήσει ενεργούς υπολογιστές στο δίκτυο.
  • Τύπος 0x00. Επισήμως καλείται ICMP Echo Reply, αυτός ο τύπος πακέτου είναι ακριβώς αυτό που λέει. Ένας υπολογιστής που είναι ζωντανός, συνδεδεμένος και δεν έχει ρυθμιστεί για να αποκλείει την κυκλοφορία ICMP Echo υποτίθεται ότι στέλνει αυτό το είδος πακέτου απευθείας στον υπολογιστή που το ζήτησε.

Παρόμοιες θέματα:

$ ping -c 3 -p 4E414B45445345435552495459 nakedsecurity.sophos.com PATTERN: 0x4e414b45445345435552495459 PING news-sophos.go-vip.192.0.66.227 data. 56 byte από 84 (64): icmp_seq=192.0.66.227 ttl=192.0.66.227 χρόνος=1 ms 53 byte από 84.0 (64): icmpttl192.0.66.227 192.0.66.227 bytes = 2 bytes 53 = 85.1 χρόνο 64 (192.0.66.227): icmp_seq=192.0.66.227 ttl=3 time=53 ms --- news-sophos.go-vip.net στατιστικά ping --- 84.8 πακέτα μεταδόθηκαν, 3 ελήφθησαν, 3% απώλεια πακέτων, χρόνος 0ms rtt min/ avg/max/mdev = 2004/84.025/84.644/85.062 ms

Για να δείτε ένα ping σε δράση σε ελαφρώς χαμηλότερο επίπεδο, θα χρησιμοποιήσουμε τον κώδικα Lua που μπορείτε να βρείτε στο τέλος του άρθρου για να δημιουργήσουμε ένα δικό μας πακέτο ICMP Echo και για να διαβάσουμε την απάντηση που επιστρέφει, εάν υπάρχει:

$ sudo luax ping.lua nakedsecurity.sophos.com Αποστολή αιτήματος ICMP ECHO στο 192.0.66.227 --> 00000000 08 00 03 02 bb 5a 6f 1d 50 69 6e 67 52 65 | 71 75 00000010 65 73d 74 4 65 73 73 61 67 65 20 42 42 35 |estMessage BB41A36| 5 6 00000020 46 |F31D | Πήρα πίσω--> 44 1 00000000 45 00 f00 af 37 6 00 00 35 01f c94 7 0 e00 |E..42....3.....B.| 7 XX XX XX XX 5 00000010 00b 00 bb 0a 02f 5d 6 1 50e 69 |.........Zo.Ping| 6 67 00000020 52 65 71 75 65 73d 74 4 65 73 73 61 67 65 |Αίτημα Μήνυμα B| 20 42 00000030 42 35 41 36 46 |B31A44F5D |

Παρεμπιπτόντως, έπρεπε να χρησιμοποιήσουμε sudo παραπάνω για να τρέξουμε το σενάριό μας με δικαιώματα υπερχρήστη, επειδή δημιουργήσαμε αυτό που είναι γνωστό ως α ακατέργαστη υποδοχή IP – ένα που μπορεί να δημιουργηθεί σε οποιαδήποτε υποκείμενη μορφή μας αρέσει, συμπεριλαμβανομένων των TCP, UDP και, όπως απαιτείται εδώ, ICMP.

Σε πολλά συστήματα Linux/Unix, το ping η εντολή που παρέχεται από τη διανομή σας λειτουργεί χωρίς ρητά να της παρέχονται δικαιώματα root, συνήθως επειδή είναι εγκατεστημένη με ειδικές δυνατότητες ασφαλείας ή με setuid set flag, που σημαίνει ότι ξεκινά με την εκτέλεση σε διαφορετικό λογαριασμό χρήστη από τον χρήστη που το έτρεξε.

Καλά σχεδιασμένο ping Τα προγράμματα, φυσικά, θα απορρίψουν αυτόματα τα επιπλέον προνόμιά τους μόλις ανοίξουν την ακατέργαστη πρίζα που χρειάζονται.

Παραλείψαμε αυτόν τον κωδικό απόρριψης προνομίων από το δείγμα δέσμης ενεργειών μας για λόγους συντομίας. Μπορείτε να χρησιμοποιήσετε το posix.unistd.setpid() λειτουργία για μετάβαση σε μη προνομιούχο λογαριασμό μετά τη δημιουργία της υποδοχής, αλλά πριν από την αποστολή ή τη λήψη δεδομένων.

Εξετάζοντας την απάντηση

Όπως μπορείτε να αναγνωρίσετε στην ένδειξη δεδομένων από το παραπάνω σενάριο, η λειτουργία υποδοχής δικτύου που χρησιμοποιούμε για την ανάγνωση δεδομένων από τον διακομιστή που απαντά περιλαμβάνει όχι μόνο τα δεδομένα ICMP Echo Reply, αλλά και την IP χαμηλού επιπέδου (κεφαλίδες πρωτοκόλλου διαδικτύου) στο υποκείμενο πακέτο.

Δεν προσπαθήσαμε να αναλύσουμε ή να επεξεργαστούμε με άλλο τρόπο αυτά τα δεδομένα, αλλά το FreeBSD ping Το πρόγραμμα πρέπει να το κάνει για να κατανοήσει την απάντηση, συμπεριλαμβανομένης της κατανόησης τυχόν μηνυμάτων σφάλματος που επιστρέφουν.

Εάν η ping απορρίπτεται με κάποιο τρόπο, η απάντηση Echo θα περιλαμβάνει συνήθως όχι μόνο τις δικές της κεφαλίδες IP (όπως φαίνεται παραπάνω), αλλά και ένα αντίγραφο αναφοράς των κεφαλίδων IP και των δεδομένων ICMP που εμφανίστηκαν στο αρχικό αίτημα εξερχόμενων.

Οι κεφαλίδες των πακέτων IPv4 συνήθως μοιάζουν πολύ όπως βλέπετε παραπάνω, από όπου ξεκινούν οι κεφαλίδες IP 45 00 00 37... και συνεχίστε για 20 byte συνολικά, μέχρι και συμπεριλαμβανομένων των byte που εμφανίζονται ως ...XX XX XX XX, που είναι η διεύθυνση IP του φορητού υπολογιστή μου.

Παρόμοιες θέματα:

00000000 45 00 00 37 f6 af 00 00 35 01 94 7f c0 00 42 e3 |E..7....5.....B.| 00000010 XX XX XX XX |.... | Έκδοση IP και μήκος κεφαλίδας: 0x45 (4 = IPv4, 5 = πέντε λέξεις 32 bit, δηλαδή 20 byte Τύπος υπηρεσίας και δεδομένα συμφόρησης: 0x00 Συνολικό μήκος πακέτου: 0x0037 (δεκαδικός αριθμός 55) Πληροφορίες ακολουθίας: F6 AF 00 00 Χρόνος -ζωντανά (αναπήδηση αριστερά): 0x35 (δεκαδικός αριθμός 53) Τύπος πρωτοκόλλου: 0x01 (ICMP) Άθροισμα ελέγχου: 0x947F (δεκαδικός αριθμός 38015) Αριθμός IP αποστολής υπολογιστή: C0 00 42 E3 (192.0.66.227 = nadsecurity.com'sIP) φορητός υπολογιστής): XX XX XX XX (REDACTED = ο δικός μου αριθμός IP)

του FreeBSD ping Οι προγραμματιστές, φαίνεται, υπέθεσαν ότι οι κεφαλίδες αυτού του είδους θα είχαν, πράγματι, πάντα μήκος ακριβώς 20 byte, με βάση αυτήν την τιμή μήκους κεφαλίδας στο πρώτο byte του 0x45, που δηλώνει IPv4 (0x4?) με 5-DWORD (0x?5), ή κεφαλίδα 20 byte.

Με μόλις 20 byte να ανησυχούν, οι προγραμματιστές διέθεσαν buffer σταθερού μεγέθους στη στοίβα όπου μπορούσαν να κρατήσουν ένα αντίγραφο των κεφαλίδων IP στην απάντηση, συν τυχόν ενσωματωμένες κεφαλίδες IP από το αρχικό αίτημα, εάν υπήρχε συνθήκη σφάλματος για χειρισμό .

Μπορείτε να μαντέψετε πού πάει αυτό.

Αυτό το πρώτο byte στην κεφαλίδα IPv4 μπορεί νόμιμα να έχει οποιαδήποτε τιμή από 0x45 (το ελάχιστο μέγεθος κεφαλίδας 5 DWORD ή 20 byte, όπως φαίνεται) έως 0x4F (δηλαδή 15 DWORD, επειδή το 0xF είναι δεκαδικό 15 ή 60 byte δεδομένων κεφαλίδας συνολικά), επιτρέποντας έτσι τακτοποιημένα προαιρετικά επιπλέον 40 byte δεδομένων κεφαλίδας.

Αυτά τα σπάνια, αλλά νόμιμα, επιπλέον byte κεφαλίδας μπορούν να χρησιμοποιηθούν για διάφορα funky και ασυνήθιστα "χαρακτηριστικά" με περίεργα ονόματα όπως π.χ. Επιλεκτική Κατευθυνόμενη Εκπομπή, Πειραματικός Έλεγχος Ροής και Upstream Multicast Packet – πράγματα που έχουμε ακούσει αλλά ποτέ δεν τα χρησιμοποιήσαμε εν γνώσει μας, ούτε καν τα έχουμε δει.

Προσοχή στους εγκληματίες του κυβερνοχώρου που σας δοκιμάζουν

Όπως μπορείτε να φανταστείτε, δεδομένου ότι αυτά τα επιπλέον πεδία δεν χρησιμοποιούνται σχεδόν ποτέ, ενδέχεται να μην δείτε ποτέ ένα πακέτο IPv4 με οτιδήποτε άλλο εκτός από 0x45 στην αρχή, και με 20 byte δεδομένων κεφαλίδας συνολικά, εκτός και αν συναντήσετε ένα σωρό κυβερνοεγκληματίες που είναι έτοιμοι να σας βάλουν σε δοκιμασία.

Δυστυχώς, δεν υπάρχουν πολλά για να σταματήσει ένας εισβολέας από το να στήνει έναν διακομιστή που μαντεύει αν χρησιμοποιείτε FreeBSD και δημιουργεί σκόπιμα μεγάλα πακέτα ICMP/IP Echo Reply για να προκαλέσει υπερχείλιση buffer στοίβας Μέσα σου ping προγράμματος.

Εάν ελέγξετε ποτέ εάν ο διακομιστής τους είναι ενεργός (κάτι που θα μπορούσατε να κάνετε ακόμη, ή ίσως ειδικά, εάν πιστεύετε ότι είναι ύποπτο!), θα μπορούσατε να στοχοποιηθείτε με μια απάντηση παγιδευμένη.

Στην καλύτερη περίπτωση, το δικό σου ping το πρόγραμμα θα καταρρεύσει? στη χειρότερη, ωστόσο, όπως γενναιόδωρα παραδέχεται η συμβουλευτική υπηρεσία ασφαλείας του FreeBSD, "Μπορεί να είναι δυνατό για έναν κακόβουλο κεντρικό υπολογιστή να ενεργοποιήσει την απομακρυσμένη εκτέλεση κώδικα στο ping."

Ευτυχώς, όπως και οι συντάκτες του FreeBSD επισημαίνω, "[η] διαδικασία ping εκτελείται σε ένα sandbox λειτουργίας δυνατότητας σε όλες τις επηρεαζόμενες εκδόσεις του FreeBSD και επομένως είναι πολύ περιορισμένη στον τρόπο αλληλεπίδρασης με το υπόλοιπο σύστημα στο σημείο όπου μπορεί να εμφανιστεί το σφάλμα."

Με άλλα λόγια, πρέπει οπωσδήποτε να επιδιορθώσετε, αλλά οι κίνδυνοι μπορούν να θεωρηθούν μέτριοι.

Ειδικότερα, το ping Το πρόγραμμα δεν είναι μόνο κλειδωμένο σε ένα sandbox, αλλά δεν εκτελείται ως root όταν φτάσει ο κωδικός buggy, όπως επιβεβαιώνεται στην συμβουλευτική υποστήριξη ασφαλείας: "Πότε ping τρέχει, δημιουργεί την ακατέργαστη υποδοχή που χρειάζεται για να κάνει τη δουλειά του και, στη συνέχεια, ανακαλεί τα αυξημένα προνόμιά του».

Όπως περιγράφεται παραπάνω, οι εξουσίες υπερχρήστη απαιτούνται μόνο για την απόκτηση μιας πρωτογενούς υποδοχής IP από το λειτουργικό σύστημα και όχι για τη χρήση του sendto() και recvfrom() λειτουργεί σε αυτήν την υποδοχή μετά.

Αυτό το σφάλμα έχει λάβει το επίσημο αναγνωριστικό CVE-2022-23093; τεκμηριώνεται στη συμβουλή ασφαλείας FreeBSD-SA-22:15.ping.

Τι να κάνω;

  • Εάν είστε χρήστης του FreeBSD, απλά ενημερώστε τις εκδόσεις που επηρεάζονται (FreeBSD 12 και FreeBSD 13) στις πιο πρόσφατες εκδόσεις τους, όπου αυτό το σφάλμα έχει διορθωθεί.
  • Εάν είστε προγραμματιστής δικτύου, Βεβαιωθείτε πάντα ότι έχετε λάβει υπόψη τις κεφαλίδες πακέτων που θα μπορούσαν να υποδεικνύουν ασυνήθιστες παραλλαγές μεγέθους. Το γεγονός ότι δεν έχετε δει ποτέ καμία παραλλαγή οι ίδιοι δεν σας εμποδίζει να αντιμετωπίσετε αύριο ένα πακέτο που είναι εκτός του συνηθισμένου αλλά απολύτως νόμιμο.
  • Εάν είστε διαχειριστής δικτύου, σκεφτείτε να αποκλείσετε πακέτα IPv4 με κεφαλίδες IP που δεν έχουν μέγεθος 20 byte. Εάν πραγματικά φαίνεται ότι πρέπει να επιτρέψετε σε ορισμένα προϊόντα λογισμικού να χρησιμοποιούν ασυνήθιστες επιλογές κεφαλίδας IPv4, εξετάστε το ενδεχόμενο να καταγράψετε αυτά τα ασυνήθιστα πακέτα για να μάθετε γιατί.

Να προσέχετε εκεί έξω!


ΠΑΡΑΔΕΙΓΜΑ ΚΩΔΙΚΟΣ ΓΙΑ ΤΗΝ ΑΠΟΔΕΙΞΗ ΚΥΚΛΟΦΟΡΙΑΣ PING


Σφραγίδα ώρας:

Περισσότερα από Γυμνή ασφάλεια