Due finestre di Android vengono continuamente confuse: la richiesta di consenso VPN e le richieste di permessi che un'app fa sui tuoi dati. La prima cede una posizione di rete, il punto in cui i pacchetti possono essere letti e riscritti. La seconda cede contenuti memorizzati che Android protegge app per app. Trattarle come una sola cosa o esagera ciò che un tunnel può vedere, o sottovaluta gravemente ciò che chiederà in seguito un'app determinata.

Cosa cede davvero la finestra di consenso

Un'app che implementa VpnService e dichiara BIND_VPN_SERVICE chiede al sistema di diventare la VPN del dispositivo. Dopo l'approvazione il framework crea un'interfaccia tun e fornisce all'app un descrittore di file per essa. Tutto ciò che l'app fa in seguito passa attraverso quel descrittore: legge i pacchetti IP in uscita, decide cosa farne e riscrive i pacchetti in entrata.

La portata di quell'interfaccia è esplicita. Le rotte decidono quali destinazioni vengono catturate, e addAllowedApplication o addDisallowedApplication decide quali app la alimentano. Una VPN per app che elenca due app non vede il resto del dispositivo.

Si tratta di una concessione a livello di pacchetto, non a livello di dati. Il servizio vede i byte che un'app consegna allo stack di rete, indirizzati a una destinazione. Non ottiene alcuna presa sullo spazio privato dell'app che invia, sui suoi file di database o sulla sua memoria decifrata. I file che un'app ha salvato nella propria sandbox restano esattamente difficili da leggere come prima.

Dove si ferma la vista sui pacchetti

TLS continua a fare il suo lavoro dentro il tunnel, perché lo handshake avviene tra l'app e il server, non tra l'app e la VPN. La VPN inoltra testo cifrato che non può decifrare senza le chiavi di sessione. Per questo un tunnel da solo non rivela il contenuto di una pagina HTTPS né di una sessione di posta protetta.

I metadati attorno al testo cifrato sono un'altra storia, ed è qui che la maggior parte delle affermazioni sicure crolla. L'IP di destinazione, la porta, le dimensioni dei pacchetti e la temporizzazione sono tutti visibili, oltre al nome del server nel TLS ClientHello, che di norma viene inviato in chiaro anche con TLS 1.3. Encrypted Client Hello cambia questo, ma non è universale. Il DNS semplice fa trapelare i nomi altrettanto facilmente quando le query escono non cifrate.

I protocolli più vecchi o mal configurati cedono di più. HTTP semplice, IMAP senza TLS e diversi protocolli di gioco e IoT espongono i loro payload a qualunque cosa possieda il descrittore tun.

I permessi che non arrivano mai con esso

Approvare una VPN non approva contatti, SMS, foto o archivio multimediale. Sono concessioni di runtime separate, ciascuna con la propria finestra e il proprio percorso di revoca nella pagina delle impostazioni dell'app. Un client VPN che vuole il tuo registro delle chiamate deve chiederlo come qualsiasi altra app, e puoi rifiutare mantenendo il tunnel.

L'installazione di certificati è quella da tenere d'occhio, perché sembra parte della configurazione VPN e non lo è. Installare una CA utente nell'archivio delle credenziali cambia quali certificati Android accetterà, e da Android 7.0 un'app destinata all'API 24 o successiva ignora le CA aggiunte dall'utente a meno che la sua configurazione di sicurezza di rete non le includa con un'ancora di fiducia utente. Un client che insiste su una CA potrebbe stare facendo una legittima intercettazione aziendale, oppure chiedere qualcosa che la finestra VPN non ha mai menzionato.

L'accesso all'accessibilità si trova ancora più fuori. Un servizio con l'accessibilità attiva può leggere il contenuto dello schermo di altre app, cosa che nessuna posizione a livello di pacchetto fornisce.

Filtro locale o gateway remoto

La stessa API copre due prodotti che meritano livelli di fiducia diversi. Un firewall o un blocco pubblicitario sul dispositivo prende il descrittore tun e risponde al traffico localmente, senza mai inviarlo a un server che gestisce in proprio. Un tunnel reale inoltra quei pacchetti a un gateway altrove, e quell'operatore vede gli stessi metadati dall'altro capo e decide anche cosa ritorna.

Un modo pratico per distinguerli è controllare il tuo indirizzo pubblico con la VPN attiva e poi disattivata, e guardare se la notifica nomina un endpoint remoto. Se l'indirizzo non cambia mai, il traffico probabilmente sta tornando indietro sul dispositivo stesso.

Entrambi i casi restano una posizione sui pacchetti. La differenza è chi altro sta all'uscita.

Verifica ciò che hai approvato

Apri Impostazioni, poi Rete e Internet, poi VPN, e leggi la voce invece dell'icona nella barra di stato. VPN sempre attiva e Blocca connessioni senza VPN sono impostazioni del dispositivo che tengono viva l'interfaccia e tagliano le fughe; non allargano nulla. Dalla stessa schermata puoi dimenticare il profilo e revocare la concessione.

Poi passa agli altri permessi. Le informazioni sull'app mostrano quali concessioni di runtime ha il client, e le impostazioni di Sicurezza mostrano se è stato installato nello stesso momento un certificato utente. Entrambi possono essere rimossi in modo indipendente.

La domanda che vale la pena di risolvere è stretta: quali pacchetti entrano in questo servizio, dove vanno e cosa conserva l'implementazione. Tutto il resto nella finestra è rumore. Il riferimento a VpnService è l'elenco autorevole di ciò che l'interfaccia espone.

Articoli correlati