Де зберігається інформація про ідентифікатор користувача / групи на Android і як її інтерпретувати?


15

Я вже давно замислювався; де Android зберігає інформацію про ідентифікатор користувачів та групи?

Наприклад, у стандартному Linux інформація користувача та групи зберігається відповідно /etc/passwdта /etc/groupвідповідно. Коли ви додаєте користувача до групи, його ім’я / ім’я користувача uid додається до списку користувачів цієї групи, наприклад, запис моєї аудіо групи /etc/groupвиглядає приблизно так:

audio:x:29:pulse,edge-case

Там, де імпульс відображається на uid демона pulseaudio, а крайовий регістр відображається на мій uid (1000), на моєму вікні Linux.

Як я розумію, кожен додаток, який встановлюється на Android, отримує власні uid та gid, і це є основою "пісочниці" додатків, яка відбувається на Android, оскільки всі вони працюють у своєму власному процесі та не мають доступу до даних іншого процес або файли, що належать іншому додатку, якщо в файлі Manifest, створеному програмістами додатків, немає декларації, яка диктує, яку інформацію потрібно ділити іншим додаткам, а яку ні. Це також те, як додатки отримують або, швидше, запитують доступ до мережевих служб під час встановлення, вимагаючи додати до групи INTERNET або щось подібне, не цитуйте мене на ім’я NET net group, це може бути більше схоже на INET або INET6, так чи інакше мені відомо, є кілька рівнів доступу до мережі, які можна надати додатку через цей механізм на Android.

Моє запитання, де ця інформація зберігається в Android?

Далі більше, чи можна змінити?

Я хотів би інтегрувати стек glibc з ним і дані всередині нього у свої /etc/{passwd,group}файли, повірте, вони існують на моєму телефоні, у мене навіть встановлено підхоплення з багатьма іншими смакотами.

Оновлення: робив більше пошукових запитів, і це, можливо, те, що я шукаю.

Мені потрібно буде копати трохи глибше і переконатися, що це все, що я шукаю.

Оновлення: (5:40, 27 червня 2014 р.)

Оскільки хтось думає, що я не знаю, що я роблю чи кажу, дозвольте мені уточнити;

Користувацькі UID на Android компенсуються 100000, а UID додатків компенсується 10000 при зіставленні на номер користувача _ номер програми, отже, коли ps показує щось на зразок u0_a10, що означає, що користувач з UID 100000 працює з додатком з UID 10010,

Я витягнув імена UID та користувачів / демон в системі / core / include / private / android_filesystem_config.h і використовував їх для оновлення файлів / etc / passwd та / etc / group (у моєму вікні Android), наприклад, my / etc / файл passwd (у моєму Android-вікні) виглядає так:

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

Я створив конфігурацію в /etc/adduser.conf, щоб створити таких нових користувачів (на моєму 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

Це відповідно до політики Android, я дозволяю користувачам системи на основі glibc все ще створюватись із діапазону 100-999, я вважаю, і я змінив аудіокористувача у файлах / etc / passwd та / etc / group на 1005, наприклад це на Android.

Мені потрібно оновити Android і синхронізувати його з інформацією щодо моїх UID користувачів, а також з моїми UID користувачами Daemon або користувачем системи із стеку glibc.

Детальніше про це ви можете прочитати у книзі "Вбудований Android" Каріма Ягмура, проданого тут

Моя мета - змусити такі програми, як nvlc, працювати, але мені потрібно синхронізувати UID та GID, щоб Android усвідомлював моїх користувачів та групи, до яких вони належать, так що, наприклад, мій користувач із мозкових записів мав доступ до аудіопристроїв.

Також мені потрібно повідомити Android про Postres та його членство в групі мережі, щоб він міг відкривати сокети і дозволяти доступ до баз даних. Наразі я відключив PARANOID_NETWORKING в ядрі, але цей хак слугує лише для того, щоб зробити Android настільки ж безпечним, як ванільний Linux, не менше. Було б добре зберегти параноїдальну установку та застосувати групові дозволи до того, що демони / користувачі вважаю за потрібне.

Це зробило б Android чудовою операційною системою для публічних серверів з такими параноїдними та чітко налаштованими елементами управління. Уявіть, що ви маєте доступ до Kerberos, LDAP, PAM або Коли ви використовуєте свій телефон як WAP з налаштованим радіусом, усі вони доступні у Debian та інших репортажах дистрибуції безкоштовно.

У мене все це з’ясовано, мені просто потрібно знати, як оновити базу даних UID / GID Android, яка оновлюється щоразу, коли ви встановлюєте додаток, тож я знаю, що це можливо.

Оновлення: (19:08, 30 червня 2014 р.)

Після перегляду даних у наступних файлах ...

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

... Я оновив своє запитання, щоб включити "як його інтерпретувати?"

  • Я думаю, що мені знадобиться створити спеціальний модуль PAM і поєднати Bionic та Glibc в єдину бібліотеку C, вони повинні сумісні з програмами з обох сторін, без винятку, очікуйте винятків C ++, тобто; p --- я написав пару правил великого пальця-2 :) для себе, щоб я дотримувався. Можливо, мені також доведеться написати обгортку для популярних систем управління пакунками, таких як rpm та apt, які підробляють установку apk та надають кожному новому пакету deb | rpm UID та, можливо, просто пов'язують все в FHS. Це може бути найідеальнішим рішенням, над яким я можу піти, хоча це найбільше роботи, оскільки кожному потрібен набір дозволів у своєму "маніфесті", можливо, меню під час встановлення користувач може дати та прийняти за потреби.
  • Хтось має хороший довідник, який пояснює синтаксис цих файлів? Я не дуже добре розбираюся з XML, не кажучи вже про його використання, як правило, залежить від програми, яка його інтерпретує.
  • Я розумію packages.listфайл, за винятком nullзапису в останньому стовпчику, хтось може це пояснити?

