23 votos

¿Dónde está almacenada la información de identificación de usuario/grupo en Android y cómo la inerpreto?

Me he estado preguntando durante bastante tiempo; ¿dónde almacena Android su información de identificación de usuario y grupo?

Por ejemplo, en el Linux estándar, la información de usuarios y grupos se almacena en /etc/passwd y /etc/group respectivamente. Cuando añades un usuario a un grupo, su nombre de usuario/identidad se añade a la lista de usuarios de ese grupo, por ejemplo la entrada de mi grupo de audio en /etc/group se parece a esto:

audio:x:29:pulse,edge-case

Donde pulso se mapea al uid del demonio pulseaudio y borde-caso se mapea a mi uid (1000), en mi caja de Linux.

Según tengo entendido, cada aplicación que se instala en Android obtiene su propio uid y gid y esta es la base del "sandboxing" de aplicaciones que se produce en Android ya que todas se ejecutan en su propio proceso y no pueden acceder a los datos de otro proceso o a los archivos propiedad de otra aplicación a menos que haya una declaración en un archivo manifiesto creado por los programadores de aplicaciones que dicte qué información debe ser compartida con otras aplicaciones y cuál no. Así es también como las aplicaciones obtienen o más bien solicitan el acceso a los servicios de red durante la instalación, solicitando ser añadidas al grupo INTERNET o algo así, no me cite en el nombre del grupo NET net, podría ser más como INET o INET6, de cualquier manera sé que hay varios niveles de acceso a la red que pueden ser concedidos a una aplicación a través de este mecanismo en Android.

Mi pregunta es, ¿dónde está almacenada esta información en Android?

Más aún, ¿es posible modificarlo?

Me gustaría integrar una pila glibc con ella y los datos dentro de ella en mi /etc/{passwd,group} archivos, confía en mí, existen en mi teléfono, incluso he instalado aptos con un montón de otras cosas.

Actualización: Se han estado haciendo más búsquedas y Esto podría ser lo que estoy buscando.

Necesitaré cavar un poco más profundo y asegurarme de que es todo lo que estoy buscando.

Actualización: (5:40 27 de junio de 2014)

Ya que alguien cree que no sé lo que hago o de lo que hablo, déjame aclararlo;

Los UID de usuario en Android se compensan con 100000 y los UID de aplicación se compensan con 10000 cuando se asignan al número de usuario _ número de aplicación, por lo tanto cuando una ps muestra algo como u0_a10 lo que significa que el usuario con UID 100000 está ejecutando la aplicación con UID 10010,

He sacado el UID y los nombres de usuario/ demonio de system/core/include/private/android_filesystem_config.h y los he usado para actualizar mis archivos /etc/passwd y /etc/group (en mi caja de Android), por ejemplo mi archivo /etc/passwd (en mi caja de Android) se ve así :

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

He establecido la configuración en /etc/adduser.conf para crear nuevos usuarios así (en mi caja de 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

Esto es de acuerdo con la política de Android, dejé que los usuarios del sistema "basado en glibc" sigan siendo creados desde el rango 100-999 creo y modifiqué el usuario de audio en mis archivos /etc/passwd y /etc/group para que sean de 1005, como en Android.

Necesito actualizar Android y sincronizarlo con la información relativa a mis UIDs de usuario así como con mis Daemon o UIDs de usuario del sistema de la pila glibc.

Puedes leer más sobre esto en el libro "Embedded Android" de Karim Yaghmour Vendido aquí

Mi objetivo es hacer que programas como nvlc funcionen, pero necesito sincronizar los UID y GID para que Android conozca a mis usuarios y los grupos a los que pertenecen para que, por ejemplo, el usuario de mi cerebro tenga acceso a los dispositivos de audio.

También tengo que informar a Android sobre Postres y su pertenencia al grupo de la red para que pueda abrir los enchufes y permitir el acceso a las bases de datos. He desactivado PARANOID_NETWORKING en el kernel por el momento, pero este hack sólo sirve para hacer a Android tan seguro como Linux vainilla, nada menos. Sería bueno mantener la configuración paranoica y aplicar los permisos de grupo a los demonios/usuarios que considere adecuados.

Esto haría de Android un gran sistema operativo para servidores de cara al público con controles tan paranoicos y ajustados. Imagina tener acceso a Kerberos, LDAP, PAM, o al usar tu teléfono como WAP teniendo Radius configurado, todos los cuales están disponibles en Debian y otros repositorios de la distribución de forma gratuita.

Tengo todo esto resuelto, sólo necesito saber cómo actualizar la base de datos UID/GID de Android, que se actualiza cada vez que se instala una aplicación, así que sé que es posible.

Actualización : (7:08pm 30 de junio de 2014)

Después de revisar los datos en los siguientes archivos...

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

... He actualizado mi pregunta para incluir "¿cómo lo interpreto?"

  • Creo que voy a necesitar crear un módulo PAM personalizado y mezclar Bionic y Glibc en una sola biblioteca de C, necesitan ser compatibles con las aplicaciones de ambos lados, sin excepciones, esperen excepciones de C++ que es ;p--- he escrito un par de reglas de pulgar-2 :) para que yo las siga. También podría necesitar escribir un envoltorio para los sistemas de gestión de paquetes populares como rpm y apt que simule una instalación de apk y le dé a cada nuevo paquete deb|rpm un UID y tal vez sólo sym-link todo en el FHS. Esa podría ser la solución más ideal que podría buscar, aunque la más trabajosa, ya que cada uno necesitaría un conjunto de permisos en su "manifiesto", tal vez un menú durante la instalación y el usuario puede dar y tomar según sus necesidades.
  • ¿Alguien tiene una buena referencia que explique la sintaxis de estos archivos? No estoy muy versado en XML, por no mencionar que su uso suele depender de la aplicación que lo interprete.
  • Entiendo que el packages.list con la excepción del archivo null en la última columna, ¿alguien puede explicar eso?

