Le système d'exploitation Android contient des utilitaires réseau Linux standard tels que ifconfig
, ip
et ip6tables
. Ces utilitaires résident sur l'image système et permettent la configuration de l'ensemble de la pile réseau Linux. Sur les appareils exécutant Android 7.x et versions antérieures, le code du fournisseur est autorisé à appeler ces binaires directement, ce qui présente les problèmes suivants :
- Étant donné que les utilitaires réseau sont mis à jour dans l’image système, ils ne fournissent pas une implémentation stable.
- La portée des utilitaires réseau est si vaste qu'il est difficile de faire évoluer l'image du système tout en garantissant un comportement prévisible.
Sur les appareils exécutant Android 8.0 et versions ultérieures, la partition du fournisseur reste la même tandis que la partition système reçoit une mise à jour. Pour y parvenir, Android 8.0 offre la possibilité de définir une interface stable et versionnée tout en utilisant également les restrictions SELinux pour maintenir l'interdépendance du fournisseur et de l'image système à un bon ensemble connu.
Les fournisseurs peuvent utiliser les utilitaires de configuration réseau fournis par la plate-forme pour configurer la pile réseau Linux, mais ces utilitaires n'incluent pas encore de wrapper d'interface HIDL. Pour définir une telle interface, Android 8.0 inclut l'outil netutils-wrapper-1.0
.
Wrapper Netutils
L'utilitaire wrapper netutils
fournit un sous-ensemble de la configuration de la pile réseau Linux qui n'est pas affecté par les mises à jour de la partition système. Android 8.0 contient la version 1.0 des wrappers, qui vous permet de transmettre les mêmes arguments que les utilitaires encapsulés, installés dans la partition système dans /system/bin
comme suit :
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
Les liens symboliques montrent les utilitaires réseau enveloppés par le wrapper netutils
, qui incluent :
-
ip
-
iptables
-
ip6tables
-
ndc
-
tc
Pour utiliser ces utilitaires dans Android 8.0 et versions ultérieures, les implémentations des fournisseurs doivent respecter les règles suivantes :
- Les processus du fournisseur ne doivent pas exécuter directement
/system/bin/netutils-wrapper-1.0
; toute tentative de le faire entraînera une erreur. - Tous les utilitaires enveloppés par
netutils-wrapper-1.0
doivent être lancés à l'aide de leurs liens symboliques. Par exemple, modifiez le code du fournisseur qui a fait cela auparavant (/system/bin/ip <FOO> <BAR>
) en/system/bin/ip-wrapper-1.0 <FOO> <BAR>
. - L'exécution des wrappers sans transition de domaine est interdite dans la politique de la plateforme SELinux. Cette règle ne doit pas être modifiée et est testée dans la suite de tests de compatibilité Android (CTS) .
- L'exécution des utilitaires directement (par exemple,
/system/bin/ip <FOO> <BAR>
) à partir des processus du fournisseur est également interdite dans les politiques de la plateforme SELinux. Cette règle ne doit pas être modifiée et est testée dans CTS. - Tout domaine de fournisseur (processus) qui doit lancer un wrapper doit ajouter la règle de transition de domaine suivante dans la politique SELinux :
domain_auto_trans( VENDOR-DOMAIN-NAME , netutils_wrapper_exec, netutils_wrapper)
.
Filtres wrapper Netutils
Les utilitaires enveloppés peuvent être utilisés pour configurer presque tous les aspects de la pile réseau Linux. Cependant, pour garantir qu'il est possible de maintenir une interface stable et d'autoriser les mises à jour de la partition système, seules certaines combinaisons d'arguments de ligne de commande sont autorisées ; les autres commandes seront rejetées.
Interfaces et chaînes des fournisseurs
Le wrapper a un concept d' interface fournisseur . Il s'agit d'interfaces généralement gérées par le code du fournisseur, telles que les interfaces de données cellulaires. Généralement, d'autres types d'interfaces (telles que le Wi-Fi) sont gérées par les HAL et le framework. Le wrapper reconnaît les interfaces des fournisseurs par leur nom (à l'aide d'une expression régulière) et permet au code du fournisseur d'effectuer de nombreuses opérations sur celles-ci. Actuellement, les interfaces des fournisseurs sont :
- Interfaces dont les noms se terminent par « oem » suivi d'un numéro, comme
oem0
our_oem1234
. - Interfaces utilisées par les implémentations SOC et OEM actuelles, telles que
rmnet_data[0-9]
.
Les noms d'interfaces généralement gérés par le framework (tels que wlan0
) ne sont jamais des interfaces de fournisseur.
Le wrapper a un concept similaire de chaîne de fournisseurs . Ceux-ci sont utilisés dans les commandes iptables
et sont également reconnus par leur nom. Actuellement, les chaînes de fournisseurs :
- Commencez par
oem_
. - Sont utilisés par les implémentations SOC et OEM actuelles, par exemple, les chaînes commençant par
nm_
ouqcom_
.
Commandes autorisées
Les commandes actuellement autorisées sont répertoriées ci-dessous. Les restrictions sont implémentées via un ensemble d'expressions régulières sur les lignes de commande exécutées. Pour plus de détails, reportez-vous à system/netd/netutils_wrappers/NetUtilsWrapper-1.0.cpp
.
adresse IP
La commande ip
est utilisée pour configurer les adresses IP, le routage, le cryptage IPsec et un certain nombre d'autres paramètres réseau. Le wrapper autorise les commandes suivantes :
- Ajoutez et supprimez des adresses IP des interfaces gérées par le fournisseur.
- Configurez le cryptage IPsec.
iptables/ip6tables
Les commandes iptables
et ip6tables
sont utilisées pour configurer le pare-feu, la gestion des paquets, le NAT et d'autres traitements par paquet. Le wrapper autorise les commandes suivantes :
- Ajoutez et supprimez des chaînes de fournisseurs.
- Ajoutez et supprimez des règles dans n'importe quelle chaîne faisant référence aux paquets entrant (
-i
) ou sortant (-o
) d'une interface fournisseur. - Accédez à une chaîne de fournisseurs à partir de n’importe quel point d’une autre chaîne.
sdc
ndc
est utilisé pour communiquer avec le démon netd
qui effectue la plupart des configurations réseau sur Android. Le wrapper autorise les commandes suivantes :
- Créez et détruisez les réseaux OEM (
oemXX
). - Ajoutez des interfaces gérées par le fournisseur aux réseaux OEM.
- Ajoutez des routes aux réseaux OEM.
- Activez ou désactivez le transfert IP globalement et sur les interfaces des fournisseurs.
TC
La commande tc
est utilisée pour configurer la mise en file d'attente et la mise en forme du trafic sur les interfaces des fournisseurs.