Ο κανόνας ήταν απλός: φιλτράρισμα της κίνησης μόνο όσο το τηλέφωνο είναι συνδεδεμένο στο Wi-Fi του γραφείου. Άντεξε μήνες, και μετά ένα πρωί το τηλέφωνο βρισκόταν στο ίδιο SSID με το ίδιο εικονίδιο κλειδιού και το φιλτράρισμα είχε σταματήσει. Τίποτα στο δίκτυο δεν είχε αλλάξει· αυτό που άλλαξε ήταν αν η εφαρμογή μπορούσε να δει το όνομα του δικτύου. Στο Android, το «σε ποιο Wi-Fi βρίσκομαι» και το «μπλόκαρε αυτή την κίνηση» είναι δύο ξεχωριστές δουλειές, και ένα τείχος προστασίας που τα συγχέει ανοίγει ακριβώς όταν το όνομα γίνεται μη διαθέσιμο.

Το σύμπτωμα: η ταυτότητα εξαφανίζεται και η πολιτική την ακολουθεί

Ένας κανόνας SSID διαβάζει μια τιμή και μετά επιλέγει κλάδο. Όταν η ανάγνωση δεν επιστρέφει τίποτα χρήσιμο, ο κώδικας πρέπει να κάνει κάτι, και η συνήθης προεπιλογή είναι «δεν είναι το αναμενόμενο δίκτυο, άρα μη φιλτράρεις». Αυτή η προεπιλογή μετατρέπει ένα πρόβλημα άδειας σε διαρροή κίνησης. Το εικονίδιο κλειδιού παραμένει ορατό επειδή η υπηρεσία VPN εξακολουθεί να εκτελείται· απλώς επιβάλλει άλλον κλάδο.

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

Γιατί το όνομα μπορεί να επιστρέψει άγνωστο

Το WifiInfo.getSSID() επιστρέφει το αναγνωριστικό συνόλου υπηρεσιών του τρέχοντος δικτύου, και το Android τεκμηριώνει ότι η πρόσβαση σε πεδία ευαίσθητα στην τοποθεσία εξαρτάται από άδεια. Όταν η πρόσβαση δεν είναι διαθέσιμη, η κλήση επιστρέφει UNKNOWN_SSID αντί να αποτύχει ηχηρά. Μια κενή ή άγνωστη τιμή λοιπόν δεν είναι απόδειξη ότι το τηλέφωνο έφυγε από το Wi-Fi· είναι απόδειξη ότι η εφαρμογή δεν μπορεί να ταξινομήσει το δίκτυο.

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

adb shell cmd wifi status
adb shell dumpsys package <your.app> | grep -i -E "ACCESS_FINE_LOCATION|NEARBY_WIFI_DEVICES"

Αν η γραμμή κατάστασης δείχνει συνδεδεμένο δίκτυο ενώ η εφαρμογή βλέπει άγνωστο όνομα, έχετε πρόβλημα άδειας ή επιπέδου API, όχι πρόβλημα Wi-Fi. Διορθώστε το πριν αγγίξετε τους κανόνες του τείχους προστασίας, γιατί κάθε επόμενος κανόνας αξιολογείται απέναντι σε μια τιμή που η εφαρμογή δεν μπορεί να διαβάσει.

Πού εκτελείται στην πραγματικότητα το φιλτράρισμα

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

Αυτό έχει σημασία για έναν κανόνα SSID επειδή το σημείο επιβολής και το σημείο παρατήρησης είναι διαφορετικά στοιχεία. Το VpnService αποφασίζει τι φεύγει από τη συσκευή· το API Wi-Fi παρέχει μόνο μια ετικέτα. Μια εφαρμογή μπορεί να επιβάλλει σωστά και να ταξινομήσει λάθος, και αυτή είναι ακριβώς η αστοχία σε αυτό το άρθρο.

Δώστε στο άγνωστο τη δική του πολιτική

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

ObservationPolicy to specify
Expected SSID is readableThe explicit filtering policy you designed
A different SSID is readableThe default policy for untrusted networks
Unknown, changing or unreadableFail closed until classification is reliable

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

Ένα οικείο SSID είναι ετικέτα, όχι απόδειξη του φορέα του δικτύου. Οποιοσδήποτε μπορεί να στήσει σημείο πρόσβασης με το όνομα του γραφείου, οπότε μια αντιστοιχία ονόματος δεν θα έπρεπε ποτέ να είναι το μόνο πράγμα ανάμεσα σε μια ευαίσθητη συνεδρία και ένα μη αξιόπιστο τμήμα.

Δοκιμάστε τις μεταβάσεις, όχι τη σταθερή κατάσταση

Οι δοκιμές σε σταθερή κατάσταση περνούν στο δίκτυο όπου χτίσατε τον κανόνα. Οι αστοχίες ζουν στις μεταβάσεις: άδεια που αρνήθηκε, Wi-Fi σε κινητό, ένα SSID σε άλλο, υπηρεσία VPN που επανεκκινήθηκε και άλλη εφαρμογή VPN που παίρνει τη διεπαφή. Για καθεμία, αποφασίστε αν οι υπάρχουσες συνδέσεις επανεξετάζονται και αν η προστατευμένη κίνηση μένει μπλοκαρισμένη όσο η κατάσταση είναι άγνωστη.

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

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