Tout d'abord, je dois admettre que je suis entièrement d'accord avec votre déclaration "J'ai trouvé cela scandaleusement difficile à faire" . Google a conçu Android principalement du point de vue des consommateurs, et non pour les utilisateurs expérimentés. Le résultat est que, dès que vous voulez faire quelque chose en dehors de l'utilisation de la dernière application Facebook ou jouer avec Candy Crush, vous vous retrouvez très rapidement dans le royaume de Linux au début des années 2000, quand une connaissance de type développeur était nécessaire pour changer quels devraient être les paramètres simples. Je crois que la situation évoluera rapidement à mesure que le système Android deviendra plus mature, mais pour l'instant, nous devons faire avec ce que nous avons ...
Comme vous l'avez dit, il y a deux raisons pour lesquelles il est nécessaire de compiler votre propre ensemble d'outils SELinux:
- Le jeu d'outils fourni par le système est généralement une version derrière. Alors que SELinux d'Android repose sur la politique DB version 30, les boîtiers Linux actuels ne gèrent généralement que la version jusqu'à 29.
- Même s'il était plus récent, cela n'aiderait pas, en fait la construction de SELinux à partir du code en amont (ce qui est facile à faire, au moins sur les machines Fedora suivant les recommandations en amont) permet efficacement au système de gérer la politique DB version 30, mais SELinux d'Android a été lourdement modifié (la documentation Google met en évidence quelques modifications), donc essayer de gérer SELinux d'Android échoue en raison d'erreurs de syntaxe et d'analyse.
Donc, pour continuer la quête d'analyse SELinux d'Android, nous devrons mettre nos mains dans la saleté ... de la manière la plus propre possible:
- Nous allons d'abord configurer un environnement sain,
- Une fois cela fait, nous compilerons les bibliothèques SELinux d'Android et les premiers outils,
- En plus, nous allons construire des outils SELinux,
- Nous terminerons en ajoutant quelques utilitaires supplémentaires.
Configurer un environnement approprié
Propriétés environnementales
La méthode la plus propre recommandée, peut-être uniquement de manière fiable, est de dédier un environnement à votre travail Android:
Une machine virtuelle est parfaitement bien (sinon la meilleure option). Préférez utiliser un VMware car vous devrez connecter votre téléphone via USB au système invité. L'alternative gratuite Qemu ne semble pas très bien gérer une telle tâche. Je n'ai pas essayé avec d'autres logiciels de virualisation.
Il devra s'agir d'un système 64 bits, sinon le code ne sera tout simplement pas compilé car les nombres entiers sont de mauvaise taille.
Il est fortement recommandé, éventuellement obligatoire, d'utiliser un système Ubuntu. N'hésitez pas à utiliser Xubuntu à la place si vous préférez l'environnement de bureau plus léger de XFCE, cela ne change pas le noyau du système et le package disponible et n'aura aucun impact sur votre travail lié à Android (tout ce que je dis à propos d'Ubuntu dans cette procédure s'applique également à Xubuntu). Vous pouvez trouver dans l'arborescence des sources SELinux d'Android des fichiers Lisez-moi recommandant l'utilisation de Fedora à la place, ces fichiers sont hérités du projet SELinux de la NSA en amont et leur contenu ne correspond pas nécessairement à Android de Google.
La version exacte d'Unbuntu à utiliser dépend de la version d'Android que vous souhaitez construire. Pour Android 6.0, Ubuntu 14.04 (Trusty) est recommandé. Consultez la page des exigences de Google pour plus d'informations.
Vous aurez besoin de beaucoup d'espace disque (au moins 50 Go si vous prévoyez uniquement une enquête liée à SELinux, au moins 100 Go si vous prévoyez une version complète d'Android). Le processeur et la mémoire sont moins pertinents, ils n'influent que sur le temps pour une construction complète et n'auront aucun impact réel pour les tâches liées à SELinux.
L'utilisation d'Ubuntu présente deux avantages principaux:
En utilisant le système recommandé, vous travaillez dans un environnement bien connu et bien testé: les bibliothèques système, les outils et les packages sont à la version et à l'emplacement attendus par le projet.
Et plus précisément dans notre cas actuel: Ubuntu lui-même s'appuie sur AppArmor qui est une alternative SELinux, il n'utilise pas SELinux. La bonne nouvelle est que vous pourrez donc installer les outils et binaires SELinux d'Android à l'échelle du système sans risquer d'altérer la fiabilité du système.
Procédure d'installation de l'environnement
Vous pouvez installer Ubuntu de la manière traditionnelle en commençant à partir d'un DVD live à part entière, mais une alternative plus rapide consiste à utiliser une installation netboot (installation en mode texte) et sélectionnez l'environnement de bureau que vous préférez à la fin. Cela vous permettra d'économiser le temps de mise à jour initial en installant directement la version des packages à jour au lieu d'installer d'abord les versions obsolètes, puis en demandant d'appliquer 389 mises à jour en attente au premier démarrage.
Le programme d'installation de netboot ISO pour Ubuntu / Xubuntu 14.04 (même ISO) est disponible ici .
Pour ignorer la fonction gênante «Installation facile» de VMware, il est préférable de commencer par sélectionner l' option « J'installerai le système d'exploitation plus tard» .
Assurez-vous de sélectionner Linux , puis Ubuntu 64 bits comme système d'exploitation invité.
La VM aura besoin des ressources suivantes:
- Obligatoire: l'espace disque doit être d' au moins 40 Go (les 20 Go par défaut ne seront pas suffisants, le code source à lui seul prend plus d'espace que cela), plus il est recommandé. Une version complète nécessite un disque de 100 Go minimum, c'est la valeur que je prends habituellement. N'oubliez pas que ce paramètre n'est qu'une limite maximale: la taille réelle prise par la machine virtuelle croît dynamiquement avec les demandes des invités.
- Facultative: augmenter la RAM de 1024 à au moins 2048 ou plus (dépend de la capacité de votre hôte, j'utilise 4096),
- Facultative: augmenter le nombre de cœurs de processeur de 1 à 2 ou plus (dépend de la capacité de votre hôte, j'en utilise 3).
- Le CD-Rom doit pointer vers le fichier ISO d'installation.
- Vous souhaiterez peut-être basculer USB de la valeur par défaut 1.1 à 2.0, car la première peut donner des avertissements lorsque vous connectez votre appareil. Selon votre utilisation, vous pouvez également décocher en toute sécurité "Connecter automatiquement les nouveaux périphériques USB" et "Partager les périphériques Bluetooth avec la machine virtuelle" .
- Selon votre environnement, vous devrez peut-être également modifier les paramètres d'affichage (désactiver la 3D, appliquer une taille d'écran).
Attention:
- Si vous avez choisi l'installation de netboot, n'oubliez pas de sélectionner votre environnement de bureau ( bureau Ubuntu ou bureau Xubuntu ) lorsque vous atteignez l' écran de sélection du logiciel , ou vous vous retrouverez avec un environnement textuel minimal!
- Au premier démarrage, refusez de passer à la dernière version: le but ici est de rester en 14.04!
Au premier démarrage, l'un des premiers que vous voudrez peut-être faire est d'installer les outils invités Linux:
sudo apt-get install open-vm-tools
Ce paquet met des déclencheurs au démarrage, son installation ne sera donc terminée qu'après un redémarrage invité.
Récupérer le code source Android
Bien que similaire, les détails de la procédure dépendent de la ROM choisie:
- Pour CyanogenMod, recherchez votre appareil (sélectionnez d'abord le fournisseur) puis cliquez sur le lien "Comment construire CyanogenMod" pour obtenir des instructions adaptées à votre appareil.
- Pour AOSP, suivez la procédure qui commence ici .
Il peut être intéressant de noter que CyanogeMod regroupe dans son arborescence source un outil vous permettant de décompresser les boot.img
fichiers. Pour le dire différemment, CyanogenMod vous fournit un outil qui vous permettra d'accéder au sepolicy
fichier stocké dans les appareils et les archives ROM. L'AOSP de Google ne fournit pas un tel outil, donc si vous n'avez pas d'autre impératif d'utiliser l'arborescence source de CyanogenMod peut être le choix le plus pratique, sinon vous devrez l'installer séparément (ce qui est rapide et facile à faire, donc ne vous inquiétez pas ici).
Ici, je suis la procédure CyanogenMod 13.0 (Android 6.0). Des explications sur les commandes utilisées sont disponibles sur les pages liées ci-dessus. Veuillez les lire, le texte ci-dessous n'est donné qu'à titre de référence.
Astuce: Bien que j'utiliseapt-get
dans ce post pour respecter le plus petit dénominateur commun et garder tout le monde heureux, vous préférerez peut-être utiliser à laaptitude
place car il prendra mieux en charge les dépendances (lors de la suppression d'un package qui nécessitait l'installation de certaines dépendances) , ces dépendances seront également supprimées, laissant votre système plus propre). AFAIK laaptitude
commande doit être installée dans Ubuntu mais est disponible par défaut sur Xubuntu.
sudo apt-get install bison build-essential curl flex git gnupg gperf \
libesd0-dev liblz4-tool libncurses5-dev libsdl1.2-dev libwxgtk2.8-dev libxml2 \
libxml2-utils lzop maven openjdk-7-jdk pngcrush schedtool squashfs-tools \
xsltproc zip zlib1g-dev g++-multilib gcc-multilib lib32ncurses5-dev \
lib32readline-gplv2-dev lib32z1-dev
mkdir -p ~/bin
mkdir -p ~/android/system
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod u+x ~/bin/repo
cd ~/android/system/
git config --global user.name "Your Name"
git config --global user.email "you@example.com
repo init -u https://github.com/CyanogenMod/android.git -b cm-13.0
repo sync
# Coffee time: around 20GB are being downloaded, this may take several hours.
source ./build/envsetup.sh
breakfast
Vous avez maintenant une arborescence source propre et presque complète. Les blobs propriétaires sont manquants, mais vous n'en avez pas besoin pour les tâches liées à SELinux.
Astuce: La récupération des sources est un processus fastidieux, il peut être utile de faire un instantané ou une sauvegarde de votre machine virtuelle maintenant.
Compiler et installer le jeu d'outils et les bibliothèques SELinux d'Android
Maintenant, la partie amusante du voyage commence;)!
Jusqu'à présent, la procédure aurait dû être assez simple. Le but était principalement de vous assurer d'avoir le même environnement que moi. Si vous le faites, la suite devrait également rester simple.
Sous le capot, Google n'hésite pas à appliquer des modifications profondes au code source d'Android entre les versions, donc les étapes de compilation exactes dépendront certainement de la version (par exemple, le maître AOSP montre que le sepolicy/
répertoire sera déplacé ).
Je vais d'abord partager ma procédure exacte pour compiler et installer les bibliothèques et les outils SElinux d'Android, mais afin de garder la pertinence de ce message au fil du temps, j'ajouterai ensuite quelques notes sur l'approche générique à suivre afin de résoudre la plupart des problèmes de compilation.
Procédure pas à pas
Les bibliothèques SELinux d'Android fournissent la couche d'abstraction qui permettra aux logiciels de couche supérieure de traiter les fichiers de politique SELinux spécifiques à Android. Nous devrons donc les calculer et les installer en premier (ce qui, en soi, représente en fait le cœur des difficultés ici, jusqu'à ce que vous ayez trouvé votre chemin).
Nous pourrons ensuite construire et installer les outils SELinux. Comme nous le verrons, heureusement, ceux-ci n'ont pas besoin d'être spécifiques à Android, ils doivent seulement correspondre à la version de la bibliothèque SELinux.
Cette procédure a été testée à l'aide d'arbres de code source CyanogenMod et AOSP.
Compiler et installer les bibliothèques Android SELinux et les premiers outils
Premières dépendances d'installation:
sudo apt-get install libapol-dev libaudit-dev libdbus-glib-1-dev libgtk2.0-dev \
libustr-dev python-dev python-networkx swig xmlto
Dans ce post, la variable $ANDROID_BUILD_TOP
stocke votre emplacement source (le répertoire où vous avez lancé la repo sync
commande). N'hésitez pas à changer son nom à votre guise.
ANDROID_BUILD_TOP=~/android/system
cd $ANDROID_BUILD_TOP
source ./build/envsetup.sh
Par défaut, la compilation des principaux outils de stratégie échoue car restorecond
Makefile n'est pas en mesure de localiser certaines bibliothèques. Vous devez éditer ce Makefile afin d'utiliser des chemins générés dynamiquement par pkg-config
au lieu de ceux codés en dur (ne confondez pas les backticks avec des guillemets simples!):
sed -i 's/^CFLAGS ?= -g -Werror -Wall -W$/& `pkg-config --cflags --libs dbus-1 gtk+-2.0`/' \
$ANDROID_BUILD_TOP/external/selinux/policycoreutils/restorecond/Makefile
N'hésitez pas à ouvrir le Makefile avec un éditeur de texte pour vous assurer que la modification a été correctement prise en compte.
Et maintenant compilez et installez:
cd $ANDROID_BUILD_TOP/external/bzip2/
make -f Makefile-libbz2_so
sudo make install
cd $ANDROID_BUILD_TOP/external/libcap-ng/libcap-ng-0.7/
./configure
make
sudo make install
cd $ANDROID_BUILD_TOP/external/selinux/
make -C ./libsepol/
sudo make -C /libsepol/ install
EMFLAGS=-fPIC make -C ./libselinux/
sudo make -C ./libselinux/ install
make -C ./libsemanage/
sudo make -C ./libsemanage/ install
make
sudo make install
make swigify
sudo make install-pywrap
sudo cp ./checkpolicy/test/{dispol,dismod} /usr/bin/
Attention: Ne manquez pas leEMFLAGS=-fPIC
réglage de la variable d'environnement lors de la constructionlibselinux
. Il ne générera pas encore d'erreur, mais à l'étape suivante, vous ne pourrez pas créer SETools. Dans le cas où vous l'auriez manqué ou fait quoi que ce soit de mal, émettez simplement unmake clean
et redémarrez votre compilation.
Compiler et installer les outils SELinux
Les outils SELinux sont fournis sous une forme prédéfinie qui comprend:
- Scripts Python (et leurs wrappers de scripts shell) dans le
$ANDROID_BUILD_TOP/external/selinux/prebuilts/bin/
répertoire
- Packages Python (y compris
*.o
les fichiers compilés) ci-dessous $ANDROID_BUILD_TOP/prebuilts/python/linux-x86/2.7.5/lib/python2.7/site-packages/
.
Je m'attendais à ce que le code source de ces outils soit disponible ci $ANDROID_BUILD_TOP/external
- dessous , mais ce n'est pas le cas. En fait, je n'ai trouvé aucun endroit où Google a partagé la version exacte de SETools qu'ils ont utilisée (FYI la GPL ne demande le partage du code que s'il a été modifié), nous devrons donc deviner et essayer de faire du mieux que nous pouvons. .
Les outils eux-mêmes sont des scripts Python, c'est une nouvelle évolution de SETools 4 (dans SETools 3, des commandes comme sesearch
étaient des exécutables binaires codés en C). Cependant, les outils eux-mêmes affichent toujours une version de 3.3.8:
$ $ANDROID_BUILD_TOP/external/selinux/prebuilts/bin/sesearch --version
3.3.8
Donc, je suppose que Google a pris un instantané de développement précoce de SETools 4. Jusqu'à 4.0.0 beta SETools reposait sur libsepol
versoin 2.4, avec la version 4.0.0, ils ont commencé à s'appuyer sur la version 2.5 de la bibliothèque qui n'est pas compatible avec la version de SELinux intégré à Android 6.0 (vous pouvez essayer de le compiler, il échouera).
Donc, le choix le plus sage semble aller avec SETools 4.0.0 Beta.
Installer des dépendances supplémentaires:
sudo apt-get install python-setuptools
Téléchargez et extrayez le code source:
cd ~/android/
wget https://github.com/TresysTechnology/setools/archive/4.0.0-beta.tar.gz
tar xzf 4.0.0-beta.tar.gz
cd ./setools-4.0.0-beta/
En raison d' un bogue affectant Flex 2.5, nous devons supprimer -Wredundant-decls
des indicateurs du compilateur:
sed -i '/-Wredundant-decls/d' ./setup.py
Et enfin compiler et installer:
python ./setup.py build
sudo python ./setup.py install
Procédure générique (ou "Comment se décoller")
Dans le cas où la procédure ci-dessus n'a pas fonctionné dans votre cas, voici une vue de niveau supérieur sur la façon d'essayer de progresser.
Il n'y a malheureusement pas de magie (et pas d'aide :() ici: la seule façon d'obtenir ce code à compiler est l'approche cyclique classique mais redoutable "essayer et voir".
Essayez de compiler une première fois, il échouera très probablement car un *.h
fichier est introuvable:
Rechercher dans le external/
répertoire Android :
find $ANDROID_BUILD_TOP/external -name filename.h
Si vous trouvez le fichier demandé, cela signifie qu'une version spécifique de la bibliothèque ou de l'outil correspondant a été intégrée dans le code source Android. Vous ne devriez donc pas essayer de l'installer à partir du système de packages d'Ubuntu, mais plutôt de compiler et d'installer la version fournie dans le code source Android.
Sachez que cela va à l'encontre des conseils généraux que vous pouvez trouver sur les forums: "Votre compilation échoue à cause de cette bibliothèque manquante? Installez ce paquet alors ça ira!" , en faisant cela, vous allez probablement tomber dans un problème pire: si une version spécifique est fournie, c'est probablement parce qu'une version spécifique est nécessaire (en raison de problèmes de compatibilité ou parce que cette version contient des modifications spécifiques de Google).
BTW, si vous vous posez la question: bien sûr, cette bibliothèque ou cet outil peut également avoir des dépendances provoquant des erreurs en raison de la *.h
non-découverte de certains fichiers, et oui, vous devez appliquer cette même approche cyclique "essayer et voir".
Recherche dans tout le système:
find / -name filename.h 2>/dev/null
Si vous trouvez "manquant" que le fichier est déjà présent dans votre système dans un emplacement de bibliothèque partagée standard, cela signifie que cette dépendance est probablement déjà rencontrée dans votre environnement mais le Makefile qui a déclenché l'erreur est trop stupide pour le trouver.
Si vous appelez directement ce Makefile manuellement, il peut être possible pour vous de définir une variable d'environnement qui le corrige ( LIBDIR=/usr/lib make
par exemple), sinon vous devrez peut-être modifier le Makefile lui-même (la pkg-config
commande peut être d'une aide précieuse pour générer automatiquement des paramètres de construction manquants) .
Recherche dans le système d'emballage:
apt-cache search filename-dev
Où filename-dev
représente le nom du fichier manquant en minuscules avec l' .h
extension remplacée par le -dev
suffixe (par exemple, s'il Python.h
n'est pas trouvé, recherchez python-dev
). Il peut être nécessaire de modifier le nom exact pour trouver le bon package.
Si vous restez coincé et que même une recherche rapide sur Internet n'a pas fourni de réponse claire, alors apt-file
sera votre meilleur ami. apt-file
n'est pas installé par défaut, vous devez l'installer et générer sa base de données:
sudo apt-get apt-file
sudo apt-file update
apt-file
vous permet de rechercher des packages (même désinstallés) fournissant un fichier particulier. Pour éviter d'avoir trop de résultat, je recommande de l'associer avec grep
comme ci-dessous:
apt-file search filename.h | grep -w filename.h
S'il y a un paquet dans le référentiel d'Ubuntu fournissant ce fichier, alors il apt-file
devrait être capable de le trouver.
Une fois que vous avez trouvé le bon package, installez-le en utilisant apt-get install packagename
où packagename
est le nom de votre package.
Astuce: Si vous foiré quelque chose sur votre système, la commande pour réinstaller un paquet est celuici:apt-get reinstall pkg_name
. Cela fonctionnera même quand une suppression / installation classique ne serait pas possible en raison de la rupture des dépendances (ce qui est très probable pour les bibliothèques du système).
Outils supplémentaires
À cette étape, vous devriez maintenant avoir un environnement propre vous permettant d'étudier les règles SELinux d'Android à la fois dans les formats compilés et source.
Cependant, la plupart des chances sont qu'à la fin de votre enquête, vous voudrez prendre des mesures. Dans sa forme actuelle, votre environnement ne vous permettra pas de modifier le sepolicy
fichier d' un périphérique . En fait, ce fichier ne peut pas être facilement remplacé: il fait partie du répertoire racine du périphérique et le contenu du répertoire racine est extrait au moment du démarrage à partir d'un fichier disque RAM, qui à son tour est stocké dans l'image de démarrage du périphérique.
Il vous manque donc encore deux choses avant que votre environnement ne soit complet:
- Un moyen d'accéder et de modifier l'image de démarrage de l'appareil,
- Une façon de modifier son
sepolicy
fichier.
Heureusement, ce sont précisément les deux dernières sections de cet article! :)
Récupérer et mettre à jour l'image de démarrage de l'appareil
Les outils pour récupérer et mettre à jour l'image de démarrage des périphériques peuvent être utilisés pour une grande variété de choses en dehors de la falsification des règles SELinux. J'ai donc créé une réponse dédiée , merci de vous y référer.
Modifier les règles SELinux de l'appareil
Vous avez ici deux possibilités principales:
- Construisez un nouveau
sepolicy
fichier à partir des règles de votre arborescence source (recherchez les .te
fichiers pour les trouver:, find $ANDROID_BUILD_TOP -name \*.te
ils sont répartis dans plusieurs répertoires).
- Modifiez le
sepolicy
fichier actuellement utilisé par l'appareil.
À moins que vous n'ayez vraiment besoin de créer vos règles à partir de zéro, ce qui est plus une tâche liée au développement et donc hors de portée ici, le deuxième choix semble de loin le plus sûr car vous êtes sûr que les seuls changements seront ceux que vous explicite.
Il y a eu un projet pour créer un outil vous permettant de décompiler un sepolicy
fichier sous une forme recompilable, permettant de modifier librement les règles entre les deux. Cependant, ce projet a été abandonné à l'état de preuve de concept. Vous trouverez toutes les informations à la fin de cet article de blog , le reste de l'article contient suffisamment de détails pour permettre à toute autre personne intéressée de prendre le relais.
La méthode actuellement recommandée pour modifier les sepolicy
règles va dans une autre direction: en modifiant directement le sepolicy
fichier binaire. l' outil sepolicy-inject permet cela et est activement maintenu.
Par souci d'exhaustivité, notez qu'une fourchette de cet outil existe. Il ajoute quelques fonctionnalités, dont certaines figurent sur la liste des tâches de l'auteur d'origine (comme la possibilité de supprimer une règle), ne me demandez pas pourquoi ils ont choisi de bifurquer au lieu de contribuer ...
Pour compiler et installer sepolicy-inject
, procédez simplement comme suit:
cd ~/android/
git clone https://bitbucket.org/joshua_brindle/sepolicy-inject.git
cd ./sepolicy-inject/
LIBDIR=/usr/lib make
sudo cp ./sepolicy-inject /usr/bin/
Exemple de cas d'utilisation
Supposons par exemple que vous souhaitiez ajouter l'autorisation correspondant au message d'erreur suivant:
avc: denied { read } for pid=128 comm="file-storage"
path="/data/media/0/path/to/some/file"
dev="mmcblk0p28" ino=811035 scontext=u:r:kernel:s0
tcontext=u:object_r:media_rw_data_file:s0 tclass=file permissive=0
Vous devrez récupérer l'image de démarrage de l'appareil, puis la décompresser pour accéder à son sepolicy
fichier.
Une vérification rapide à l'aide sesearch
montre qu'il n'y a en effet pas de règle d'autorisation (pour l'instant!):
$ sesearch -A -s kernel -t media_rw_data_file -c file -p read ./sepolicy
$
La commande n'a pas de sortie.
Ensuite, utilisez la commande ci-dessous pour ajouter la règle requise (notez la similitude entre les paramètres sesearch
et sepolicy-inject
):
sepolicy-inject -s kernel -t media_rw_data_file -c file -p read -P ./sepolicy
Maintenant, nous pouvons rappeler notre sesearch
commande:
$ sesearch -A -s kernel -t media_rw_data_file -c file -p read ./sepolicy
allow kernel media_rw_data_file:file read;
$
sesearch
la sortie montre que la stratégie a été correctement mise à jour.
Vous pouvez maintenant reconditionner le boot.img
fichier de l'appareil et le flasher à nouveau sur l'appareil. La vérification de la dernière heure de modification du /sepolicy
fichier est un moyen simple de s'assurer que votre appareil exécute désormais le sepolicy
fichier nouvellement mis à jour .
Conclusion
Vous devriez maintenant avoir un environnement complet vous permettant d'inspecter et de modifier librement les politiques SELinux des appareils Android. Prendre plaisir! :)
En parallèle, il existe également des outils permettant d'analyser et de modifier la politique SELinux directement depuis l'appareil .