23 votes

Où sont stockées les informations d'identification des utilisateurs et des groupes sur Android et comment les interpréter ?

Je me demande depuis un certain temps maintenant où Android stocke ses informations d'identification d'utilisateur et de groupe.

Par exemple, sous Linux standard, les informations sur les utilisateurs et les groupes sont stockées dans le répertoire /etc/passwd y /etc/group respectivement. Lorsque vous ajoutez un utilisateur à un groupe, son nom d'utilisateur/uid est ajouté à la liste des utilisateurs de ce groupe, par exemple l'entrée du groupe mon audio dans /etc/group ressemble à ça :

audio:x:29:pulse,edge-case

Où pulse est mappé à l'uid du daemon pulseaudio et edge-case est mappé à mon uid (1000), sur ma boîte Linux.

D'après ce que j'ai compris, chaque application installée sur Android obtient son propre uid et gid et c'est la base du "sandboxing" des applications qui se produit sur Android car elles s'exécutent toutes dans leur propre processus et ne peuvent pas accéder aux données d'un autre processus ou aux fichiers appartenant à une autre application, à moins qu'il n'y ait une déclaration dans un fichier Manifest créé par les programmeurs de l'application qui dicte quelles informations doivent être partagées avec d'autres applications ou non. C'est également de cette façon que les applications obtiennent ou plutôt demandent l'accès aux services de réseau pendant l'installation en demandant à être ajoutées au groupe INTERNET ou quelque chose comme ça, ne me citez pas le nom du groupe NET net, il pourrait être plus comme INET ou INET6, de toute façon je sais qu'il y a plusieurs niveaux d'accès au réseau qui peuvent être accordés à une application par ce mécanisme sur Android.

Ma question est la suivante : où ces informations sont-elles stockées dans Android ?

En outre, est-il possible de le modifier ?

J'aimerais y intégrer une pile glibc et les données qu'elle contient dans mon /etc/{passwd,group} croyez-moi, ils existent sur mon téléphone, j'ai même installé apt avec plein d'autres choses.

Mise à jour : J'ai fait plus de recherches et C'est peut-être ce que je cherche.

Je vais devoir creuser un peu plus et m'assurer que c'est tout ce que je recherche.

Mise à jour : (5:40 le 27 juin 2014)

Puisque quelqu'un pense que je ne sais pas ce que je fais ou ce dont je parle, permettez-moi de clarifier ;

Les UID des utilisateurs sur Android sont décalés de 100000 et les UID des applications sont décalés de 10000 lorsqu'ils sont mappés au numéro d'utilisateur _ numéro d'application, donc lorsqu'un ps montre quelque chose comme u0_a10, cela signifie que l'utilisateur avec l'UID 100000 exécute l'application avec l'UID 10010,

J'ai extrait les noms d'UID et d'utilisateur/daemon de system/core/include/private/android_filesystem_config.h et les ai utilisés pour mettre à jour mes fichiers /etc/passwd et /etc/group (sur mon boîtier Android), par exemple mon fichier /etc/passwd (sur mon boîtier Android) ressemble à ceci :

....
brainard:x:100002:100002:Professor Brainard,0420,,:/home/brainard
:/bin/bash
radio:x:1001:1001::/data/radio:/bin/false
bluetooth:x:1002:1002::/data/bluetooth:/bin/false
graphics:x:1003:1003::/home/graphics:/bin/false
input:x:1004:1004::/home/input:/bin/false
camera:x:1006:1006::/home/camera:/bin/false
log:x:1007:1007::/home/log:/bin/false
compass:x:1008:1008::/home/compass:/bin/false
mount:x:1009:1009::/home/mount:/bin/false
wifi:x:1010:1010::/home/wifi:/bin/false
adb:x:1011:1011::/home/adb:/bin/false
install:x:1012:1012::/home/install:/bin/false
media:x:1013:1013::/home/media:/bin/false
dhcp:x:1014:1014::/home/dhcp:/bin/false
....

J'ai mis en place une configuration dans /etc/adduser.conf pour créer de nouveaux utilisateurs comme ceci (sur mon Android) :

