Wo werden Benutzer- / Gruppen-ID-Informationen auf Android gespeichert und wie interpretiere ich sie?

15

Ich wundere mich jetzt schon seit einiger Zeit; Wo speichert Android seine Benutzer- und Gruppen-ID-Informationen?

Beispielsweise werden bei Standard-Linux Benutzer- und Gruppeninformationen in /etc/passwdbzw. gespeichert /etc/group. Wenn Sie einen Benutzer zu einer Gruppe hinzufügen, wird sein oder ihr Benutzername / UID zur Liste der Benutzer in dieser Gruppe hinzugefügt. Beispielsweise /etc/groupsieht der My Audio Group-Eintrag in folgendermaßen aus:

audio:x:29:pulse,edge-case

Wo Puls auf die UID des Pulseaudio-Daemons abgebildet wird und Edge-Case auf meine UID (1000) auf meiner Linux-Box abgebildet wird.

So wie ich es verstehe, erhält jede App, die auf Android installiert wird, eine eigene UID und GID. Dies ist die Grundlage für das "Sandboxing" von Apps, die auf Android ausgeführt werden und nicht auf Daten einer anderen zugreifen können Prozesse oder Dateien, die einer anderen App gehören, es sei denn, in einer Manifest-Datei, die von App-Programmierern erstellt wurde, ist festgelegt, welche Informationen für andere Apps freigegeben werden sollen und welche nicht. Auf diese Weise erhalten Apps auch Zugang zu Netzwerkdiensten während der Installation, oder fordern diese an, der INTERNET-Gruppe hinzugefügt zu werden, oder ähnliches. Zitieren Sie mich nicht auf den Namen der NET-Netzgruppe, es könnte sich eher um INET oder handeln So oder so, wie ich weiß, gibt es in INET6 mehrere Netzwerkzugriffsebenen, die einer Anwendung über diesen Mechanismus unter Android gewährt werden können.

Meine Frage ist, wo diese Informationen in Android gespeichert sind?

Ist es außerdem möglich, Änderungen vorzunehmen?

Ich möchte einen glibc-Stack damit integrieren und die darin enthaltenen Daten in meine /etc/{passwd,group}Dateien, vertraue mir, sie existieren auf meinem Telefon, ich habe sogar eine Menge anderer Extras installiert.

Update: Ich habe mehr gesucht und dies könnte das sein, wonach ich suche.

Ich muss ein bisschen tiefer graben und sicherstellen, dass es alles ist, was ich suche.

Update: (5:40 27. Juni 2014)

Da jemand denkt, ich wüsste nicht, was ich tue oder wovon ich rede, lass es mich klarstellen.

Benutzer-UIDs unter Android werden mit 100000 und App-UIDs mit 10000 versetzt, wenn sie der Benutzernummer _ App-Nummer zugeordnet sind. Wenn also ein ps so etwas wie u0_a10 anzeigt, bedeutet dies, dass Benutzer mit UID 100000 eine App mit UID 10010 ausführt.

Ich habe UID- und Benutzer- / Daemon-Namen aus system / core / include / private / android_filesystem_config.h abgerufen und diese verwendet, um meine / etc / passwd- und / etc / group-Dateien (auf meiner Android-Box) zu aktualisieren, zum Beispiel meine / etc / Die passwd-Datei (auf meiner Android-Box) sieht folgendermaßen aus:

....
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
....

Ich habe die Konfiguration in /etc/adduser.conf so eingerichtet, dass neue Benutzer erstellt werden (auf meiner Android-Box):

# 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

Dies entspricht der Android-Richtlinie, ich lasse "glibc-basierte" Systembenutzer immer noch aus dem Bereich 100-999 erstellen, und ich habe den Audio-Benutzer in meinen Dateien / etc / passwd und / etc / group auf 1005 geändert es ist auf Android.

Ich muss Android aktualisieren und mit Informationen zu meinen Benutzer-UIDs sowie zu meinen Daemon- oder Systembenutzer-UIDs aus dem glibc-Stack synchronisieren.

Lesen Sie mehr darüber in dem Buch "Embedded Android" von Karim Yaghmour, das hier verkauft wird

Mein Ziel ist es, Programme wie nvlc zum Laufen zu bringen, aber ich muss UIDs und GIDs synchronisieren, damit Android meine Benutzer und die Gruppen, denen sie angehören, kennt, damit beispielsweise mein Kopfnutzer Zugriff auf die Audiogeräte hat.

