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/passwd
i /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/group
wyglą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.list
plik z wyjątkiemnull
wpisu w ostatniej kolumnie. Czy ktoś może to wyjaśnić?
źródło
Odpowiedzi:
Widziałeś
GET_ACCOUNTS
pozwolenie? ( 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/passwd
kodzie ź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.źródło
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
passwd
strukturę. Zgetpwuid
funkcji możemy to zobaczyćUID jest najpierw porównywany ze wstępnie zdefiniowanymi AID, na
generated_android_ids.h
podstawie$(AOSP_ROOT)/out/soong/.intermediates/bionic/libc/generated_android_ids/gen
których jest generowany z android_filesystem_config.h zgodnie z bionic / libc / Android.bp i bionic / Android.bp . Identyfikatory AID są przechowywane wstruct android_id_info android_ids[]
nazwie użytkownika do mapy UID, a po przejrzeniu są konwertowane dopasswd
struktury za pomocąuid
igid
ustawiane na AID, katalog domowy ustawiony na/
i shell ustawiony na/system/bin/sh
( kod ).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_START
celuAID_OEM_RESERVED_END
iAID_OEM_RESERVED_2_START
doAID_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.Wreszcie sprawdzi wszystkich użytkowników aplikacji,
app_id_to_passwd()
a proces będzie bardzo podobny.Jeśli chcesz uzyskać wszystkie
passwd
wpisy, zajrzyj dogetpwent()
tego samego pliku, a także do strony podręcznika getpwent (3)źródło
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.
źródło