# FIRST_[GU]ID to LAST_[GU]ID inclusive is the range of UIDs of dynamically
# allocated user accounts/groups.
FIRST_UID=100001
LAST_UID=199999

FIRST_GID=100001
LAST_GID=199999

Ceci est en accord avec la politique d'Android, je laisse les utilisateurs du système "basé sur la glibc" être créés dans la plage 100-999 je crois et j'ai modifié l'utilisateur audio sur mes fichiers /etc/passwd et /etc/group pour être de 1005, comme c'est le cas sur Android.

J'ai besoin de mettre à jour Android et de le synchroniser avec les informations concernant mes UID d'utilisateur ainsi qu'avec mes UID de démon ou d'utilisateur système de la pile glibc.

Vous pouvez en savoir plus à ce sujet dans le livre "Embedded Android" de Karim Yaghmour. Vendu ici

Mon objectif est de faire fonctionner des programmes comme nvlc, mais j'ai besoin de synchroniser les UID et les GID pour qu'Android connaisse mes utilisateurs et les groupes auxquels ils appartiennent, afin que, par exemple, mon utilisateur brainard ait accès aux périphériques audio.

J'ai également besoin d'informer Android de Postres et de son appartenance au groupe réseau afin qu'il puisse ouvrir des sockets et permettre l'accès aux bases de données. J'ai désactivé PARANOID_NETWORKING dans le noyau pour le moment, mais ce hack ne sert qu'à rendre Android aussi sûr que vanilla Linux, pas moins. Ce serait bien de garder le paramètre paranoïaque et d'appliquer les permissions de groupe aux démons/utilisateurs qui me conviennent.

Cela ferait d'Android un excellent système d'exploitation pour les serveurs publics avec des contrôles aussi paranoïaques et précis. Imaginez que vous ayez accès à Kerberos, LDAP, PAM, ou que vous utilisiez votre téléphone comme WAP avec Radius configuré, tous ces systèmes sont disponibles gratuitement dans Debian et d'autres distributions.

J'ai tout compris, j'ai juste besoin de savoir comment mettre à jour la base de données UID/GID d'Android, qui est mise à jour à chaque fois que vous installez une application, donc je sais que c'est possible.

Mise à jour : (19 h 08 le 30 juin 2014)

Après avoir examiné les données dans les fichiers suivants ...

/data/system/packages.list
/data/system/packages.xml
/data/system/user/userlist.xml
/data/system/user/0.xml

... J'ai mis à jour ma question pour inclure "comment l'interpréter ?".

  • Je pense que je vais devoir créer un module PAM personnalisé et fusionner Bionic et Glibc en une seule bibliothèque C. Ils doivent être compatibles avec les applications des deux côtés, sans exceptions, sauf les exceptions C++ ;p--- J'ai écrit quelques règles du pouce-2 :) à suivre. Je pourrais aussi avoir besoin d'écrire un wrapper pour les systèmes de gestion de paquets populaires comme rpm et apt qui simule une installation apk et donne à chaque nouveau paquet deb|rpm un UID et peut-être juste un lien symétrique vers le FHS. C'est peut-être la solution la plus idéale que je puisse adopter, mais c'est aussi celle qui demande le plus de travail, car chaque paquet aurait besoin d'un ensemble de permissions dans son "manifeste", peut-être un menu pendant l'installation et l'utilisateur pourrait donner et prendre ce qu'il veut.
  • Quelqu'un a-t-il une bonne référence qui explique la syntaxe de ces fichiers ? Je ne connais pas très bien le XML, sans compter que son utilisation dépend généralement de l'application qui l'interprète.
  • Je comprends que packages.list à l'exception de l'élément null dans la dernière colonne, quelqu'un peut-il expliquer cela ?

4voto

ppoffice Points 51

Voici mes réflexions sur la façon dont Android met en œuvre la recherche d'UID/GID. J'espère que cela sera utile à tous ceux qui se posent ces questions.

