Outils de configuration de la pile réseau

Le système d'exploitation Android contient des utilitaires réseau Linux standards tels que ifconfig, ip et ip6tables. Ces utilitaires résident sur l'image système et permettent de configurer l'ensemble de la pile réseau Linux. Sur les appareils exécutant Android 7.x ou version antérieure, le code du fournisseur est autorisé à appeler directement ces binaires, 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 large qu'il est difficile d'évoluer l'image système tout en garantissant un comportement prévisible.

Sur les appareils équipés d'Android 8.0 ou version ultérieure, la partition du fournisseur reste la même, tandis que la partition du système reçoit une mise à jour. Pour ce faire, Android 8.0 permet de définir une interface stable et versionnée, tout en utilisant des restrictions SELinux pour limiter l'interdépendance du fournisseur et de l'image système à un 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 de 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 à l'emplacement /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 affichent les utilitaires réseau encapsulés par le wrapper netutils, y compris:

  • ip
  • iptables
  • ip6tables
  • ndc
  • tc

Pour utiliser ces utilitaires dans Android 8.0 et versions ultérieures, les implémentations du fournisseur doivent respecter les règles suivantes:

  • Les processus du fournisseur ne doivent pas exécuter /system/bin/netutils-wrapper-1.0 directement. Toute tentative d'exécution entraîne une erreur.
  • Tous les utilitaires encapsulés par netutils-wrapper-1.0 doivent être lancés à l'aide de leurs liens symboliques. Par exemple, remplacez le code du fournisseur qui effectuait cette opération précédemment (/system/bin/ip <FOO> <BAR>) par /system/bin/ip-wrapper-1.0 <FOO> <BAR>.
  • L'exécution des wrappers sans transition de domaine est interdite dans la règle SELinux de la plate-forme. Cette règle ne doit pas être modifiée et est testée dans la Compatibility Test Suite (CTS) Android.
  • Exécuter les utilitaires directement (par exemple, /system/bin/ip <FOO> <BAR>) à partir des processus du fournisseur est également interdit dans les règles SELinux de la plate-forme. Cette règle ne doit pas être modifiée et est testée dans CTS.
  • Tout domaine (processus) du fournisseur qui doit lancer un wrapper doit ajouter la règle de transition de domaine suivante dans la stratégie SELinux : domain_auto_trans(VENDOR-DOMAIN-NAME, netutils_wrapper_exec, netutils_wrapper).

Filtres de wrapper Netutils

Les utilitaires encapsulés peuvent être utilisés pour configurer presque tous les aspects de la pile réseau Linux. Toutefois, pour garantir la stabilité de l'interface et permettre les mises à jour de la partition système, seules certaines combinaisons d'arguments de ligne de commande sont autorisées. Les autres commandes sont rejetées.

Interfaces et chaînes de fournisseurs

Le wrapper repose sur le concept d'interfaces fournisseur. Il s'agit d'interfaces généralement gérées par le code du fournisseur, comme les interfaces de données mobiles. En règle générale, d'autres types d'interfaces (telles que le Wi-Fi) sont gérés par les HAL et le framework. Le wrapper reconnaît les interfaces du fournisseur par nom (à l'aide d'une expression régulière) et permet au code du fournisseur d'effectuer de nombreuses opérations dessus. Actuellement, les interfaces des fournisseurs sont les suivantes:

  • Interfaces dont le nom se termine par "oem" suivi d'un chiffre, par exemple 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ées par le framework (comme wlan0) ne sont jamais des interfaces de fournisseurs.

Le wrapper utilise un concept similaire de chaînes de fournisseurs. Ils sont utilisés dans les commandes iptables et sont également reconnus par nom. Actuellement, les chaînes de fournisseurs:

  • Commencez par oem_.
  • Elles sont utilisées 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 listé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 en savoir plus, consultez system/netd/netutils_wrappers/NetUtilsWrapper-1.0.cpp.

ip

La commande ip permet de configurer les adresses IP, le routage, le chiffrement IPsec et un certain nombre d'autres paramètres réseau. Le wrapper permet les commandes suivantes:

  • Ajoutez et supprimez des adresses IP des interfaces gérées par le fournisseur.
  • Configurez le chiffrement IPsec.

iptables et ip6tables

Les commandes iptables et ip6tables permettent de configurer le pare-feu, le traitement des paquets, le NAT et d'autres traitements par paquet. Le wrapper permet les commandes suivantes:

  • Ajouter et supprimer des chaînes de fournisseurs
  • Ajoutez et supprimez des règles dans n'importe quelle chaîne qui fait référence à des paquets entrant (-i) ou sortant (-o) d'une interface du fournisseur.
  • Accédez à une chaîne de fournisseurs à partir de n'importe quel point d'une autre chaîne.

ndc

ndc permet de communiquer avec le daemon netd qui effectue la plupart des configurations réseau sur Android. Le wrapper autorise les commandes suivantes:

  • Créer et détruire des réseaux OEM (oemXX)
  • Ajoutez des interfaces gérées par le fournisseur aux réseaux OEM.
  • Ajouter des routes aux réseaux OEM
  • Activez ou désactivez le transfert IP globalement et sur les interfaces du fournisseur.

tc

La commande tc permet de configurer la mise en file d'attente et la mise en forme du trafic sur les interfaces du fournisseur.