Μπλοκάρετε το απλό κείμενο σε εφαρμογές Android χωρίς να βασίζεστε σε VPN
Το απλό κείμενο στο φορτίο και το απλό κείμενο στη διαδρομή είναι διαφορετικά προβλήματα. Διορθώστε το πρώτο στην εφαρμογή και το δεύτερο με σήραγγα ή πολιτική συσκευής.
Δύο εντελώς διαφορετικά πράγματα ονομάζονται μπλοκάρισμα απλού κειμένου στο Android. Το ένα είναι μια πολιτική μέσα σε μια εφαρμογή που λέει στη δική της στοίβα δικτύου να αρνείται το απλό HTTP. Το άλλο είναι μια ρύθμιση σε επίπεδο συσκευής που προσπαθεί να προστατεύσει τα πάντα στο τηλέφωνο ταυτόχρονα, συνήθως δρομολογώντας την κίνηση μέσω VPN. Λύνουν διαφορετικά προβλήματα και το δεύτερο δεν μπορεί να διορθώσει το πρώτο: μια σήραγγα προστατεύει το τμήμα μεταξύ τηλεφώνου και εξόδου, ενώ μια εφαρμογή που μιλά HTTP εξακολουθεί να μιλά HTTP με ό,τι βρίσκεται πέρα από αυτή την έξοδο.
Δύο προβλήματα με ένα όνομα
Το πρώτο πρόβλημα είναι το φορτίο: η εφαρμογή γράφει διαπιστευτήρια ή διακριτικά σε ένα αίτημα που δεν είναι κρυπτογραφημένο από άκρη σε άκρη, οπότε κάθε κόμβος που μπορεί να το δει μπορεί να το διαβάσει. Το δεύτερο είναι η διαδρομή: η εφαρμογή μπορεί να είναι απολύτως σωστή και εσείς πάλι θέλετε ο τοπικός πάροχος Wi-Fi να μην μάθει τίποτα για το πού συνδέεται. Ένα VPN αντιμετωπίζει το δεύτερο και μόνο το δεύτερο.
Αυτή η διάκριση καθορίζει σε ποιον ανήκει η διόρθωση. Το φορτίο ανήκει σε όποιον διανέμει την εφαρμογή, γιατί μόνο αυτός ο κώδικας αποφασίζει ποιο URL καλείται και αν επικυρώνεται πιστοποιητικό. Η διαδρομή ανήκει στη συσκευή ή στο δίκτυο, γιατί αφορά το πού ταξιδεύουν τα πακέτα, όχι τι περιέχουν.
Διαδρομή πρώτη: η εφαρμογή που ελέγχετε
Αν διανέμετε την εφαρμογή, η διόρθωση είναι μια απόφαση μεταφοράς μαζί με μια πολιτική που την επιβάλλει. Στρέψτε κάθε τελικό σημείο σε HTTPS, κρατήστε ενεργή την επικύρωση ονόματος κεντρικού υπολογιστή και πιστοποιητικού, και διαγράψτε την εφεδρική διαδρομή με απλό HTTP αντί να την αφήσετε ένα flag διαμόρφωσης μακριά. Μια ανακατεύθυνση δεν βοηθά εδώ: ένα αίτημα HTTP που λαμβάνει 301 έχει ήδη στείλει τις κεφαλίδες και το σώμα του ανοιχτά, οπότε τα διαπιστευτήρια δεν πρέπει ποτέ να ταξιδεύουν με την υπόθεση ότι η ανακατεύθυνση θα τα προστατεύσει.
Στο Android 7.0 και νεότερο, το Network Security Configuration εκφράζει την πολιτική. Το αρχείο παρακάτω είναι η μικρότερη χρήσιμη έκδοση: αρνείται το απλό κείμενο παντού εκτός αν μια εξαίρεση για συγκεκριμένο τομέα λέει άλλα.
<network-security-config>
<base-config cleartextTrafficPermitted="false" />
</network-security-config>Αναφερθείτε σε αυτόν τον πόρο από το manifest και μετά διαβάστε τις εξαιρέσεις που υπάρχουν ήδη πριν τη διανομή. Ένας παλιός τομέας αποσφαλμάτωσης ή μια καταχώριση SDK παρόχου πληρωμών μπορεί να επιτρέψει ξανά σιωπηλά απλό κείμενο για τον κεντρικό υπολογιστή που προσπαθούσατε να προστατεύσετε.
Δύο λεπτομέρειες έκδοσης αξίζει να τις ξέρετε. Οι εφαρμογές που στοχεύουν API 28 ή νεότερο αρνούνται ήδη εξ ορισμού το απλό κείμενο, οπότε μια εφαρμογή που ακόμη μιλά απλό HTTP είτε στοχεύει παλαιότερο επίπεδο API είτε έχει κάπου εξαίρεση. Και όταν υπάρχει διαμόρφωση ασφάλειας δικτύου, το παλαιότερο χαρακτηριστικό manifest android:usesCleartextTraffic δεν αποφασίζει πια το ζήτημα, γι αυτό μερικές φορές η αλλαγή αυτού του flag φαίνεται να μην κάνει τίποτα.
Διαδρομή δεύτερη: η εφαρμογή που δεν ελέγχετε
Για μια εγκατεστημένη εφαρμογή τρίτου, δεν μπορείτε να ξαναγράψετε τη διαμόρφωση ασφάλειάς της μέσω ρύθμισης χρήστη. Οι ρεαλιστικές επιλογές είναι οι δικοί της έλεγχοι ασφαλούς σύνδεσης, μια συντηρούμενη εναλλακτική που χρησιμοποιεί ήδη TLS, ή μια πολιτική διαχειριζόμενης συσκευής που περιορίζει τι επιτρέπεται να εκτελεί η συσκευή. Αυτές είναι διαφορετικές δεσμεύσεις και μόνο η τρίτη κλιμακώνεται σε στόλο.
Οι κανόνες δικτύου είναι ασθενέστερα υποκατάστατα απ ό,τι φαίνονται. Το να επιτρέπεται μόνο η θύρα 443 δεν επιβάλλει πιστοποιημένο TLS, αφού πολλά πρωτόκολλα απλού κειμένου μπορούν να μεταφερθούν σε αυτή τη θύρα, και ο αποκλεισμός της θύρας 80 δεν καλύπτει απλό κείμενο σε άλλες θύρες. Η λειτουργία μόνο-HTTPS ενός προγράμματος περιήγησης περιορίζεται επίσης σε αυτό, όχι σε ξεχωριστή εφαρμογή mail ή συνομιλίας στο ίδιο τηλέφωνο.
Η εγκατάσταση πιστοποιητικού παρεμβολής για να φαίνεται η κίνηση κρυπτογραφημένη είναι αλλαγή εμπιστοσύνης, όχι διόρθωση. Αντικαθιστά την αυθεντικοποίηση διακομιστή της εφαρμογής με τη δική σας, και μια εφαρμογή που δεν επικύρωνε πιστοποιητικά εξ αρχής δεν διορθώνεται έτσι· απλώς μετακινήσατε το ποιος μπορεί να διαβάσει τη ροή.
Πού βοηθά ένα VPN και πού όχι
Μια σήραγγα είναι το σωστό εργαλείο όταν η απαίτηση είναι το τοπικό δίκτυο να μη μάθει τίποτα για τη σύνδεση, ή η εφαρμογή να φτάσει μια ιδιωτική υπηρεσία που αλλιώς δεν φτάνει. Είναι το λάθος εργαλείο για να κάνει ένας πελάτης HTTP να μιλά HTTPS, γιατί το αίτημα φεύγει από τη σήραγγα ακριβώς όπως μπήκε.
Το Android προσθέτει έναν πρακτικό περιορισμό: η πλατφόρμα εκτελεί μία μόνο υπηρεσία VPN κάθε φορά. Μια τοπική εφαρμογή φιλτραρίσματος που παίρνει αυτή τη θέση ανταγωνίζεται τη σήραγγα απομακρυσμένης πρόσβασης που πραγματικά χρειάζεστε, και η εναλλαγή μεταξύ τους είναι λειτουργία επιπέδου συσκευής και όχι εφαρμογής. Αυτή η μία θέση είναι καλός λόγος να βάλετε την πολιτική φορτίου στην εφαρμογή και να κρατήσετε τη σήραγγα για τη διαδρομή.
Η μόνη περίπτωση που τα δύο επικαλύπτονται είναι ένας ιδιωτικός διακομιστής που λειτουργείτε κι εσείς. Εκεί μια σήραγγα μπορεί να κάνει τη διαδρομή ιδιωτική ακόμη κι αν το πρωτόκολλο είναι ακόμη απλό κείμενο, κάτι που μειώνει την έκθεση αλλά δεν αλλάζει τι είναι το φορτίο. Αντιμετωπίστε το ως μείωση κινδύνου, όχι ως κρυπτογράφηση των δεδομένων.
Τι να δοκιμάσετε πριν το χαρακτηρίσετε μπλοκαρισμένο
Ξεκινήστε με την προεπιλογή που εκπλήσσει: μια εφαρμογή που στοχεύει API 28 ή νεότερο θα έπρεπε ήδη να αρνείται το απλό κείμενο, οπότε ελέγξτε το επίπεδο στόχου πριν προσθέσετε διαμόρφωση που αντιγράφει μια προεπιλογή. Έπειτα δοκιμάστε σκόπιμα την περίπτωση αποτυχίας: ένα αίτημα σε απλό κεντρικό υπολογιστή HTTP πρέπει να αποτυγχάνει και όχι να πετυχαίνει σιωπηλά μέσω εφεδρικής διαδρομής.
adb shell dumpsys package com.example.app | grep -E 'targetSdk|versionName'
adb logcat | grep -i cleartextΓια την περίπτωση επιτυχίας, επιβεβαιώστε ότι η κλήση HTTPS επικυρώνει πραγματική αλυσίδα πιστοποιητικών και ότι ένας μεσολαβητής με μη έμπιστο πιστοποιητικό απορρίπτεται αντί να γίνεται ανεκτός. Μια χειραψία που πετυχαίνει με οποιοδήποτε πιστοποιητικό δεν έχει αποδείξει τίποτα για την ασφάλεια μεταφοράς.
Για μια εφαρμογή τρίτου, γράψτε το όριο που μπορείτε πραγματικά να επιβάλετε, είτε είναι πολιτική διαχειριζόμενης συσκευής είτε κανόνας δικτύου είτε τίποτα, και πείτε το στα κριτήρια αποδοχής. Ο οδηγός διαμόρφωσης ασφάλειας του Android απαριθμεί τις προεπιλογές της πλατφόρμας και ποια στοιχεία σέβονται την πολιτική, και αυτό είναι το μέρος που καθορίζει αν η διαμόρφωσή σας κάνει τελικά κάτι.