Où sont stockées les informations sur l'ID utilisateur / groupe sur Android et comment les interpréter?


15

Je me demande depuis un certain temps maintenant; où Android stocke-t-il ses informations sur les identifiants des utilisateurs et des groupes?

Par exemple, sur Linux standard, les informations sur les utilisateurs et les groupes sont stockées dans /etc/passwdet /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 my group audio dans /etc/groupressemble à ceci:

audio:x:29:pulse,edge-case

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

Si je comprends bien, 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'une autre processus ou fichiers appartenant à une autre application, à moins qu'il n'y ait une déclaration dans un fichier manifeste créé par les programmeurs d'application qui dicte quelles informations doivent être partagées avec d'autres applications et ce qui ne l'est pas. C'est aussi ainsi que les applications gagnent ou préfèrent accéder aux services de mise en réseau pendant l'installation en demandant à être ajoutées au groupe INTERNET ou quelque chose comme ça, ne me citez pas sur le nom du groupe net NET, cela pourrait être plus comme INET ou INET6, de toute façon, je sais qu'il existe plusieurs niveaux d'accès au réseau qui peuvent être accordés à une application via ce mécanisme sur Android.

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

De plus, est-il possible de modifier?

Je voudrais intégrer une pile glibc avec elle et les données qu'elle contient dans mes /etc/{passwd,group}fichiers, croyez-moi, elles existent sur mon téléphone, je les ai même installées avec beaucoup d'autres goodies.

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

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

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

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

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

J'ai extrait l'UID et les noms d'utilisateur / démon 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 ma boîte Android), par exemple mon / etc / Le fichier passwd (sur ma boîte 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 la configuration dans /etc/adduser.conf pour créer de nouveaux utilisateurs comme ça (sur ma boîte 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 conforme à la politique d'Android, je laisse les utilisateurs du système "basés sur la glibc" être créés à partir de la plage 100-999 je crois et j'ai modifié l'utilisateur audio sur mes fichiers / etc / passwd et / etc / group pour qu'il soit de 1005, comme c'est sur Android.

J'ai besoin de mettre à jour Android et de le synchroniser avec les informations concernant mes UID utilisateur ainsi qu'avec mes UID utilisateur Daemon ou 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 je dois synchroniser les UID et les GID pour qu'Android soit au courant de mes utilisateurs et des groupes auxquels ils appartiennent afin que, par exemple, mon utilisateur intelligent ait accès aux périphériques audio.

Je dois également informer Android de Postres et de son appartenance au groupe réseau afin qu'il puisse ouvrir des sockets et autoriser 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écurisé que Linux vanilla, rien de moins. Il serait bon de conserver le paramètre paranoïaque et d'appliquer les autorisations de groupe aux démons / utilisateurs que je juge appropriés.

Cela ferait d'Android un excellent système d'exploitation pour les serveurs publics avec de tels contrôles paranoïaques et affinés. Imaginez que vous ayez accès à Kerberos, LDAP, PAM ou lorsque vous utilisez votre téléphone en tant que WAP avec Radius configuré, qui sont tous disponibles gratuitement depuis Debian et d'autres référentiels de distribution.

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, 30 juin 2014)

Après avoir parcouru 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 mélanger Bionic et Glibc en une seule bibliothèque C, ils doivent être compatibles avec les applications des deux côtés, sans exception, attendez-vous à des exceptions C ++; p --- J'ai écrit quelques règles de base-2 :) pour moi de suivre. Je pourrais également avoir besoin d'écrire un wrapper sur des 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 simplement tout relier par sym-sym dans le FHS. Cela pourrait être la solution la plus idéale pour laquelle je pourrais aller, bien que la plupart fonctionnent, car chacun aurait besoin d'un ensemble d'autorisations dans son "manifeste", peut-être un menu pendant l'installation et l'utilisateur peut donner et prendre selon les besoins.
  • Quelqu'un at-il une bonne référence qui explique la syntaxe de ces fichiers? Je ne connais pas très bien le XML, sans oublier que son utilisation dépend généralement de l'application qui l'interprète.
  • Je comprends le packages.listfichier à l'exception de l' nullentrée dans la dernière colonne, quelqu'un peut-il expliquer cela?

