Gdzie są przechowywane dane identyfikatora użytkownika / grupy na Androidzie i jak je interpretować?

15

Zastanawiam się już od dłuższego czasu; gdzie Android przechowuje informacje o użytkownikach i identyfikatorach grup?

Na przykład w standardowym systemie Linux informacje o użytkownikach i grupach są przechowywane odpowiednio w /etc/passwdi /etc/group. Gdy dodajesz użytkownika do grupy, jego nazwa użytkownika / identyfikator użytkownika jest dodawana do listy użytkowników w tej grupie, na przykład pozycja mojej grupy audio /etc/groupwygląda następująco:

audio:x:29:pulse,edge-case

Gdzie puls jest mapowany do UID demona pulseaudio, a przypadek krawędzi jest mapowany do mojego UID (1000) na moim Linux-ie.

Jak rozumiem, każda aplikacja instalowana na Androidzie ma swój własny identyfikator użytkownika i identyfikator gid, a to jest podstawa „piaskownicowania” aplikacji, które mają miejsce na Androidzie, ponieważ wszystkie działają we własnym procesie i nie mogą uzyskać dostępu do danych innego proces lub pliki należące do innej aplikacji, chyba że w pliku manifestu utworzonym przez programistów aplikacji znajduje się deklaracja określająca, jakie informacje mają być udostępniane innym aplikacjom, a które nie. W ten sposób aplikacje zyskują, a raczej żądają dostępu do usług sieciowych podczas instalacji, prosząc o dodanie do grupy INTERNET lub coś w tym rodzaju, nie cytuj mnie w nazwie grupy NET, może to być bardziej INET lub INET6, w każdym razie wiem, że istnieje kilka poziomów dostępu do sieci, które można przyznać aplikacji za pośrednictwem tego mechanizmu w systemie Android.

Moje pytanie brzmi: gdzie te informacje są przechowywane w systemie Android?

Co więcej, czy można modyfikować?

Chciałbym zintegrować z nim stos glibc i zawarte w nim dane w moich /etc/{passwd,group}plikach, zaufajcie mi, istnieją one na moim telefonie, mam nawet zainstalowane wiele innych dodatków.

Aktualizacja: Przeprowadziłem więcej wyszukiwań i może tego właśnie szukam.

Będę musiał kopać nieco głębiej i upewnić się, że to wszystko, czego szukam.

Aktualizacja: (5:40, 27 czerwca 2014 r.)

Ponieważ ktoś myśli, że nie wiem, co robię lub mówię, pozwól mi wyjaśnić;

Identyfikatory UID użytkownika w Androidzie są przesunięte o 100000, a identyfikatory UID aplikacji są przesunięte o 10000 po odwzorowaniu na numer użytkownika _ numer aplikacji, stąd gdy ps pokazuje coś w rodzaju u0_a10, co oznacza, że ​​użytkownik o UID 100000 działa z UID 10010

Wyciągnąłem UID i nazwy użytkownika / demona z systemu / core / include / private / android_filesystem_config.h i użyłem ich do aktualizacji plików / etc / passwd i / etc / group (na moim Androidzie), na przykład mojego / etc / plik passwd (na moim urządzeniu z Androidem) wygląda następująco:

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

Skonfigurowałem konfigurację w /etc/adduser.conf, aby tworzyć nowych użytkowników takich jak (na moim urządzeniu z Androidem):

# 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

Jest to zgodne z polityką Androida, pozwalam, aby użytkownicy systemu „opartego na glibc” nadal byli tworzeni z zakresu 100–999. Wierzę i zmodyfikowałem użytkownika audio w moich plikach / etc / passwd i / etc / group na 1005, takich jak to jest na Androida.

Muszę zaktualizować system Android i zsynchronizować go z informacjami dotyczącymi moich identyfikatorów UID użytkowników, a także z identyfikatorami UEM użytkownika demona lub użytkownika systemowego ze stosu glibc.

Możesz przeczytać więcej na ten temat w książce „Embedded Android” Karim Yaghmour Sprzedany tutaj

Moim celem jest, aby programy takie jak nvlc działały, ale muszę zsynchronizować identyfikatory UID i GID, aby Android wiedział o moich użytkownikach i grupach, do których należą, aby na przykład mój użytkownik z dostępem miał dostęp do urządzeń audio.

