Blokuokite atvirą tekstą Android programėlėse nepasikliaudami VPN
Atviras tekstas naudingųjų duomenų dalyje ir atviras tekstas kelyje yra dvi skirtingos problemos. Pirmąją išspręskite programėlėje, antrąją – tuneliu arba įrenginio politika.
Du visiškai skirtingi dalykai vadinami atviro teksto blokavimu Android sistemoje. Vienas yra programėlės viduje esanti politika, liepianti jos pačios tinklo dėklui atsisakyti paprasto HTTP. Kitas yra įrenginio lygmens sprendimas, bandantis apsaugoti viską telefone iš karto, dažniausiai nukreipiant srautą per VPN. Jie sprendžia skirtingas problemas, o antrasis negali pataisyti pirmojo: tunelis saugo atkarpą tarp telefono ir išėjimo, o HTTP kalbanti programėlė ir toliau kalba HTTP su viskuo, kas yra už to išėjimo.
Dvi problemos po vienu pavadinimu
Pirmoji problema yra naudingoji dalis: programėlė įrašo prisijungimo duomenis arba žetonus į užklausą, kuri nėra šifruojama nuo galo iki galo, todėl kiekvienas šuolis, galintis ją matyti, gali ją perskaityti. Antroji yra kelias: programėlė gali būti visiškai tvarkinga, o jūs vis tiek norite, kad vietinis Wi-Fi operatorius nieko nesužinotų apie tai, kur ji jungiasi. VPN sprendžia antrąją ir tik antrąją.
Šis skirtumas nulemia, kam priklauso pataisa. Naudingoji dalis priklauso tam, kas pateikia programėlę, nes tik tas kodas nusprendžia, kuris URL iškviečiamas ir ar tikrinamas sertifikatas. Kelias priklauso įrenginiui arba tinklui, nes kalbama apie tai, kur keliauja paketai, o ne ką jie turi.
Pirmas kelias: programėlė, kurią kontroliuojate
Jei pateikiate programėlę, pataisa yra transporto sprendimas ir jį įgyvendinanti politika. Nukreipkite kiekvieną galinį tašką į HTTPS, palikite įjungtą prieglobos vardo ir sertifikato tikrinimą, o paprasto HTTP atsarginį kelią ištrinkite, o ne palikite jį vieno konfigūracijos vėliavėlės atstumu. Nukreipimas čia nepadeda: HTTP užklausa, gaunanti 301, jau išsiuntė antraštes ir turinį atvirai, todėl prisijungimo duomenys niekada neturi keliauti tikint, kad nukreipimas juos apsaugos.
Nuo Android 7.0 politiką išreiškia Network Security Configuration. Toliau esantis failas yra mažiausia naudinga versija: jis atsisako atviro teksto visur, nebent konkretaus domeno išimtis sako kitaip.
<network-security-config>
<base-config cleartextTrafficPermitted="false" />
</network-security-config>Nurodykite tą išteklių manifeste, o prieš pateikdami perskaitykite jau esančias išimtis. Senas derinimo domenas arba mokėjimo teikėjo SDK įrašas gali tyliai vėl leisti atvirą tekstą tam prieglobai, kurią bandėte apsaugoti.
Verta žinoti dvi versijos detales. Programėlės, skirtos API 28 ar naujesnei, jau pagal nutylėjimą atsisako atviro teksto, todėl programėlė, kuri dar kalba paprastu HTTP, arba taiko senesnį API lygį, arba kažkur turi išimtį. O kai yra tinklo saugos konfigūracija, senesnis android:usesCleartextTraffic manifesto atributas nebelemia šio klausimo, todėl kartais atrodo, kad tos vėliavėlės keitimas nieko nedaro.
Antras kelias: programėlė, kurios nekontroliuojate
Įdiegtos trečiosios šalies programėlės saugos konfigūracijos negalite perrašyti naudotojo nustatymu. Realios galimybės yra pačio produkto saugaus ryšio valdikliai, palaikoma alternatyva, jau naudojanti TLS, arba valdomo įrenginio politika, ribojanti, ką įrenginys gali vykdyti. Tai skirtingi įsipareigojimai, ir tik trečiasis išsiplečia į įrenginių parką.
Tinklo taisyklės yra silpnesni pakaitalai, nei atrodo. Leidimas tik 443 prievadui neįgyvendina autentifikuoto TLS, nes daug atviro teksto protokolų galima perkelti į tą prievadą, o 80 prievado blokavimas neapima atviro teksto kituose prievaduose. Naršyklės režimas tik-HTTPS taip pat ribojamas ta naršykle, o ne atskira pašto ar pokalbių programėle tame pačiame telefone.
Perėmimo sertifikato įdiegimas, kad srautas atrodytų šifruotas, yra pasitikėjimo pakeitimas, o ne pataisa. Jis pakeičia programėlės serverio autentifikavimą jūsiškiu, o programėlė, kuri iš pradžių netikrino sertifikatų, tuo nepataisoma; jūs tik perkėlėte, kas gali skaityti srautą.
Kur VPN padeda, o kur ne
Tunelis yra tinkamas įrankis, kai reikalavimas yra, kad vietinis tinklas nieko nesužinotų apie ryšį, arba kad programėlė pasiektų privatų servisą, kurio kitaip nepasiekia. Tai netinkamas įrankis priversti HTTP klientą kalbėti HTTPS, nes užklausa palieka tunelį lygiai tokia, kokia į jį įėjo.
Android prideda praktinį apribojimą: platforma vienu metu paleidžia tik vieną VPN paslaugą. Vietinė filtravimo programėlė, užimanti tą vietą, konkuruoja su nuotoliniu tuneliu, kurio jums tikrai reikia, o perjungimas tarp jų yra įrenginio, o ne programėlės lygmens veiksmas. Ta viena vieta yra gera priežastis laikyti naudingosios dalies politiką programėlėje, o tunelį skirti keliui.
Vienintelis atvejis, kai abu persidengia, yra privatus serveris, kurį taip pat valdote. Ten tunelis gali padaryti kelią privatų, nors protokolas vis dar atviras tekstas, o tai mažina poveikį, bet nekeičia, kas yra naudingoji dalis. Traktuokite tai kaip rizikos mažinimą, o ne duomenų šifravimą.
Ką patikrinti prieš pavadinant tai užblokuotu
Pradėkite nuo nutylėjimo, kuris stebina žmones: programėlė, skirta API 28 ar naujesnei, jau turėtų atsisakyti atviro teksto, todėl patikrinkite tikslinį lygį prieš pridėdami konfigūraciją, kuri dubliuoja nutylėjimą. Tada sąmoningai patikrinkite nesėkmės atvejį: užklausa į paprastą HTTP prieglobą turi nepavykti, o ne tyliai pavykti per atsarginį kelią.
adb shell dumpsys package com.example.app | grep -E 'targetSdk|versionName'
adb logcat | grep -i cleartextSėkmės atveju patvirtinkite, kad HTTPS iškvietimas tikrina tikrą sertifikatų grandinę ir kad tarpinė su nepatikimu sertifikatu atmetama, o ne toleruojama. Rankos paspaudimas, pavykstantis su bet kokiu sertifikatu, nieko neįrodė apie transporto saugą.
Trečiosios šalies programėlei užrašykite ribą, kurią tikrai galite įgyvendinti, ar tai būtų valdomo įrenginio politika, tinklo taisyklė, ar nieko, ir pasakykite tai priėmimo kriterijuose. Android saugos konfigūracijos vadove išvardyti platformos nutylėjimai ir tai, kurie komponentai laikosi politikos, ir būtent ši dalis nulemia, ar jūsų konfigūracija apskritai ką nors daro.