Відповіді:


1

Бачили GET_ACCOUNTSдозвіл? ( Ред. Примітка. Ця особливість може не бути корисною для цього питання, оскільки, мабуть, функція, розроблена ще більше для веб-аутентифікації.)

Особисто я читаю про тему щодо значень UID / GID, обчислених під час встановлення APK - зараз, як дослідження для простої "статті блогу - але я також хотів би вивчити цю тему трохи далі. Посилаючись на довідкову документацію про ці багатопосередні функції ОС, в Android, здається, в ОС Android є служба обліку . ( Ред. Примітка. Крім того, може здатися, що Служба обліку в Android може бути більше сервісом, розробленим для програми щодо веб-облікових записів користувачів Android)

Хоча особисто я зайнятий написанням іншої статті, одразу, але, безумовно, Служба обліку може зазнати деякого подальшого вивчення. Можливо, це може бути доречним, ортогонально, щодо застосування Kerberos на пристроях Android. Існує деяка робота, що стосується впровадження сервісів Kerberos на платформі Android. Для веб-додатків, звичайно, є OAuth / OAuth2.

Очевидно, що Android не використовує звичайні UNIX-файли passwd / тіні ( Anderson2013 ). Моя найкраща оцінка в даний час полягає в тому, що Служба облікових записів Android OS може бути темою для подальшого вивчення ... принаймні, настільки, щоб виявити, що служба облікових записів Android може бути скоріше утилітою веб-аутентифікації ( API: AccountManager ).

Я впевнений, що існує щось більше про альтернативу Android /etc/passwdдесь у вихідному коді Android. Будемо сподіватися, що це близько, однак до CyanogenMod може підійти те саме.


1

Ось моя думка про те, як Android реалізує пошук UID / GID. Я сподіваюся, що це буде корисно для всіх, хто має запитання.

grp_pwd.cpp описує, як Android переводить UID / ім'я користувача в passwdструктуру. З getpwuidфункції ми бачимо це

  1. UID спочатку по порівнянні з визначеним AIDs з generated_android_ids.hпід $(AOSP_ROOT)/out/soong/.intermediates/bionic/libc/generated_android_ids/genяких генеруються з android_filesystem_config.h згідно біонічному / LIBC / Android.bp і біонічному / Android.bp . Ідентифікатори AID зберігаються в імені користувача до UID-карти в struct android_id_info android_ids[]і, коли їх шукають, вони перетворюються в passwdструктуру з uidі gidвстановлюються в AID, домашній каталог, встановлений в /оболонку та встановлений оболонку /system/bin/sh( код ).

  2. Якщо на попередньому кроці не знайдено жодного користувача, функція шукатиме користувачів, визначених OEM. У UIDs цих користувачів в діапазоні від AID_OEM_RESERVED_STARTдо AID_OEM_RESERVED_ENDі AID_OEM_RESERVED_2_STARTдо AID_OEM_RESERVED_2_END. Користувачі, визначені постачальником, зберігаються в /vendor/etc/passwd. Встановлено імена користувачів, oem_${uid}а інші атрибути встановлюються так само, як і користувачі AID.

  3. Нарешті, він перевірить усіх користувачів додатків, app_id_to_passwd()і процес дуже схожий.

Якщо ви хочете отримати всі passwdзаписи, перегляньте getpwent()цей самий файл, а також сторінку getpwent (3)


0

Перш за все, як вам відомо, що кожна програма має свій унікальний PID (ідентифікатор процесу), цей PID присвоюється додатку ядром операційної системи.

  1. В Android ADT ви можете відключити перегляд PID у логічній коті.
  2. Якщо ви хочете переглянути PID на своєму пристрої, вам потрібно встановити програму з ігрового магазину (не можна дати гарантії, справжній чи ні PID, відображений програмою)
  3. Прийти до модифікаційної частини - це велика ні.
  4. Ні, ви не можете змінити PID за своїм бажанням, оскільки це призведе до проблем безпеки, а також неоднозначність між додатками для іншого додатка може мати той самий PID, що призведе до конфлікту.

6
Це не має нічого спільного з PID, який є змінним, за винятком init, який завжди є PID 1, оскільки це перший процес, який потрібно створити, це більше стосується того, щоб Android дізнався про UID з мого стеку glibc (і навпаки ), таких як демон Postgres, і ні, це не проблема безпеки, тому що Bionic стек знає про ці додаткові UID та GID, які я маю в своїй системі, підвищить безпеку. Як же зробити так, щоб Android Kerberos, LDAP та PAM ставали в курсі безпеки ?! Це було б дивовижно!
Перевантажений_Оператор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.