Dvije se vrlo različite stvari nazivaju blokiranjem čistog teksta na Androidu. Jedna je politika unutar aplikacije koja nalaže njenom mrežnom stogu da odbije obični HTTP. Druga je uređenje na razini uređaja koje pokušava zaštititi sve na telefonu odjednom, obično usmjeravanjem prometa kroz VPN. One rješavaju različite probleme, a druga ne može popraviti prvu: tunel štiti dionicu između telefona i izlaza, dok aplikacija koja govori HTTP i dalje govori HTTP sa svime što stoji iza tog izlaza.

Dva problema pod jednim imenom

Prvi problem je sadržaj: aplikacija upisuje vjerodajnice ili tokene u zahtjev koji nije šifriran od početka do kraja, pa ga svaki skok koji ga vidi može pročitati. Drugi je put: aplikacija može biti potpuno ispravna, a vi ipak želite da lokalni Wi-Fi operater ne sazna ništa o tome kamo se povezuje. VPN rješava drugi i samo drugi.

Ta razlika određuje vlasnika popravka. Sadržaj pripada onome ko isporučuje aplikaciju, jer samo taj kod odlučuje koji se URL poziva i provjerava li se certifikat. Put pripada uređaju ili mreži, jer se radi o tome kamo paketi putuju, a ne što sadrže.

Put prvi: aplikacija koju kontrolišete

Ako isporučujete aplikaciju, popravak je transportna odluka plus politika koja je provodi. Usmjerite svaku krajnju točku na HTTPS, zadržite provjeru imena hosta i certifikata uključenom i izbrišite rezervnu varijantu s običnim HTTP-om, umjesto da je ostavite na udaljenosti jednog konfiguracijskog flaga. Preusmjeravanje ovdje ne pomaže: HTTP zahtjev koji dobije 301 već je poslao zaglavlja i tijelo otvoreno, pa vjerodajnice nikada ne smiju putovati uz pretpostavku da će ih preusmjeravanje zaštititi.

Na Androidu 7.0 i novijem politiku izražava Network Security Configuration. Datoteka ispod najmanja je korisna verzija: odbija čisti tekst svugdje osim ako izuzetak za pojedinu domenu ne kaže drugačije.

<network-security-config>
    <base-config cleartextTrafficPermitted="false" />
</network-security-config>

Upućujte na taj resurs iz manifesta, pa pročitajte izuzetke koji već postoje prije isporuke. Stara domena za otklanjanje pogrešaka ili unos SDK-a pružatelja plaćanja može tiho ponovno dopustiti čisti tekst za host koji ste pokušavali zaštititi.

Dva detalja o verzijama vrijedi znati. Aplikacije usmjerene na API 28 ili noviji već standardno odbijaju čisti tekst, pa aplikacija koja još govori obični HTTP ili cilja stariju razinu API-ja ili negdje ima izuzetak. A kada je konfiguracija mrežne sigurnosti prisutna, stari atribut manifesta android:usesCleartextTraffic više ne odlučuje o pitanju, zbog čega se ponekad čini da promjena tog flaga ne radi ništa.

Put drugi: aplikacija koju ne kontrolišete

Za instaliranu aplikaciju treće strane ne možete prepisati njezinu sigurnosnu konfiguraciju korisničkom postavkom. Realne su opcije proizvodove vlastite kontrole sigurne veze, održavana alternativa koja već koristi TLS ili politika upravljanog uređaja koja ograničava što uređaj smije pokretati. To su različite obveze, a samo treća skalira na cijeli park uređaja.

Mrežna su pravila slabije zamjene nego što izgledaju. Dopuštanje samo porta 443 ne provodi autentificirani TLS, jer se mnogi protokoli čistog teksta mogu premjestiti na taj port, a blokiranje porta 80 ne pokriva čisti tekst na drugim portovima. Ni način rada samo HTTPS u pregledniku ograničen je na taj preglednik, ne vrijedi za zasebnu aplikaciju za poštu ili chat na istom telefonu.

Instaliranje certifikata za presretanje da bi promet izgledao šifriran promjena je povjerenja, ne popravak. Zamjenjuje provjeru poslužitelja aplikacije svojom, a aplikacija koja od početka nije provjeravala certifikate time se ne popravlja; samo ste premjestili tko može čitati tok.

Gdje VPN pomaže, a gdje ne

Tunel je pravi alat kada je zahtjev da lokalna mreža ne sazna ništa o vezi ili da aplikacija dosegne privatnu uslugu do koje inače ne može. Pogrešan je alat za tjeranje HTTP klijenta da govori HTTPS, jer zahtjev napušta tunel točno onakav kakav je ušao.

Android dodaje praktično ograničenje: platforma pokreće samo jednu VPN uslugu odjednom. Lokalna aplikacija za filtriranje koja zauzme to mjesto natječe se s udaljenim tunelom koji vam stvarno treba, a prebacivanje među njima operacija je na razini uređaja, ne aplikacije. To jedno mjesto dobar je razlog da politiku sadržaja stavite u aplikaciju, a tunel zadržite za put.

Jedini slučaj u kojem se dvije stvari preklapaju jest privatni poslužitelj koji i sami vodite. Ondje tunel može učiniti put privatnim iako je protokol još čisti tekst, što smanjuje izloženost, ali ne mijenja ono što sadržaj jest. Tretirajte to kao smanjenje rizika, ne kao šifriranje podataka.

Što testirati prije nego što to nazovete blokiranim

Počnite sa zadanim ponašanjem koje ljude iznenadi: aplikacija usmjerena na API 28 ili noviji već bi trebala odbijati čisti tekst, pa provjerite ciljnu razinu prije dodavanja konfiguracije koja duplicira zadano. Zatim namjerno testirajte slučaj neuspjeha: zahtjev prema običnom HTTP hostu mora propasti, a ne tiho uspjeti kroz rezervnu varijantu.

adb shell dumpsys package com.example.app | grep -E 'targetSdk|versionName'
adb logcat | grep -i cleartext

Za slučaj uspjeha potvrdite da HTTPS poziv provjerava stvarni lanac certifikata i da se proxy s nepouzdanim certifikatom odbija, a ne tolerira. Rukovanje koje uspije s bilo kojim certifikatom nije dokazalo ništa o sigurnosti transporta.

Za aplikaciju treće strane zapišite granicu koju stvarno možete provesti, bila to politika upravljanog uređaja, mrežno pravilo ili ništa, i navedite to u kriterijima prihvaćanja. Vodič kroz Android sigurnosnu konfiguraciju navodi zadane postavke platforme i koje komponente poštuju politiku, a to je dio koji odlučuje radi li vaša konfiguracija uopće išta.

Povezani članci