Где хранится информация об идентификаторе пользователя / группы на 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, поскольку все они запускаются в своем собственном процессе и не могут получить доступ к данным другого процесс или файлы, принадлежащие другому приложению, если в файле манифеста, созданном программистами приложения, нет декларации, которая определяет, какая информация должна быть передана другим приложениям, а какая нет. Это также, как приложения получают или, скорее, запрашивают доступ к сетевым службам во время установки, запрашивая добавление в группу ИНТЕРНЕТ или что-то в этом роде. Не указывайте меня в имени группы NET NET, это может быть больше похоже на INET или INET6, так или иначе, я знаю, что есть несколько уровней доступа к сети, которые могут быть предоставлены приложению через этот механизм на Android.

У меня вопрос, где эта информация хранится в Android?

Более того, возможно ли изменить?

Я хотел бы интегрировать в него стек glibc и данные в нем в моих /etc/{passwd,group}файлах, поверьте мне, они существуют на моем телефоне, я даже установил apt со многими другими вкусностями.

Обновление: делаю больше поисков, и это может быть то, что я ищу.

Мне нужно будет копнуть глубже и убедиться, что это все, что я ищу.

Обновление: (5:40 27 июня 2014 г.)

Поскольку кто-то думает, что я не знаю, что я делаю или о чем говорю, позвольте мне уточнить;

Пользовательские UID в Android смещены на 100000, а пользовательские UID смещены на 10000 при сопоставлении с номером пользователя _ номером приложения, следовательно, когда ps показывает что-то вроде u0_a10, что означает, что пользователь с UID 100000 запускает приложение с UID 10010,

Я извлек UID и имена пользователей / демонов из system / core / include / private / android_filesystem_config.h и использовал их для обновления файлов / etc / passwd и / etc / group (на моем Android-устройстве), например, моего / 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, а также с моим Daemon или системным пользовательским UID из стека glibc.

Подробнее об этом вы можете прочитать в книге Карима Ягмура «Встроенный Android». Продано здесь

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

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

Это сделало бы Android отличной операционной системой для общедоступных серверов с такими параноидальными и точно настроенными элементами управления. Представьте себе, что у вас есть доступ к Kerberos, LDAP, PAM или при использовании телефона в качестве WAP с настроенным Radius, и все они доступны в Debian и других дистрибутивных репозиториях бесплатно.

Я все понял, мне просто нужно знать, как обновить базу данных Android UID / GID, которая обновляется каждый раз, когда вы устанавливаете приложение, поэтому я знаю, что это возможно.

Обновление: (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записи в последнем столбце, кто-нибудь может объяснить это?
Overloaded_Operator
источник
Возможный дубликат Где хранятся UID для каждого приложения?
xavier_fakerat

Ответы:

1

Видели GET_ACCOUNTSразрешение? ( Ред. Примечание: эта конкретная функция может быть не совсем полезной для этого вопроса, так как она, очевидно, более разработана для веб-аутентификации.)

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

Хотя лично я озабочен написанием другой статьи, немедленно, но, безусловно, Служба аккаунтов может пройти дальнейшее изучение. Возможно, это может быть уместно, ортогонально, что касается применения Kerberos на устройствах Android. Есть некоторые из существующих работ, касающихся реализации сервисов Kerberos на платформе Android. Для веб-приложений, конечно, есть OAuth / OAuth2.

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

Я уверен, что есть что-то еще об альтернативе Android /etc/passwdгде-то в исходном коде Android. Надеюсь, это близко к тому же, однако, то же самое может быть достигнуто в CyanogenMod.

Шон Чамп
источник
1

Вот мои мысли о том, как Android реализует поиск UID / GID. Я надеюсь, что это будет полезно для всех, у кого есть вопросы.

grp_pwd.cpp описывает, как Android переводит UID / имя пользователя в passwdструктуру. Из getpwuidфункции видно, что

  1. Сначала UID сравнивается с предопределенными AID, из- generated_android_ids.hпод $(AOSP_ROOT)/out/soong/.intermediates/bionic/libc/generated_android_ids/genкоторых генерируется из android_filesystem_config.h в соответствии с bionic / libc / Android.bp и bionic / Android.bp . В AIDs хранится в имени пользователя на карту 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)

ppoffice
источник
0

Прежде всего, поскольку вы знаете, что каждое приложение имеет свой уникальный PID (идентификатор процесса), этот PID назначается приложению ядром операционной системы.

  1. В Android ADT вы можете, конечно, просматривать PID в logcat.
  2. Если вы хотите просмотреть PID на своем устройстве, вам нужно установить приложение из магазина игр (не может дать никакой гарантии, является ли PID, отображаемый приложением, подлинным или нет)
  3. Подойдя к части модификации, это большой номер.
  4. Нет, вы не можете изменить PID по своему усмотрению, так как это приведет к проблемам безопасности, а также к неоднозначности между приложениями для другого приложения, которые могут иметь одинаковый PID, что приведет к конфликту.
user285oo6
источник
6
Это не имеет ничего общего с PID, который является переменной, за исключением init, который всегда является PID 1, потому что это первый создаваемый процесс, это больше связано с информированием Android о UID из моего стека glibc (и наоборот ), например, демон Postgres, и нет, это не проблема безопасности, поскольку информирование стека Bionic об этих дополнительных UID и GID, которые есть в моей системе, может повысить безопасность. Как сделать так, чтобы Android Kerberos, LDAP и PAM знали о недостатках безопасности ?! Это было бы круто!
Overloaded_Operator