Muszę również poinformować Androida o Postres i jego członkostwie w grupie sieci, aby mógł otwierać gniazda i umożliwić dostęp do baz danych. Na razie wyłączyłem PARANOID_NETWORKING w jądrze, ale ten hack służy tylko do uczynienia Androida tak bezpiecznym jak waniliowy Linux. Byłoby miło zachować ustawienie paranoiczne i zastosować uprawnienia grupy do tych demonów / użytkowników, których uważam za stosowne.

To sprawiłoby, że Android byłby doskonałym systemem operacyjnym dla serwerów publicznych z tak paranoicznymi i precyzyjnie kontrolowanymi kontrolami. Wyobraź sobie, że masz dostęp do Kerberos, LDAP, PAM lub Gdy używasz telefonu jako WAP z skonfigurowanym Radius, wszystkie z nich są dostępne bezpłatnie w Debianie i innych repozytoriach dystrybucyjnych.

Rozumiem to wszystko, muszę tylko wiedzieć, jak zaktualizować bazę danych UID / GID Androida, która jest aktualizowana za każdym razem, gdy instalujesz aplikację, więc wiem, że jest to możliwe.

Aktualizacja: (19:08, 30 czerwca 2014 r.)

Po przejrzeniu danych w następujących plikach ...

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

... zaktualizowałem swoje pytanie, aby zawierało „jak to zinterpretować?”

  • Myślę, że będę musiał stworzyć niestandardowy moduł PAM i połączyć Bionic i Glibc w jedną bibliotekę C, muszą one być kompatybilne z aplikacjami po obu stronach, bez wyjątków, oczekuj wyjątków C ++, to znaczy; p --- napisałem kilka zasad kciuka-2 :) dla mnie do naśladowania. Być może będę musiał także napisać opakowanie do popularnych systemów zarządzania pakietami, takich jak rpm i apt, które udają instalację apk i dają każdemu nowemu pakietowi deb | rpm identyfikator UID, a może po prostu sym-link wszystko do FHS. To może być najbardziej idealne rozwiązanie, na jakie mógłbym pójść, choć najbardziej pracujące, ponieważ każde z nich potrzebuje zestawu uprawnień w swoim „manifeście”, być może menu podczas instalacji, które użytkownik może dać i wziąć w razie potrzeby.
  • Czy ktoś ma dobre referencje, które wyjaśniają składnię tych plików? Nie jestem zbyt dobrze zaznajomiony z XML, nie wspominając, że jego użycie zwykle zależy od aplikacji, która go interpretuje.
  • Rozumiem packages.listplik z wyjątkiem nullwpisu w ostatniej kolumnie. Czy ktoś może to wyjaśnić?
Overloaded_Operator
źródło
Możliwy duplikat Gdzie są przechowywane UID dla każdej aplikacji?
xavier_fakerat

Odpowiedzi:

1

Widziałeś GET_ACCOUNTSpozwolenie? ( Ed. Uwaga: Ta konkretna funkcja może nie być również przydatna w przypadku tego pytania, ponieważ jest to najwyraźniej funkcja opracowana w dalszym ciągu do uwierzytelniania sieciowego).

Osobiście czytam na ten temat w odniesieniu do wartości UID / GID obliczanych w czasie instalacji APK - obecnie jako badanie prostego „artykułu na blogu” - ale chciałbym również przestudiować ten temat nieco dalej. Odwołując się do dokumentacji referencyjnej dotyczącej tych wielokrotnie połączonych funkcji systemu operacyjnego, w Androidzie wydaje się, że w systemie Android jest usługa konta . ( Wyd. Uwaga. Może się wydawać, że usługa kont w systemie Android może być bardziej usługą opracowaną dla aplikacji dotyczących kont internetowych użytkownika systemu Android)

Chociaż osobiście jestem zajęty pisaniem kolejnego artykułu, od razu, ale z pewnością usługa konta może przejść trochę dalszych badań. Być może może to być istotne, ortogonalnie, w odniesieniu do stosowania Kerberos na urządzeniach z Androidem. Istnieją pewne prace dotyczące wdrażania usług Kerberos na platformie Android. W przypadku aplikacji internetowych jest oczywiście OAuth / OAuth2.