Außerdem muss ich Android über Postres und seine Mitgliedschaft in der Netzwerkgruppe informieren, damit es Sockets öffnen und den Zugriff auf Datenbanken ermöglichen kann. Ich habe PARANOID_NETWORKING vorerst im Kernel deaktiviert, aber dieser Hack dient nur dazu, Android so sicher wie Vanilla Linux zu machen, nicht weniger. Es wäre schön, die paranoide Einstellung beizubehalten und die Gruppenberechtigungen auf die Daemons / Benutzer anzuwenden, die ich für richtig halte.

Dies würde Android zu einem großartigen Betriebssystem für öffentlich zugängliche Server mit solch paranoiden und fein abgestimmten Steuerelementen machen. Stellen Sie sich vor, Sie haben Zugriff auf Kerberos, LDAP, PAM oder Wenn Sie Ihr Telefon als WAP mit konfiguriertem Radius verwenden. Alle diese Funktionen sind in Debian und anderen Distributions-Repos kostenlos verfügbar.

Ich habe das alles herausgefunden, ich muss nur wissen, wie man die UID / GID-Datenbank von Android aktualisiert, die jedes Mal aktualisiert wird, wenn Sie eine App installieren, also weiß ich, dass es möglich ist.

Update: (19:08 Uhr, 30. Juni 2014)

Nachdem Sie die Daten in den folgenden Dateien durchgegangen sind ...

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

... Ich habe meine Frage so aktualisiert, dass sie "Wie interpretiere ich sie?" Enthält.

  • Ich denke, ich muss ein benutzerdefiniertes PAM-Modul erstellen und Bionic und Glibc in eine einzige C-Bibliothek mischen. Sie müssen mit Anwendungen auf beiden Seiten kompatibel sein, keine Ausnahmen. Erwarten Sie C ++ - Ausnahmen, die ich geschrieben habe ein paar Faustregeln-2 :), denen ich folgen soll. Möglicherweise muss ich auch einen Wrapper für gängige Paketverwaltungssysteme wie rpm und apt schreiben, der eine apk-Installation fälscht und jedem neuen deb | rpm-Paket eine UID verleiht und möglicherweise einfach alles in das FHS einbindet. Das könnte die idealste Lösung sein, für die ich gehen könnte, obwohl die meiste Arbeit, da jeder eine Reihe von Berechtigungen in seinem "Manifest" benötigt, vielleicht ein Menü während der Installation, das der Benutzer geben und nehmen kann, wie es sein muss.
  • Hat jemand eine gute Referenz, die die Syntax dieser Dateien erklärt? Ich kenne mich mit XML nicht sehr gut aus. Ganz zu schweigen davon, dass die Verwendung normalerweise von der Anwendung abhängt, die es interpretiert.
  • Ich verstehe die packages.listDatei mit Ausnahme des nullEintrags in der letzten Spalte, kann das jemand erklären?
Overloaded_Operator
quelle
Mögliches Duplikat von Wo wird die UID für jede Anwendung gespeichert?
Xavier_Fakerat

Antworten:

1

Haben Sie die GET_ACCOUNTSErlaubnis gesehen? ( Anmerkung der Redaktion : Diese spezielle Funktion ist möglicherweise auch für diese Frage nicht immer nützlich, da es sich anscheinend um eine Funktion handelt, die ebenfalls für die Webauthentifizierung entwickelt wurde.)

Persönlich lese ich über das Thema hinsichtlich der UID / GID-Werte, die zum Zeitpunkt der APK-Installation berechnet wurden - derzeit als Recherche für einen einfachen Blog-Artikel -, aber ich möchte dieses Thema auch etwas weiter untersuchen. Mit Bezug auf die Referenzdokumentation über diese mehrfach verknüpften OS - Funktionen, in Android, scheint es ein ist Account Service im Android OS. ( Anmerkung der Redaktion Es scheint außerdem, dass der Kontodienst in Android eher ein Dienst ist, der für Anwendungen über die Webkonten eines Android-Benutzers entwickelt wurde.)

Ich persönlich bin zwar sofort damit beschäftigt, einen weiteren Artikel zu schreiben, aber der Kontoservice könnte weitere Studien benötigen. Vielleicht ist es orthogonal relevant, wenn es um die Anwendung von Kerberos auf Android-Geräten geht. Es gibt bereits einige Arbeiten zur Implementierung von Kerberos-Diensten auf der Android-Plattform. Für Web-Apps gibt es natürlich OAuth / OAuth2.

