Dua hal yang sangat berbeda disebut memblokir teks terbuka di Android. Yang satu adalah kebijakan di dalam aplikasi yang memerintahkan tumpukan jaringannya sendiri untuk menolak HTTP biasa. Yang lain adalah pengaturan tingkat perangkat yang mencoba melindungi semua yang ada di ponsel sekaligus, biasanya dengan mengarahkan lalu lintas melalui VPN. Keduanya menyelesaikan masalah berbeda, dan yang kedua tidak dapat memperbaiki yang pertama: terowongan melindungi ruas antara ponsel dan pintu keluar, sedangkan aplikasi yang berbicara HTTP tetap berbicara HTTP dengan apa pun yang berada di balik pintu keluar itu.

Dua masalah dengan satu nama

Masalah pertama adalah muatan: aplikasi menulis kredensial atau token ke permintaan yang tidak dienkripsi ujung ke ujung, sehingga setiap lompatan yang dapat melihatnya dapat membacanya. Masalah kedua adalah jalur: aplikasi bisa sepenuhnya benar, dan Anda tetap ingin operator Wi-Fi lokal tidak tahu apa pun tentang ke mana ia terhubung. VPN menangani yang kedua dan hanya yang kedua.

Pembedaan itu menentukan siapa pemilik perbaikannya. Muatan milik siapa pun yang mengirimkan aplikasi, karena hanya kode itu yang menentukan URL mana yang dipanggil dan apakah sertifikat divalidasi. Jalur milik perangkat atau jaringan, karena menyangkut ke mana paket pergi, bukan apa isinya.

Jalur satu: aplikasi yang Anda kendalikan

Jika Anda mengirimkan aplikasi, perbaikannya adalah keputusan transportasi ditambah kebijakan yang menegakkannya. Arahkan setiap titik akhir ke HTTPS, biarkan validasi nama host dan sertifikat menyala, dan hapus cadangan HTTP biasa alih-alih membiarkannya sejauh satu bendera konfigurasi. Pengalihan tidak membantu di sini: permintaan HTTP yang menerima 301 sudah mengirim header dan isinya secara terbuka, jadi kredensial tidak boleh pernah berjalan dengan asumsi pengalihan akan melindunginya.

Pada Android 7.0 dan setelahnya, Network Security Configuration mengungkapkan kebijakan itu. Berkas di bawah adalah versi berguna terkecil: ia menolak teks terbuka di mana-mana kecuali pengecualian khusus domain menyatakan lain.

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

Rujuk sumber daya itu dari manifes, lalu baca pengecualian yang sudah ada sebelum mengirim. Domain debug lama atau entri SDK penyedia pembayaran bisa diam-diam mengizinkan lagi teks terbuka bagi host yang Anda coba lindungi.

Dua detail versi perlu diketahui. Aplikasi yang menargetkan API 28 atau lebih baru sudah menolak teks terbuka secara bawaan, jadi aplikasi yang masih berbicara HTTP biasa entah menargetkan tingkat API lama atau punya pengecualian di suatu tempat. Dan bila konfigurasi keamanan jaringan ada, atribut manifes lama android:usesCleartextTraffic tidak lagi menentukan soal itu, karena itu mengubah bendera tersebut kadang tampak tidak melakukan apa-apa.

Jalur dua: aplikasi yang tidak Anda kendalikan

Untuk aplikasi pihak ketiga yang terpasang, Anda tidak dapat menulis ulang konfigurasi keamanannya lewat pengaturan pengguna. Pilihan realistisnya adalah kontrol koneksi aman bawaan produk, alternatif terpelihara yang sudah memakai TLS, atau kebijakan perangkat terkelola yang membatasi apa yang boleh dijalankan perangkat. Itu komitmen berbeda, dan hanya yang ketiga berskala ke seluruh armada.

Aturan jaringan adalah pengganti yang lebih lemah dari kelihatannya. Mengizinkan hanya port 443 tidak menegakkan TLS terautentikasi, karena banyak protokol teks terbuka dapat dipindahkan ke port itu, dan memblokir port 80 tidak mencakup teks terbuka di port lain. Mode hanya-HTTPS peramban juga terbatas pada peramban itu, bukan pada aplikasi surel atau obrolan terpisah di ponsel yang sama.

Memasang sertifikat intersepsi agar lalu lintas tampak terenkripsi adalah perubahan kepercayaan, bukan perbaikan. Itu menggantikan autentikasi server aplikasi dengan autentikasi Anda, dan aplikasi yang sejak awal tidak memvalidasi sertifikat tidak diperbaiki olehnya; Anda hanya memindahkan siapa yang dapat membaca aliran itu.

Di mana VPN membantu dan di mana tidak

Terowongan adalah alat yang tepat ketika syaratnya jaringan lokal tidak tahu apa pun tentang koneksi, atau aplikasi mencapai layanan privat yang tidak dapat dijangkau dengan cara lain. Itu alat yang salah untuk membuat klien HTTP berbicara HTTPS, karena permintaan meninggalkan terowongan persis seperti saat masuk.

Android menambahkan batasan praktis: platform menjalankan satu layanan VPN dalam satu waktu. Aplikasi penyaring lokal yang mengambil tempat itu bersaing dengan terowongan jarak jauh yang benar-benar Anda butuhkan, dan berpindah di antara keduanya adalah operasi tingkat perangkat, bukan tingkat aplikasi. Satu tempat itu alasan baik untuk menaruh kebijakan muatan di aplikasi dan menyimpan terowongan untuk jalur.

Satu-satunya kasus ketika keduanya tumpang tindih adalah server privat yang juga Anda operasikan. Di sana terowongan dapat membuat jalur menjadi privat meski protokolnya masih teks terbuka, yang mengurangi paparan tetapi tidak mengubah apa muatannya. Perlakukan itu sebagai pengurangan risiko, bukan enkripsi data.

Apa yang perlu diuji sebelum menyebutnya terblokir

Mulailah dari bawaan yang mengejutkan orang: aplikasi yang menargetkan API 28 atau lebih baru seharusnya sudah menolak teks terbuka, jadi periksa tingkat target sebelum menambahkan konfigurasi yang menggandakan bawaan. Lalu uji kasus gagal dengan sengaja: permintaan ke host HTTP biasa harus gagal, bukan diam-diam berhasil lewat cadangan.

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

Untuk kasus berhasil, pastikan panggilan HTTPS memvalidasi rantai sertifikat sungguhan dan bahwa proksi dengan sertifikat tak tepercaya ditolak, bukan ditoleransi. Jabat tangan yang berhasil terhadap sertifikat apa pun tidak membuktikan apa pun tentang keamanan transportasi.

Untuk aplikasi pihak ketiga, tuliskan batas yang benar-benar dapat Anda tegakkan, entah kebijakan perangkat terkelola, aturan jaringan, atau tidak ada, dan nyatakan itu dalam kriteria penerimaan. panduan konfigurasi keamanan Android mencantumkan bawaan platform dan komponen mana yang mematuhi kebijakan itu, dan itulah bagian yang menentukan apakah konfigurasi Anda melakukan sesuatu sama sekali.

Artikel terkait