Réponses:


1

Vu la GET_ACCOUNTSpermission? ( Note de la rédaction : cette fonctionnalité particulière pourrait ne pas être très utile non plus pour cette question, car il s'agit apparemment d'une fonctionnalité développée davantage pour l'authentification Web.)

Personnellement, je lis sur le sujet en ce qui concerne les valeurs UID / GID calculées au moment de l'installation de l'APK - actuellement, en tant que recherche d'un simple article de blog - mais je voudrais également étudier ce sujet un peu plus loin. En se référant à la documentation de référence sur ces fonctionnalités de système d'exploitation à liens multiples, dans Android, il semble qu'il existe un service de compte dans le système d'exploitation Android. ( NDLR. Il peut sembler, en outre, que le service de compte dans Android peut être davantage un service développé pour l'application sur les comptes Web d'un utilisateur Android)

Bien que personnellement, je suis préoccupé par l'écriture d'un autre article, immédiatement, mais le service des comptes peut certainement nécessiter une étude plus approfondie. Peut-être que cela peut être pertinent, orthogonalement, en ce qui concerne l'application de Kerberos sur les appareils Android. Il existe une partie du travail existant, en ce qui concerne la mise en œuvre des services Kerberos sur la plate-forme Android. Pour les applications Web, il y a bien sûr OAuth / OAuth2.

Évidemment, Android n'utilise pas les fichiers passwd / shadow UNIX conventionnels ( Anderson2013 ). Ma meilleure estimation, actuellement, est que le service de compte Android OS peut faire l'objet d'une étude plus approfondie ... au moins, jusqu'à découvrir que le service de compte Android peut être plutôt un utilitaire d' authentification Web ( API: AccountManager ).

Je suis sûr qu'il y a quelque chose de plus sur l'alternative d'Android /etc/passwd, quelque part dans le code source Android. Espérons que cela soit proche, mais la même chose pourrait être abordée dans CyanogenMod.


1

Voici mes réflexions sur la façon dont Android implémente la recherche UID / GID. J'espère que cela sera utile à tous ceux qui auront des questions.

grp_pwd.cpp décrit comment Android traduit un UID / nom d'utilisateur en une passwdstructure. De la getpwuidfonction, nous pouvons voir que

  1. L'UID est d'abord comparé aux AID prédéfinis de generated_android_ids.hdessous $(AOSP_ROOT)/out/soong/.intermediates/bionic/libc/generated_android_ids/genqui sont générés à partir de android_filesystem_config.h selon bionic / libc / Android.bp et bionic / Android.bp . Les AID sont stockés dans un nom d'utilisateur vers la carte UID struct android_id_info android_ids[]et lorsqu'ils sont recherchés, ils sont convertis dans la passwdstructure avec uidet giddéfinis sur AID, le répertoire personnel défini sur /et le shell défini sur /system/bin/sh( code ).

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

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

Si vous souhaitez obtenir toutes les passwdentrées, veuillez consulter getpwent()le même fichier ainsi que la page de manuel de getpwent (3)


0

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

  1. Dans Android ADT, vous pouvez bien sûr afficher le PID dans le logcat.
  2. Si vous souhaitez afficher le PID dans votre appareil, vous devez installer une application à partir du Play Store (ne peut donner aucune garantie si le PID affiché par l'application est authentique ou non)
  3. Venir à la partie modification est un gros non.
  4. Non, vous ne pouvez pas modifier le PID comme vous le souhaitez, car cela entraînera des problèmes de sécurité ainsi qu'une ambiguïté entre les applications pour une autre application peut avoir le même PID entraînant ainsi un conflit.

6
Cela n'a rien à voir avec PID, qui est variable à l'exception d'init qui est toujours PID 1 car c'est le premier processus à créer, cela a plus à voir avec la sensibilisation d'Android aux UID de ma pile glibc (et vice versa ), comme le démon Postgres, et non, ce n'est pas un problème de sécurité, informer la pile Bionic de ces UID et GID supplémentaires que j'ai sur mon système augmenterait la sécurité. Comment la prise de conscience d'Android Kerberos, LDAP et PAM pourrait-elle être une faille de sécurité?! Ce serait génial!
Overloaded_Operator
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.