Outils de configuration de la pile réseau

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 ou r_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_ ou qcom_ .

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.