Il sistema operativo Android contiene utilità di rete Linux standard come ifconfig
, ip
e ip6tables
.
Queste utilità si trovano nell'immagine di sistema e consentono di configurare l'intero stack di rete Linux. Sui dispositivi con Android 7.x e versioni precedenti, il codice del fornitore è autorizzato a chiamare direttamente questi binari, il che presenta i seguenti problemi:
- Poiché le utilità di rete vengono aggiornate nell'immagine di sistema, non forniscono un'implementazione stabile.
- L'ambito delle utilità di rete è così ampio che è difficile far evolvere l'immagine di sistema garantendo un comportamento prevedibile.
Sui dispositivi con Android 8.0 e versioni successive, la partizione del fornitore rimane invariata mentre la partizione di sistema riceve un aggiornamento. Per raggiungere questo obiettivo, Android 8.0 offre la possibilità di definire un'interfaccia stabile e con versione, utilizzando al contempo le limitazioni SELinux per mantenere l'interdipendenza dell'immagine del fornitore e del sistema in un insieme di elementi validi.
I fornitori possono utilizzare le utilità di configurazione di rete fornite dalla piattaforma per configurare lo stack di rete Linux, ma queste utilità non includono ancora un wrapper dell'interfaccia HIDL. Per definire un'interfaccia di questo tipo, Android 8.0 include lo strumentonetutils-wrapper-1.0
.
Wrapper Netutils
L'utilità wrapper netutils
fornisce un sottoinsieme della configurazione dello stack di rete Linux che non è interessato dagli aggiornamenti della partizione di sistema.
Android 8.0 contiene la versione 1.0 dei wrapper, che consente di passare gli stessi argomenti delle utilità con wrapping, installate nella partizione di sistema in /system/bin
come segue:
u:object_r:system_file:s0 /system/bin/ip-wrapper-1.0 -> netutils-wrapper-1.0 u:object_r:system_file:s0 /system/bin/ip6tables-wrapper-1.0 -> netutils-wrapper-1.0 u:object_r:system_file:s0 /system/bin/iptables-wrapper-1.0 -> netutils-wrapper-1.0 u:object_r:system_file:s0 /system/bin/ndc-wrapper-1.0 -> netutils-wrapper-1.0 u:object_r:netutils_wrapper_exec:s0 /system/bin/netutils-wrapper-1.0 u:object_r:system_file:s0 /system/bin/tc-wrapper-1.0 -> netutils-wrapper-1.0
I link simbolici mostrano le utilità di rete con wrapping del netutils
wrapper, tra cui:
ip
iptables
ip6tables
ndc
tc
Per utilizzare queste utilità in Android 8.0 e versioni successive, le implementazioni dei fornitori devono rispettare le seguenti regole:
- Le procedure del fornitore non devono eseguire
/system/bin/netutils-wrapper-1.0
direttamente; i tentativi in tal senso generano un errore. - Tutte le utilità con wrapping di
netutils-wrapper-1.0
devono essere avviate utilizzando i relativi link simbolici. Ad esempio, cambia il codice fornitore che lo faceva prima (/system/bin/ip <FOO> <BAR>
) in/system/bin/ip-wrapper-1.0 <FOO> <BAR>
. - L'esecuzione dei wrapper senza transizione di dominio è vietata nel criterio SELinux della piattaforma. Questa regola non deve essere modificata e viene testata in Android Compatibility Test Suite (CTS).
- Eseguire direttamente le utilità (ad es.
/system/bin/ip <FOO> <BAR>
) dai processi del fornitore è vietata anche nelle norme SELinux della piattaforma. Questa regola non deve essere modificata e viene testata in CTS. - Qualsiasi dominio (processo) del fornitore che deve avviare un wrapper deve aggiungere la seguente regola di transizione del dominio nel criterio SELinux:
domain_auto_trans(VENDOR-DOMAIN-NAME, netutils_wrapper_exec, netutils_wrapper)
.
Filtri wrapper Netutils
Le utilità con wrapping possono essere utilizzate per configurare quasi tutti gli aspetti dello stack di rete Linux. Tuttavia, per garantire la possibilità di mantenere un'interfaccia stabile e consentire gli aggiornamenti alla partizione di sistema, sono consentite solo determinate combinazioni di argomenti della riga di comando; gli altri comandi vengono rifiutati.
Interfacce e catene di fornitori
Il wrapper ha un concetto di interfacce del fornitore. Si tratta di interfacce tipicamente gestite dal codice del fornitore, come le interfacce di dati di telefonia cellulare. In genere, altri tipi di interfacce (come il Wi-Fi) sono gestiti dagli HAL e dal framework. Il wrapper riconosce le interfacce del fornitore per nome (utilizzando un'espressione regolare) e consente al codice del fornitore di eseguire molte operazioni su di esse. Al momento, le interfacce dei fornitori sono:
- Interfacce i cui nomi terminano con "oem" seguito da un numero, ad esempio
oem0
or_oem1234
. - Interfacce utilizzate dalle attuali implementazioni di SOC e OEM, come
rmnet_data[0-9]
.
I nomi delle interfacce in genere gestite dal framework (ad es.wlan0
) non sono mai interfacce del fornitore.
Il wrapper ha un concetto simile alle catene di fornitori. Vengono utilizzati
nei comandi iptables
e sono riconosciuti anche per nome. Attualmente,
le catene di fornitori:
- Inizia con
oem_
. - Sono utilizzati dalle attuali implementazioni SOC e OEM, ad esempio le catene che iniziano con
nm_
oqcom_
.
Comandi consentiti
Di seguito sono elencati i comandi attualmente consentiti. Le restrizioni vengono implementate tramite un insieme di espressioni regolari sulle righe di comando eseguite. Per maggiori dettagli, consulta system/netd/netutils_wrappers/NetUtilsWrapper-1.0.cpp
.
IP
Il comando ip
viene utilizzato per configurare indirizzi IP, routing, crittografia IPsec e una serie di altri parametri di rete. Il wrapper consente i seguenti comandi:
- Aggiungere e rimuovere indirizzi IP dalle interfacce gestite dal fornitore.
- Configura la crittografia IPsec.
iptables e ip6tables
I comandi iptables
e ip6tables
vengono utilizzati per configurare il firewall, la manipolazione dei pacchetti, la NAT e altri tipi di elaborazione a livello di pacchetto.
Il wrapper consente i seguenti comandi:
- Aggiungere ed eliminare catene di fornitori.
- Aggiungi ed elimina regole in qualsiasi catena che fa riferimento ai pacchetti in entrata (
-i
) o in uscita (-o
) da un'interfaccia del fornitore. - Passare a una catena di fornitori da qualsiasi punto di un'altra catena.
ndc
ndc
viene utilizzato per comunicare con il demone netd
che
esegue la maggior parte della configurazione di rete su Android. Il wrapper consente i seguenti
comandi:
- Crea e distruggi le reti OEM (
oemXX
). - Aggiungi interfacce gestite dal fornitore alle reti OEM.
- Aggiungi percorsi alle reti OEM.
- Attiva o disattiva il forwarding IP a livello globale e sulle interfacce del fornitore.
tc
Il comando tc
viene utilizzato per configurare la coda e la saturazione del traffico sulle interfacce del fornitore.