Blokujte čistý text v aplikáciách Android bez spoliehania sa na VPN
Čistý text v obsahu a čistý text na ceste sú dva rôzne problémy. Prvý vyriešte v aplikácii, druhý tunelom alebo zásadou zariadenia.
Dve veľmi odlišné veci sa nazývajú blokovaním čistého textu na Androide. Jedna je zásada vnútri aplikácie, ktorá prikazuje jej vlastnému sieťovému zásobníku odmietať obyčajné HTTP. Druhá je usporiadanie na úrovni zariadenia, ktoré sa snaží ochrániť všetko v telefóne naraz, zvyčajne smerovaním prevádzky cez VPN. Riešia rôzne problémy a druhá nemôže opraviť prvú: tunel chráni úsek medzi telefónom a výstupom, zatiaľ čo aplikácia, ktorá hovorí HTTP, hovorí HTTP aj s tým, čo je za týmto výstupom.
Dva problémy pod jedným menom
Prvý problém je obsah: aplikácia zapisuje prihlasovacie údaje alebo tokeny do požiadavky, ktorá nie je šifrovaná od konca do konca, takže každý skok, ktorý ju vidí, ju môže prečítať. Druhý je cesta: aplikácia môže byť úplne bezchybná a vy napriek tomu chcete, aby sa miestny operátor Wi-Fi nedozvedel nič o tom, kam sa pripája. VPN rieši druhý a len druhý.
Toto rozlíšenie určuje vlastníka opravy. Obsah patrí tomu, kto aplikáciu dodáva, pretože len ten kód rozhoduje, ktorá URL sa volá a či sa overuje certifikát. Cesta patrí zariadeniu alebo sieti, pretože ide o to, kam pakety putujú, nie čo obsahujú.
Cesta prvá: aplikácia, ktorú ovládate
Ak aplikáciu dodávate, opravou je rozhodnutie o transporte plus zásada, ktorá ho presadzuje. Nasmerujte každý koncový bod na HTTPS, ponechajte overovanie názvu hostiteľa a certifikátu zapnuté a odstráňte záložnú cestu s obyčajným HTTP namiesto toho, aby ste ju nechali na dosah jedného konfiguračného prepínača. Presmerovanie tu nepomôže: požiadavka HTTP, ktorá dostane 301, už odoslala hlavičky a telo otvorene, takže prihlasovacie údaje nikdy nesmú putovať s predpokladom, že ich presmerovanie ochráni.
V Androide 7.0 a novšom vyjadruje zásadu Network Security Configuration. Súbor nižšie je najmenšia užitočná verzia: odmieta čistý text všade, ak výnimka pre konkrétnu doménu nehovorí inak.
<network-security-config>
<base-config cleartextTrafficPermitted="false" />
</network-security-config>Odkazujte na tento prostriedok z manifestu a potom si pred dodaním prečítajte výnimky, ktoré už existujú. Stará ladiaca doména alebo záznam SDK poskytovateľa platieb môže ticho znova povoliť čistý text pre hostiteľa, ktorého ste sa snažili ochrániť.
Dva detaily k verzii stoja za to vedieť. Aplikácie cielené na API 28 alebo novšie už štandardne odmietajú čistý text, takže aplikácia, ktorá stále hovorí obyčajným HTTP, buď cieli na staršiu úroveň API, alebo má niekde výnimku. A keď je prítomná konfigurácia zabezpečenia siete, starší atribút manifestu android:usesCleartextTraffic už otázku nerozhoduje, a preto sa niekedy zdá, že zmena tohto prepínača nič nerobí.
Cesta druhá: aplikácia, ktorú neovládate
Pri nainštalovanej aplikácii tretej strany nemôžete prepísať jej konfiguráciu zabezpečenia používateľským nastavením. Reálne možnosti sú vlastné ovládacie prvky zabezpečeného pripojenia daného produktu, udržiavaná alternatíva, ktorá už používa TLS, alebo zásada spravovaného zariadenia, ktorá obmedzuje, čo zariadenie smie spúšťať. To sú rôzne záväzky a len tretí sa škáluje na celú flotilu.
Sieťové pravidlá sú slabšou náhradou, než sa zdá. Povolenie len portu 443 nevynucuje overený TLS, pretože na tento port možno presunúť mnoho protokolov s čistým textom, a blokovanie portu 80 nepokrýva čistý text na iných portoch. Režim iba HTTPS v prehliadači je tiež obmedzený na ten prehliadač, nie na samostatnú aplikáciu pošty alebo chatu v tom istom telefóne.
Inštalácia zachytávacieho certifikátu, aby prevádzka vyzerala šifrovane, je zmena dôvery, nie oprava. Nahrádza overovanie servera aplikácie vaším a aplikáciu, ktorá certifikáty od začiatku neoverovala, to neopraví; len ste presunuli, kto môže čítať tok.
Kde VPN pomáha a kde nie
Tunel je správny nástroj, keď je požiadavkou, aby sa miestna sieť nedozvedela nič o spojení, alebo aby aplikácia dosiahla súkromnú službu, na ktorú sa inak nedostane. Je to nesprávny nástroj na to, aby HTTP klient hovoril HTTPS, pretože požiadavka opúšťa tunel presne taká, aká doň vstúpila.
Android pridáva praktické obmedzenie: platforma spúšťa vždy len jednu službu VPN. Miestna filtračná aplikácia, ktorá toto miesto zaberie, súťaží so vzdialeným tunelom, ktorý skutočne potrebujete, a prepínanie medzi nimi je operácia na úrovni zariadenia, nie aplikácie. To jediné miesto je dobrý dôvod mať zásadu obsahu v aplikácii a tunel si nechať pre cestu.
Jediný prípad, keď sa obe prekrývajú, je súkromný server, ktorý tiež prevádzkujete. Tam môže tunel sprivatizovať cestu, aj keď protokol je stále čistý text, čo znižuje expozíciu, ale nemení to, čím obsah je. Berte to ako zníženie rizika, nie ako šifrovanie údajov.
Čo otestovať, kým to nazvete zablokovaným
Začnite s predvoleným nastavením, ktoré ľudí prekvapí: aplikácia cielená na API 28 alebo novšie by už mala odmietať čistý text, takže skontrolujte cieľovú úroveň, kým pridáte konfiguráciu, ktorá duplikuje predvolené nastavenie. Potom úmyselne otestujte prípad zlyhania: požiadavka na obyčajného hostiteľa HTTP musí zlyhať, nie ticho uspieť cez záložnú cestu.
adb shell dumpsys package com.example.app | grep -E 'targetSdk|versionName'
adb logcat | grep -i cleartextPri prípade úspechu overte, že volanie HTTPS overuje skutočný reťazec certifikátov a že proxy s nedôveryhodným certifikátom je odmietnutá, nie tolerovaná. Spojenie, ktoré uspeje s akýmkoľvek certifikátom, o bezpečnosti prenosu nič nedokázalo.
Pri aplikácii tretej strany zapíšte hranicu, ktorú skutočne môžete presadiť, či už je to zásada spravovaného zariadenia, sieťové pravidlo alebo nič, a uveďte to v kritériách prijatia. Príručka konfigurácie zabezpečenia v Androide uvádza predvolené hodnoty platformy a to, ktoré komponenty zásadu dodržiavajú, a práve táto časť rozhoduje, či vaša konfigurácia vôbec niečo robí.