Offensichtlich verwendet Android keine herkömmlichen UNIX-Passwd- / Shadow-Dateien ( Anderson2013 ). Meine beste Schätzung, derzeit ist, dass der Android O Account Service ein Thema auf eine Art und Weise einer weiteren Studie ... zumindest sein kann, so weit, zu entdecken , dass der Android - Account Service eher sein kann Web - Authentifizierung Dienstprogramm ( API: AccountManager ).

Ich bin sicher /etc/passwd, irgendwo im Android-Quellcode gibt es etwas mehr über die Alternative von Android. Hoffentlich ist es fast so, wie es auch in CyanogenMod möglich ist.

Sean Champ
quelle
1

Hier meine Gedanken darüber, wie Android die UID / GID-Suche implementiert. Ich hoffe, es ist hilfreich für alle, die Fragen haben.

grp_pwd.cpp beschreibt, wie Android eine UID / einen Benutzernamen in eine passwdStruktur übersetzt. An der getpwuidFunktion können wir das erkennen

  1. Die UID wird zunächst mit den vordefinierten AIDs verglichen, generated_android_ids.hunter $(AOSP_ROOT)/out/soong/.intermediates/bionic/libc/generated_android_ids/gendenen aus android_filesystem_config.h gemäß bionic / libc / Android.bp und bionic / Android.bp generiert wird . Die AIDs werden in einem Benutzernamen für die UID-Zuordnung in gespeichert struct android_id_info android_ids[]und beim Aufrufen in die passwdStruktur konvertiert uidund gidauf AID, Basisverzeichnis auf /und Shell auf /system/bin/sh( Code ) gesetzt.

  2. Wenn im vorherigen Schritt kein Benutzer gefunden wurde, sucht die Funktion nach vom OEM definierten Benutzern. Die UIDs dieser Benutzer reichen von AID_OEM_RESERVED_STARTbis AID_OEM_RESERVED_ENDund AID_OEM_RESERVED_2_STARTbis AID_OEM_RESERVED_2_END. Die vom Hersteller definierten Benutzer werden in gespeichert /vendor/etc/passwd. Benutzernamen werden auf festgelegt, oem_${uid}und die anderen Attribute werden auf dieselbe Weise wie die AID-Benutzer festgelegt.

  3. Schließlich werden alle App-Benutzer eingecheckt app_id_to_passwd()und der Vorgang ist sehr ähnlich.

Wenn Sie alle passwdEinträge erhalten möchten, schauen Sie bitte getpwent()in die gleiche Datei und auch in die Manpage von getpwent (3).

ppoffice
quelle
0

Erstens, da Sie wissen, dass jede Anwendung eine eigene eindeutige PID (Prozess-ID) hat, wird diese PID der Anwendung vom Kernel des Betriebssystems zugewiesen.

  1. In Android ADT können Sie natürlich die PID im Logcat anzeigen.
  2. Wenn Sie die PID auf Ihrem Gerät anzeigen möchten, müssen Sie eine Anwendung aus dem Play Store installieren (es kann keine Garantie dafür übernommen werden, ob die von der App angezeigte PID echt ist oder nicht).
  3. Zum Modifikationsteil zu kommen ist eine große Nummer.
  4. Nein, Sie können die PID nicht nach Ihren Wünschen ändern, da dies zu Sicherheitsbedenken sowie zu Unklarheiten zwischen den Apps für eine andere App führen kann. Dies kann zu Konflikten führen.
user285oo6
quelle
6
Dies hat nichts mit der PID zu tun, die variabel ist, mit Ausnahme von init, das immer PID 1 ist, da es der erste Prozess ist, der erstellt wird. Dies hat mehr damit zu tun, Android auf UIDs von meinem glibc-Stack aufmerksam zu machen (und umgekehrt ), wie z. B. der Postgres-Daemon, und nein, es ist kein Sicherheitsrisiko, wenn der Bionic-Stack auf diese zusätzlichen UIDs und GIDs aufmerksam gemacht wird, die ich auf meinem System habe, würde dies die Sicherheit erhöhen. Wie kann es sein, dass Android Kerberos, LDAP und PAM als Sicherheitslücke eingestuft werden ?! Es wäre großartig!
Overloaded_Operator