Najwyraźniej Android nie używa konwencjonalnych plików passwd / shadow UNIX ( Anderson2013 ). Według moich najlepszych szacunków usługa kont systemu Android może być tematem dalszych badań ... przynajmniej w takim stopniu, w jakim można stwierdzić, że usługa kont systemu Android może być raczej narzędziem uwierzytelniania internetowego ( API: AccountManager ).

Jestem pewien, że w /etc/passwdkodzie źródłowym Androida jest coś więcej niż alternatywa dla Androida. Mamy nadzieję, że jest blisko, jednak w CyanogenMod można podejść do tego samego.

Sean Champ
źródło
1

Oto moje przemyślenia na temat tego, jak Android implementuje wyszukiwanie UID / GID. Mam nadzieję, że przyda się każdemu, kto ma pytania.

grp_pwd.cpp opisuje jak Android tłumaczy UID / nazwę użytkownika na passwdstrukturę. Z getpwuidfunkcji możemy to zobaczyć

  1. UID jest najpierw porównywany ze wstępnie zdefiniowanymi AID, na generated_android_ids.hpodstawie $(AOSP_ROOT)/out/soong/.intermediates/bionic/libc/generated_android_ids/genktórych jest generowany z android_filesystem_config.h zgodnie z bionic / libc / Android.bp i bionic / Android.bp . Identyfikatory AID są przechowywane w struct android_id_info android_ids[]nazwie użytkownika do mapy UID, a po przejrzeniu są konwertowane do passwdstruktury za pomocą uidi gidustawiane na AID, katalog domowy ustawiony na /i shell ustawiony na /system/bin/sh( kod ).

  2. Jeśli w poprzednim kroku nie zostanie znaleziony żaden użytkownik, funkcja wyszuka użytkowników zdefiniowanych przez producenta OEM. UID tych użytkowników wahają się od AID_OEM_RESERVED_STARTcelu AID_OEM_RESERVED_ENDi AID_OEM_RESERVED_2_STARTdo AID_OEM_RESERVED_2_END. Użytkownicy zdefiniowani przez dostawcę są zapisani w /vendor/etc/passwd. Nazwy użytkowników są ustawione na, oem_${uid}a pozostałe atrybuty są ustawione w taki sam sposób, jak użytkownicy AID.

  3. Wreszcie sprawdzi wszystkich użytkowników aplikacji, app_id_to_passwd()a proces będzie bardzo podobny.

Jeśli chcesz uzyskać wszystkie passwdwpisy, zajrzyj do getpwent()tego samego pliku, a także do strony podręcznika getpwent (3)

ppoffice
źródło
0

Po pierwsze, ponieważ zdajesz sobie sprawę, że każda aplikacja ma swój unikalny identyfikator PID (identyfikator procesu), ten identyfikator PID jest przypisany do aplikacji przez jądro systemu operacyjnego.

  1. W Android ADT możesz oczywiście zobaczyć PID w logcat.
  2. Jeśli chcesz wyświetlić PID w swoim urządzeniu, musisz zainstalować aplikację ze sklepu Play (nie daje żadnej gwarancji, czy PID wyświetlany przez aplikację jest prawdziwy, czy nie)
  3. Przychodzenie do części modyfikującej jest dużym nie.
  4. Nie, nie możesz modyfikować PID według własnego uznania, ponieważ spowoduje to obawy związane z bezpieczeństwem, a dwuznaczność między aplikacjami dla innej aplikacji może mieć ten sam PID, a tym samym prowadzić do konfliktu.
użytkownik285oo6
źródło
6
Nie ma to nic wspólnego z PID, który jest zmienny, z wyjątkiem init, którym zawsze jest PID 1, ponieważ jest to pierwszy proces, który ma zostać utworzony, ma to więcej wspólnego z uświadomieniem Androidowi UID z mojego stosu glibc (i odwrotnie ), takich jak demon Postgres, i nie, nie jest to kwestia bezpieczeństwa, dlatego powiadomienie stosu Bionic o tych dodatkowych UID i GID, które mam w moim systemie, zwiększyłoby bezpieczeństwo. Jak uświadomienie Android Kerberos, LDAP i PAM może być błędem w zabezpieczeniach ?! Byłoby wspaniale!
Overloaded_Operator