grp_pwd.cpp décrit comment Android traduit un UID/nom d'utilisateur en un passwd structure. De la getpwuid nous pouvons voir que

  1. L'UID est d'abord comparé aux AIDs prédéfinis de l'UE. generated_android_ids.h sous $(AOSP_ROOT)/out/soong/.intermediates/bionic/libc/generated_android_ids/gen qui est généré à partir de android_filesystem_config.h en fonction de bionic/libc/Android.bp y bionic/Android.bp . Les AIDs sont stockés dans une carte de nom d'utilisateur à UIDs dans struct android_id_info android_ids[] et lorsqu'elles sont consultées, elles sont converties en format passwd structure avec uid y gid défini comme AID, le répertoire personnel défini comme / et la coquille est réglée sur /system/bin/sh ( Code ).

  2. Si aucun utilisateur n'est trouvé à l'étape précédente, la fonction recherche les utilisateurs définis par l'OEM. Les UIDs de ces utilisateurs vont de AID_OEM_RESERVED_START a AID_OEM_RESERVED_END y AID_OEM_RESERVED_2_START a AID_OEM_RESERVED_2_END . Les utilisateurs définis par le fournisseur sont stockés dans /vendor/etc/passwd . Les noms d'utilisateur sont fixés à oem_${uid} et les autres attributs sont définis de la même manière que pour les utilisateurs AID.

  3. Enfin, il vérifiera tous les utilisateurs de l'application dans app_id_to_passwd() et le processus est très similaire.

Si vous souhaitez obtenir tous passwd les entrées, veuillez jeter un coup d'œil à getpwent() dans le même fichier et aussi la page de manuel de getpwent(3)

1voto

Etienne Points 1864

Vu le GET_ACCOUNTS permission ? ( Ed. Note : Cette fonctionnalité particulière pourrait ne pas être très utile pour cette question non plus, car il s'agit apparemment d'une fonctionnalité développée plutôt pour l'authentification web).

Personnellement, je suis en train de lire sur le sujet en ce qui concerne les valeurs UID/GID calculées au moment de l'installation de l'APK - actuellement, comme recherche pour un simple article de blog - mais j'aimerais étudier ce sujet un peu plus en profondeur, aussi. Si l'on se réfère à la documentation de référence sur ces fonctionnalités d'OS à liens multiples, il semble qu'il y ait dans Android une fonction Service des comptes dans le système d'exploitation Android. ( Ed. Note Il peut sembler, en outre, que le Service des comptes dans Android peut être plus un service développé pour l'application sur les comptes web d'un utilisateur Android)

Bien que personnellement je sois préoccupé par l'écriture d'un autre article, immédiatement, mais certainement le Service des Comptes peut mériter une étude plus approfondie. Peut-être que cela pourrait être pertinent, de manière orthogonale, en ce qui concerne l'application de Kerberos sur les appareils Android. Il existe des travaux sur l'implémentation des services Kerberos sur la plateforme Android. Pour les applications web, il y a bien sûr OAuth/OAuth2.

De toute évidence, Android n'utilise pas les fichiers passwd/shadow conventionnels d'UNIX( Anderson2013 ). Ma meilleure estimation, à l'heure actuelle, est que le service de compte de l'OS Android peut être un sujet à une manière d'une étude plus approfondie ... au moins, jusqu'à découvrir que le service de compte Android peut être plutôt une authentification web utilitaire( API : AccountManager ).

Je suis sûr qu'il y a quelque chose de plus à propos de l'alternative d'Android à /etc/passwd quelque part dans le code source d'Android. Espérons qu'il est proche de la façon dont la même chose pourrait être abordée dans CyanogenMod.

0voto

user285oo6 Points 1150

Tout d'abord, comme vous le savez, chaque application a son propre PID (Process ID). Ce PID est attribué à l'application par le noyau du système d'exploitation.

  1. Dans Android ADT vous pouvez bien sûr voir le PID dans le logcat .
  2. Si vous voulez voir le PID de votre appareil, vous devez installer une application à partir du boutique en ligne (on ne peut pas garantir que le PID affiché par l'application est authentique ou non)
  3. Pour en venir à la partie modification, c'est un grand Non.
  4. Non, vous ne pouvez pas modifier le PID comme vous le souhaitez car cela conduirait à problèmes de sécurité ainsi qu'une ambiguïté entre les applications car une autre car une autre application pourrait avoir le même PID, ce qui entraînerait un conflit.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X