0 votos

4voto

Nelson Yeung Puntos 16

Aquí mis pensamientos sobre cómo Android implementa la búsqueda UID/GID. Espero que sea útil para cualquier persona que está teniendo las preguntas.

grp_pwd.cpp describe cómo Android traduce un UID/nombre de usuario a un passwd estructura. Desde el getpwuid podemos ver que

  1. El UID se compara primero con los AID predefinidos de generated_android_ids.h en $(AOSP_ROOT)/out/soong/.intermediates/bionic/libc/generated_android_ids/gen que se genera a partir de android_filesystem_config.h según bionic/libc/Android.bp y bionic/Android.bp . Los AID se almacenan en un mapa de nombre de usuario a UID en struct android_id_info android_ids[] y cuando se buscan, se convierten en el passwd estructura con uid y gid en AID, directorio personal en / y shell en /system/bin/sh ( código ).

  2. Si no se encuentra ningún usuario en el paso anterior, la función buscará usuarios definidos por OEM. Los UID de estos usuarios van desde AID_OEM_RESERVED_START a AID_OEM_RESERVED_END y AID_OEM_RESERVED_2_START a AID_OEM_RESERVED_2_END . Los usuarios definidos por el proveedor se almacenan en /vendor/etc/passwd . Los nombres de usuario se establecen en oem_${uid} y los demás atributos se establecen de la misma manera que los usuarios AID.

  3. Por último, comprobará todos los usuarios de la aplicación en app_id_to_passwd() y el proceso es muy similar.

Si desea obtener todos passwd entradas, eche un vistazo a getpwent() en el mismo archivo y también la página de manual de getpwent(3)

1voto

Etienne Puntos 1864

Visto el GET_ACCOUNTS ¿Permiso? ( Ed. Nota: Puede que esta función en concreto tampoco sea muy útil para esta pregunta, ya que aparentemente es una función desarrollada más para la autenticación web).

Personalmente, estoy leyendo sobre el tema en lo que respecta a los valores UID/GID calculados en el momento de la instalación del APK - actualmente, como investigación para un simple "artículo de blog - pero me gustaría estudiar este tema un poco más, también. En referencia a la documentación de referencia acerca de estas características del sistema operativo multi-linked, en Android, parece que hay un Servicio de cuentas en el sistema operativo Android. ( Ed. Nota Puede parecer, además, que la Servicio de cuentas en Android puede ser más un servicio desarrollado para la aplicación sobre las cuentas web de un usuario de Android)

Aunque personalmente estoy preocupado por escribir otro artículo, inmediatamente, pero ciertamente el Servicio de Cuentas puede merecer algún estudio más. Tal vez pueda ser relevante, ortogonalmente, en lo que respecta a la aplicación de Kerberos en dispositivos Android. Hay algunos de un trabajo existente, con respecto a la aplicación de los servicios de Kerberos en la plataforma Android. Para aplicaciones web, por supuesto está OAuth/OAuth2.

Evidentemente, Android no utiliza los archivos passwd/shadow convencionales de UNIX( Anderson2013 ). Mi mejor estimación, en la actualidad, es que el Servicio de Cuentas de Android OS puede ser un tema a una manera de un estudio más a fondo ... por lo menos, hasta el punto de descubrir que el Servicio de Cuentas de Android puede ser más bien un autenticación web utilidad( API AccountManager ).

Estoy seguro de que hay algo más sobre la alternativa de Android a /etc/passwd en algún lugar del código fuente de Android. Con suerte, es cerca de sin embargo lo mismo podría ser abordado en CyanogenMod.

0voto

user285oo6 Puntos 391

En primer lugar, como usted es consciente de que cada aplicación tiene su propio PID (Process ID), este PID se asigna a la aplicación por el núcleo del sistema operativo.

  1. En Android ADT puedes ver el PID en el logcat.
  2. Si quieres ver el PID de tu dispositivo, entonces necesitas instalar una solicitud de la tienda de juegos (no puede dar ninguna garantía de si el PID mostrado por la aplicación es genuino o no)
  3. Llegar a la parte de la modificación es un gran "no".
  4. No, no puede modificar la EPI como desee, ya que esto llevaría a preocupaciones de seguridad, así como la ambigüedad entre las aplicaciones para otro app puede tener la misma enfermedad inflamatoria pélvica, lo que da lugar a un conflicto.

6 votos

Esto no tiene nada que ver con el PID, que es variable con la excepción de init que siempre es PID 1 porque es el primer proceso que se crea, esto tiene más que ver con hacer que Android conozca los UID de mi pila glibc (y viceversa), como el demonio Postgres, y no, no es un problema de seguridad, hacer que la pila Bionic conozca estos UID y GID adicionales que tengo en mi sistema aumentaría la seguridad. ¡¿Cómo podría ser un fallo de seguridad hacer que Android Kerberos, LDAP y PAM sean conscientes de ello?! Sería increíble.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X