Две сосема различни нешта се нарекуваат блокирање отворен текст на Android. Едното е политика внатре во апликацијата која ѝ наредува на сопствениот мрежен стек да одбива обичен HTTP. Другото е уредување на ниво на уред што се обидува да го заштити сето на телефонот одеднаш, најчесто со пренасочување на сообраќајот низ VPN. Тие решаваат различни проблеми, а второто не може да го поправи првото: тунелот го штити делот меѓу телефонот и излезот, додека апликацијата што зборува HTTP продолжува да зборува HTTP со сè што е зад тој излез.

Два проблема под едно име

Првиот проблем е товарот: апликацијата запишува акредитиви или токени во барање што не е шифрирано од крај до крај, па секој скок што може да го види може да го прочита. Вториот е патеката: апликацијата може да биде сосема коректна, а вие сепак сакате локалниот Wi-Fi оператор да не дознае ништо за тоа каде се поврзува. VPN го решава вториот и само вториот.

Таа разлика го одредува сопственикот на поправката. Товарот му припаѓа на тој што ја доставува апликацијата, бидејќи само тој код одлучува кој URL се повикува и дали се валидира сертификат. Патеката му припаѓа на уредот или на мрежата, бидејќи се работи за тоа каде патуваат пакетите, а не што содржат.

Прва патека: апликацијата што ја контролирате

Ако ја доставувате апликацијата, поправката е транспортна одлука плус политика што ја спроведува. Насочете ја секоја крајна точка кон HTTPS, оставете валидацијата на име на домаќин и сертификат вклучена и избришете го резервниот пат со обичен HTTP наместо да го оставите едно конфигурациско знаменце подалеку. Пренасочувањето не помага тука: HTTP барање што добива 301 веќе ги испратило заглавјата и телото отворено, така што акредитивите никогаш не смеат да патуваат со претпоставка дека пренасочувањето ќе ги заштити.

Од Android 7.0, политиката ја изразува Network Security Configuration. Податотеката подолу е најмалата корисна верзија: одбива отворен текст насекаде освен ако исклучок за конкретен домен не каже поинаку.

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

Упатете се на тој ресурс од манифестот, потоа прочитајте ги исклучоците што веќе постојат пред да доставите. Стар домен за отстранување грешки или запис на SDK од давател на плаќања може тивко повторно да дозволи отворен текст за домаќинот што се обидовте да го заштитите.

Два деталја за верзијата вреди да се знаат. Апликациите насочени кон API 28 или поново веќе стандардно одбиваат отворен текст, така што апликација што сè уште зборува обичен HTTP или цели кон постаро ниво на API или има исклучок некаде. И кога има конфигурација за мрежна безбедност, постариот атрибут на манифестот android:usesCleartextTraffic повеќе не го одлучува прашањето, поради што менувањето на тоа знаменце понекогаш изгледа дека не прави ништо.

Втора патека: апликацијата што не ја контролирате

За инсталирана апликација од трета страна не можете да ја препишете нејзината безбедносна конфигурација преку корисничка поставка. Реалните опции се сопствените контроли за безбедно поврзување на производот, одржувана алтернатива што веќе користи TLS, или политика за управуван уред што ограничува што смее да извршува уредот. Тоа се различни обврски, и само третата се шири на парк уреди.

Мрежните правила се послаби замени отколку што изгледаат. Дозволувањето само порта 443 не наметнува автентификуван TLS, бидејќи многу протоколи со отворен текст можат да се преместат на таа порта, а блокирањето на порта 80 не покрива отворен текст на други порти. И режимот само-HTTPS на прелистувачот е ограничен на тој прелистувач, не на одделна апликација за пошта или разговор на истиот телефон.

Инсталирањето сертификат за пресретнување за сообраќајот да изгледа шифриран е промена на довербата, не поправка. Тоа ја заменува автентикацијата на серверот на апликацијата со вашата, а апликација што однапред не валидирала сертификати не се поправа со тоа; само го преместивте тоа кој може да го чита текот.

Каде 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 ги наведува стандардите на платформата и кои компоненти ја почитуваат политиката, а тоа е делот што одлучува дали вашата конфигурација воопшто прави нешто.

Поврзани статии