用户/组ID信息存储在Android上的什么位置,该如何解释?


15

我一直想知道已经有一段时间了。Android在哪里存储用户和组ID信息?

例如,在标准Linux上,用户和组信息分别存储在/etc/passwd和中/etc/group。当您将用户添加到组中时,其用户名/ uid将被添加到该组中的用户列表中,例如,我的音频组条目/etc/group如下所示:

audio:x:29:pulse,edge-case

在我的Linux机器上,其中pulse被映射到pulseaudio守护程序的uid,边缘情况被映射到我的uid(1000)。

据我了解,安装在Android上的每个应用程序都具有自己的uid和gid,这是在Android上发生的应用程序“沙箱”的基础,因为它们都在各自的进程中运行并且无法访问其他应用程序的数据进程或其他应用程序拥有的文件,除非应用程序程序员创建的清单文件中有声明,该声明规定哪些信息要共享给其他应用程序,哪些则不共享。这也是应用程序在安装过程中通过请求被添加到INTERNET组或类似的方式来获得或请求访问网络服务的方式,不要在NET网络组的名称上引用我,这可能更像是INET或INET6,无论哪种方式,我都知道可以通过Android上的此机制将多个级别的网络访问权限授予应用程序。

我的问题是,此信息在Android中存储在哪里?

更进一步,是否可以修改?

我想将glibc堆栈与其内部的数据集成在一起 /etc/{passwd,group}文件中,相信我,它们存在于我的手机中,我什至还安装了许多其他好东西。

更新:进行了更多搜索,并且 这可能就是我想要的。

我将需要更深入地研究,并确保它是我想要的一切。

更新:(2014年6月27日5:40)

由于有人认为我不知道我在做什么或在说什么,所以让我澄清一下;

当映射到用户编号_应用编号时,Android上的用户UID偏移100000,而应用UID偏移10000,因此,当ps显示类似u0_a10之类的字样时,表示UID 100000的用户正在运行UID 10010的应用,

我从system / core / include / private / android_filesystem_config.h中提取了UID和用户/守护进程的名称,并使用它们来更新我的/ 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以及glibc堆栈中的守护程序或系统用户UID的信息同步。

你可以阅读更多有关此内容的书“嵌入式Android的”由Karim Yaghmour 这里出售

我的目标是使nvlc之类的程序正常运行,但我需要使UID和GID保持同步,以便Android知道我的用户及其所属的组,例如,我的大脑用户可以访问音频设备。

另外,我还需要通知Android有关Postres及其在网络组中的成员身份,以便它可以打开套接字并允许访问数据库。我暂时在内核中禁用了PARANOID_NETWORKING,但是这种黑客行为只能使Android像普通Linux一样安全。保留偏执设置并将组权限应用于我认为合适的守护程序/用户,将是很好的。

对于具有此类偏执狂和微调控件的面向公众的服务器,这将使Android成为出色的操作系统。想象一下可以访问Kerberos,LDAP,PAM或将您的电话用作配置了Radius的WAP的情况,所有这些都可以从Debian和其他发行版存储库免费获得。

我已经弄清楚了所有这些,我只需要知道如何更新Android的UID / GID数据库,每次安装应用程序时它都会更新,所以我知道这是可能的。

更新:(2014年6月30日晚上7:08)

查看以下文件中的数据后...

/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最后一栏中的条目,我确实了解该文件,任何人都可以解释一下吗?

Answers:


1

看到GET_ACCOUNTS许可了吗?(编者注:该特定功能可能也不是每个问题都有用的,因为它显然是为Web身份验证而开发的功能。)

就个人而言,我正在阅读有关在安装APK时计算出的UID / GID值的主题-目前,这是一篇简单的博客文章的研究-但我也想对此主题做进一步的研究。参考有关这些多重链接的OS功能的参考文档,在Android中,似乎在Android OS中有一个帐户服务。(编者注。此外,帐户服务似乎 Android可能更像是针对Android用户的网络帐户的应用程序开发的服务)

尽管我个人很想写另一篇文章,但是立即,但是帐户服务当然可能需要进一步研究。也许与在Android设备上应用Kerberos有关,这可能是正交的。关于在Android平台上实现Kerberos服务,存在一些现有工作。对于Web应用程序,当然有OAuth / OAuth2。

显然,Android不使用常规的UNIX passwd / shadow文件(Anderson2013)。目前,我的最佳估计是,Android OS帐户服务可能是进一步研究的主题...至少,以至于发现Android帐户服务可能是Web身份验证实用程序(API: AccountManager)。

我敢肯定/etc/passwd,在Android源代码的某个地方,还有更多关于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根据仿生/ libc的/ Android.bp仿生/ Android.bp。AID存储在用户名到UID的映射中struct android_id_info android_ids[],在查找时将它们转换为并设置为AID 的passwd结构,主目录设置为和shell设置为(code)。uidgid//system/bin/sh

  2. 如果在上一步中未找到用户,则该功能将查找OEM定义的用户。这些用户的UID的范围从AID_OEM_RESERVED_STARTAID_OEM_RESERVED_ENDAID_OEM_RESERVED_2_STARTAID_OEM_RESERVED_2_END。供应商定义的用户存储在中/vendor/etc/passwd。用户名设置为oem_${uid},其他属性设置为与AID用户相同的方式。

  3. 最后,它将检查所有应用程序用户,app_id_to_passwd()并且过程非常相似。

如果您希望获取所有passwd条目,请getpwent()在同一文件中查看getpwent(3)的联机帮助页。


0

首先,您知道每个应用程序都有其自己的唯一PID(进程ID),该PID由操作系统的内核分配给该应用程序。

  1. 在Android ADT中,您可以偏离方向在logcat中查看PID。
  2. 如果要在设备中查看PID,则需要从Play商店安装应用程序(无法保证该应用程序显示的PID是否真实)
  3. 来到修改部分是一个很大的问题。
  4. 不,您不能随意修改PID,因为这会导致安全问题,并且另一个应用之间的歧义可能会导致相同的PID,从而导致冲突。

6
这与PID无关,PID除了init始终是PID 1以外,都是可变的,因为它是要创建的第一个进程,这与使Android知道我的glibc堆栈中的UID有关(反之亦然) )(例如Postgres守护程序),也不是,这与安全无关,让Bionic堆栈知道我系统上的这些额外UID和GID可以提高安全性。如何使Android Kerberos,LDAP和PAM成为安全漏洞?太可怕了!
Overloaded_Operator
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.