Η αναβάθμιση ενός listener σε TLS 1.3 αλλάζει το τι μπορεί να διαβάσει ένας παρατηρητής, αλλά όχι όσο υποδηλώνει ο αριθμός έκδοσης. Το ClientHello ταξιδεύει ακόμη πριν διαπραγματευτεί οποιαδήποτε κρυπτογράφηση, και σε μια συνηθισμένη σύνδεση το ζητούμενο όνομα διακομιστή βρίσκεται εκεί σε απλό κείμενο. Το Encrypted Client Hello είναι ο μηχανισμός που το κρύβει, και είναι ξεχωριστή ανάπτυξη με τις δικές της προϋποθέσεις. Εκτελέστε αυτά τα τέσσερα βήματα πριν γράψετε μια πολιτική που υποθέτει οποιαδήποτε από τις δύο συμπεριφορές.

Τι εκθέτει πραγματικά η χειραψία

Το TLS 1.3 κρυπτογραφεί το πιστοποιητικό του διακομιστή και το μεγαλύτερο μέρος της χειραψίας που ακολουθεί το ServerHello. Ό,τι στέλνει ο πελάτης πρώτο μένει εκτός αυτής της προστασίας, επειδή τα κλειδιά δεν υπάρχουν ακόμη. Η ένδειξη ονόματος διακομιστή είναι μέρος αυτής της πρώτης πτήσης, γι’ αυτό ένας παθητικός παρατηρητής μπορεί ακόμη να τη διαβάσει χωρίς να σπάσει τίποτα.

Η προδιαγραφή ECH, RFC 9849, το αλλάζει κρυπτογραφώντας ένα εσωτερικό ClientHello για έναν διακομιστή που συνεργάζεται. Η εξωτερική χειραψία παραμένει και φέρει ένα δημόσιο όνομα που το δίκτυο μπορεί να δει, οπότε η ανάπτυξη χρειάζεται ακόμη μια εξωτερική ταυτότητα που έχει νόημα για τους μεσάζοντες. Αυτό το εξωτερικό όνομα είναι το μέρος που οι άνθρωποι χάνουν όταν περιμένουν η σύνδεση να γίνει ανώνυμη. Είναι όνομα κάλυψης, όχι κρυφό όνομα, και πρέπει να επιλύεται και να πιστοποιείται όπως κάθε άλλο.

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

Διαβάστε ένα ClientHello αντί να υποθέτετε

Η έκδοση στο ServerHello δεν σας λέει τι έστειλε ο πελάτης. Κοιτάξτε την πρώτη πτήση απευθείας, από θέση που αντιπροσωπεύει τον παρατηρητή που σας ενδιαφέρει.

openssl s_client -connect app.plant.example:443 -servername app.plant.example -tls1_3 </dev/null> 2>/dev/null | head -20
sudo tcpdump -ni eth0 -c 40 'tcp port 443' -w /tmp/tls.pcap
tshark -r /tmp/tls.pcap -Y 'tls.handshake.extensions_server_name' -T fields -e tls.handshake.extensions_server_name

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

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

Αντιμετωπίστε μια επέκταση ECH ως ισχυρισμό, όχι ως απόδειξη

Το να δείτε μια επέκταση ECH σε ένα ClientHello δεν σημαίνει ότι η σύνδεση χρησιμοποίησε ECH. Οι πελάτες στέλνουν GREASE ECH όταν δεν έχουν χρησιμοποιήσιμη διαμόρφωση, ακριβώς για να φαίνονται οι χειραψίες τους ομοιόμορφες. Η επέκταση είναι παρούσα, το εσωτερικό hello είναι δόλωμα, και το πραγματικό όνομα είναι ακόμη αναγνώσιμο.

dig +short HTTPS app.plant.example
openssl s_client -connect app.plant.example:443 -tls1_3 -status </dev/null> 2>/dev/null | grep -i -E 'ech|status_request'

Η πρώτη εντολή δείχνει αν η προέλευση δημοσιεύει μια εγγραφή πόρου HTTPS με παράμετρο διαμόρφωσης ECH, και έτσι οι πελάτες μαθαίνουν το κλειδί. Η δεύτερη αναζητά πληροφορίες κατάστασης της χειραψίας, αν και το μήνυμα επιτυχίας ενός πελάτη είναι η ισχυρότερη απόδειξη. Η αποδοχή είναι αυτό που μετράει: ένας διακομιστής που δεν κατέχει το αντίστοιχο κλειδί δεν μπορεί να αποκρυπτογραφήσει το εσωτερικό hello, και η σύνδεση υποχωρεί.

Ελέγξτε και τον πελάτη, αφού η υποστήριξη των περιηγητών και η διαμόρφωση διαφέρουν ανά έκδοση και πλατφόρμα. Μια πολιτική χτισμένη στο „οι σύγχρονοι περιηγητές χρησιμοποιούν ECH“ είναι μια εικασία για έναν στόλο, όχι γεγονός για τον δικό σας στόλο. Καταγράψτε τις εκδόσεις που συνδέονται πραγματικά και μετά δοκιμάστε μία από την καθεμία. Η ίδια σελίδα που λειτουργεί από έναν τρέχοντα περιηγητή επιφάνειας εργασίας μπορεί να μην κρύβει τίποτα από έναν παλαιότερο πελάτη στο ίδιο δίκτυο.

Γράψτε το εύρος του παρατηρητή στην πολιτική

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

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

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

Σχετικά άρθρα