VPN Android χωρίς root: ποιος κατέχει τη συγκατάθεση, τις διαδρομές και τον αποκλεισμό
Η συγκατάθεση, η διεπαφή TUN και η πολιτική αποκλεισμού του συστήματος είναι τρεις διαφορετικές άδειες. Εντοπίστε ποιο στοιχείο κατέχει καθεμία πριν ελέγξετε μια εφαρμογή VPN για Android.
Το root δεν είναι αυτό που επιτρέπει σε μια εφαρμογή VPN για Android να μεταφέρει κίνηση, να αποκλείει διαρροές ή να επιβιώνει από επανεκκίνηση. Οι άνθρωποι συνοψίζουν όλα αυτά ως «η εφαρμογή έχει άδεια VPN», που κρύβει τρεις ξεχωριστούς μηχανισμούς: μια συγκατάθεση χρήστη, μια διεπαφή πακέτων που δημιουργεί το σύστημα και μια πολιτική αποκλεισμού της πλατφόρμας που δεν ορίζει η εφαρμογή. Ο έλεγχος ενός σχεδίου VPN για Android σημαίνει να ρωτήσετε σε ποιο από τα τρία στηρίζεται πραγματικά ένας ισχυρισμός, γιατί καθένα έχει διαφορετικό κάτοχο και διαφορετικό τρόπο αποτυχίας.
Η συγκατάθεση έρχεται μέσω δραστηριότητας συστήματος
VpnService.prepare() δεν παραχωρεί τίποτα. Επιστρέφει ένα intent στη δραστηριότητα συγκατάθεσης του συστήματος όταν λείπει η συγκατάθεση, και η εφαρμογή ανοίγει αυτόν τον διάλογο ώστε ο χρήστης να εγκρίνει την υπηρεσία. Η εκκίνηση της δικής της διεργασίας, η προσθήκη άδειας στο manifest ή η εμφάνιση προσαρμοσμένης οθόνης «ενεργοποίηση VPN» δεν δημιουργεί την παραχώρηση.
Η παραχώρηση έχει και εύρος. Ανήκει σε ένα πακέτο μέσα σε προφίλ χρήστη, άρα το προσωπικό αντίγραφο και το αντίγραφο εργασίας είναι ξεχωριστές αποφάσεις, και ο κάτοχος της συσκευής μπορεί να προετοιμάσει ένα διαχειριζόμενο προφίλ διαφορετικά από ένα προσωπικό. Αν ο διάλογος δεν εμφανιστεί ποτέ και το prepare() επιστρέψει null, η συγκατάθεση υπάρχει ήδη για αυτό το πακέτο σε αυτό το προφίλ· δεν είναι απόδειξη ότι η εφαρμογή είναι αξιόπιστη, μόνο ότι η παραχώρηση είναι σε ισχύ.
Η διεπαφή είναι ένα αίτημα που εκπληρώνει το σύστημα
Μετά τη συγκατάθεση, η εφαρμογή περιγράφει τι θέλει με το VpnService.Builder: διευθύνσεις, διαδρομές, διακομιστές DNS, MTU και, όπου υποστηρίζεται, τις εφαρμογές που θα συμπεριληφθούν ή θα εξαιρεθούν. Το establish() ζητά από το σύστημα να δημιουργήσει τη διεπαφή σήραγγας και να δρομολογήσει την αντίστοιχη κίνηση σε αυτήν. Το σύστημα κατέχει την απόφαση δρομολόγησης· η εφαρμογή λαμβάνει τον περιγραφέα αρχείου και πρέπει μετά να κάνει κάτι χρήσιμο με τα πακέτα.
| What you observe | Who actually owns it |
|---|---|
| VPN consent dialog | The system, triggered by prepare() |
| Routes, DNS and app lists | The app requests them; the system applies them |
| One active VPN per profile | The platform; a new service replaces the old one |
| Always-on and block-without-VPN | Device policy enforced by the platform |
Αυτός ο πίνακας είναι η αρχιτεκτονική σε ένα σημείο. Η εφαρμογή συμμετέχει στη διαχείριση πακέτων· δεν κατέχει τη διεπαφή, τον πίνακα δρομολόγησης ή τον αριθμό των υπηρεσιών που επιτρέπεται να εκτελούνται.
Ο υποδοχέας της σήραγγας πρέπει να διαφύγει από τη δική του σήραγγα
Η σύνδεση που μεταφέρει την κρυπτογραφημένη κίνηση είναι η ίδια ένας υποδοχέας. Αν δρομολογηθεί πίσω στη διεπαφή που μόλις δημιούργησε η εφαρμογή, η σήραγγα εξαρτάται από τη σήραγγα και κολλάει. Το VpnService.protect() δεσμεύει αυτόν τον υποδοχέα στο υποκείμενο δίκτυο ώστε να παρακάμπτει τη σύλληψη, και γι' αυτό ένας σωστός πελάτης προστατεύει τον εξωτερικό του υποδοχέα πριν από την πρώτη χειραψία.
adb shell dumpsys connectivity | grep -i -A5 vpn
adb shell settings get global always_on_vpn_app
adb shell settings get global always_on_vpn_lockdown
Αυτές οι εντολές δείχνουν το εγκατεστημένο δίκτυο VPN, το πακέτο μόνιμης ενεργοποίησης και αν έχει οριστεί το κλείδωμα. Είναι παρατηρήσεις μόνο ανάγνωσης: αν οι τιμές δεν ταιριάζουν με όσα ισχυρίζεται το σχέδιο, ο ισχυρισμός αφορά τη διεπαφή της εφαρμογής και όχι την κατάσταση του συστήματος.
Ο αποκλεισμός μπορεί να ανήκει στην πλατφόρμα
Το Android τεκμηριώνει μια πολιτική που αποκλείει συνδέσεις που δεν χρησιμοποιούν το VPN. Αυτή η επιβολή είναι συμβόλαιο της πλατφόρμας, όχι εφαρμογή που επαναλαμβάνει προσπάθειες σύνδεσης σε βρόχο. Ο διακόπτης βρίσκεται στις ρυθμίσεις VPN της συσκευής ως Αποκλεισμός συνδέσεων χωρίς VPN, και σε διαχειριζόμενη συσκευή ο κάτοχος μπορεί να τον ενεργοποιήσει για όλο το προφίλ. Η διάκριση μετράει όταν αξιολογείτε έναν ισχυρισμό μάρκετινγκ: ένας πελάτης μπορεί να δείχνει εικονίδιο λουκέτου και να επανασυνδέεται επιθετικά ενώ η άμεση κίνηση παραμένει δυνατή, ή οι καλυπτόμενες εφαρμογές μπορεί να μένουν εκτός σύνδεσης επειδή το σύστημα επιβάλλει το κλείδωμα.
Το εικονίδιο λουκέτου το σχεδιάζει η εφαρμογή, οπότε αποδεικνύει μόνο ότι η εφαρμογή πιστεύει πως είναι συνδεδεμένη. Το αν μια άλλη εφαρμογή χάσει την πρόσβαση δικτύου το αποφασίζει η πλατφόρμα, άρα ο χρήσιμος έλεγχος είναι να δείτε εκείνη την εφαρμογή να αποτυγχάνει όσο η σήραγγα είναι ενεργή.
Ούτε η ετικέτα «μόνιμη ενεργοποίηση» από το κατάστημα εφαρμογών αντικαθιστά αυτό το συμβόλαιο. Η μόνιμη ενεργοποίηση και το κλείδωμα είναι ρυθμίσεις συσκευής, συχνά εφαρμοσμένες από κάτοχο συσκευής, και η συμπεριφορά τους για εξαιρεμένες εφαρμογές ορίζεται από την πλατφόρμα. Διαβάστε τη ρύθμιση, όχι το σήμα.
Τέσσερις ερωτήσεις για έλεγχο σχεδίου
Πρώτον, ποιος έδωσε συγκατάθεση: ποιο πακέτο, ποιο προφίλ και ήταν ο χρήστης ή πολιτική διαχειριζόμενης συσκευής; Δεύτερον, τι ζήτησε η εφαρμογή: ποιες διαδρομές, ποιες οικογένειες διευθύνσεων, ποιες εφαρμογές συμπεριλήφθηκαν ή εξαιρέθηκαν; Τρίτον, τι συμβαίνει όταν η σήραγγα δεν είναι διαθέσιμη: αποκλείει το σύστημα ή η κίνηση πέφτει πίσω στο υποκείμενο δίκτυο; Τέταρτον, τι κάνει η εφαρμογή με τα πακέτα που λαμβάνει;
Η τέταρτη ερώτηση είναι αυτή που το μοντέλο αδειών δεν μπορεί να απαντήσει. Η συγκατάθεση και μια διεπαφή TUN αποδεικνύουν ότι η εφαρμογή μπορεί να λάβει κίνηση, όχι ότι την κρυπτογραφεί, ταυτοποιεί τον ομότιμο ή ανακάμπτει καθαρά. Αυτές είναι ιδιότητες υλοποίησης, και εκεί ένας έντιμος έλεγχος περνά τον χρόνο του.
Ένα περιττό αίτημα root δεν γίνεται νόμιμο επειδή το αποτέλεσμα ονομάζεται διακόπτης ασφαλείας, και ένας διάλογος συγκατάθεσης δεν είναι έλεγχος ασφαλείας. Κρατήστε τις τρεις παραχωρήσεις ξεχωριστά και κάθε ισχυρισμός γίνεται ελεγχόμενος.