Onde as informações de identificação de usuário / grupo são armazenadas no Android e como as interpreto?


15

Estou pensando há algum tempo; onde o Android armazena as informações de identificação de usuário e grupo?

Por exemplo, no Linux padrão, as informações de usuário e grupo são armazenadas em /etc/passwde /etc/group, respectivamente. Quando você adiciona um usuário a um grupo, seu nome de usuário / uid é adicionado à lista de usuários desse grupo, por exemplo, a entrada do meu grupo de áudio /etc/groupaparece assim:

audio:x:29:pulse,edge-case

Onde o pulso é mapeado para o uid do daemon pulseaudio e o edge-case é mapeado para o meu uid (1000), na minha caixa Linux.

Pelo que entendi, cada aplicativo que é instalado no Android recebe seu próprio uid e gid e essa é a base do "sandboxing" de aplicativos que ocorre no Android, pois todos são executados em seu próprio processo e não podem acessar dados de outro processo ou arquivos pertencentes a outro aplicativo, a menos que exista declaração em um arquivo de manifesto criado por programadores de aplicativos, que determina quais informações devem ser compartilhadas com outros aplicativos e quais não. É também assim que os aplicativos obtêm ou melhor, solicitam acesso aos serviços de rede durante a instalação, solicitando a inclusão no grupo INTERNET ou algo parecido. Não me cite o nome do grupo NET, pode ser mais parecido com INET ou INET6, de qualquer forma, sei que existem vários níveis de acesso à rede que podem ser concedidos a um aplicativo por meio desse mecanismo no Android.

Minha pergunta é: onde essas informações são armazenadas no Android?

Além disso, é possível modificar?

Gostaria de integrar uma pilha glibc a ela e os dados nela contidos nos meus /etc/{passwd,group}arquivos, confie em mim, eles existem no meu telefone, eu até tenho instalado com muitas outras vantagens.

Atualização: tenho feito mais pesquisas e isso pode ser o que estou procurando.

Vou precisar me aprofundar um pouco mais e garantir que seja tudo o que estou procurando.

Atualização: (5:40 27 de junho de 2014)

Como alguém pensa que eu não sei o que estou fazendo ou falando, deixe-me esclarecer;

Os UIDs de usuários no Android são compensados ​​com 100000 e os UIDs de aplicativos são compensados ​​com 10000 quando mapeados para o número de usuário _ número do aplicativo; portanto, quando um ps mostra algo como u0_a10, significa que o usuário com UID 100000 está executando o aplicativo com UID 10010,

Peguei nomes de UID e de usuário / daemon de system / core / include / private / android_filesystem_config.h e usei-os para atualizar meus arquivos / etc / passwd e / etc / group (Na minha caixa Android), por exemplo, meus / etc / O arquivo passwd (na minha caixa do Android) fica assim:

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

Eu configurei a configuração no /etc/adduser.conf para criar novos usuários assim (na minha caixa do 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

Isso está de acordo com a política do Android, deixo que os usuários do sistema "baseados em glibc" ainda sejam criados no intervalo de 100 a 1999, acredito e modifiquei o usuário de áudio nos meus arquivos / etc / passwd e / etc / group para 1005, como Está no Android.

Preciso atualizar o Android e sincronizá-lo com informações sobre meus UIDs de usuário, bem como com meu Daemon ou UIDs de usuário do sistema da pilha glibc.

Você pode ler mais sobre isso no livro "Android incorporado" de Karim Yaghmour Vendido aqui

Meu objetivo é fazer com que programas como o nvlc funcionem, mas preciso sincronizar UIDs e GIDs para que o Android esteja ciente dos meus usuários e dos grupos aos quais eles pertencem, para que, por exemplo, meu usuário com acesso limitado aos dispositivos de áudio.

Também preciso informar o Android sobre o Postres e sua associação ao grupo de rede para que ele possa abrir soquetes e permitir o acesso a bancos de dados. Por enquanto, desativei o PARANOID_NETWORKING no kernel, mas esse truque serve apenas para tornar o Android tão seguro quanto o vanilla Linux. Seria bom manter a configuração paranóica e aplicar as permissões de grupo a quais daemons / usuários que eu achar melhor.

Isso tornaria o Android um ótimo sistema operacional para servidores públicos, com controles paranóicos e refinados. Imagine ter acesso ao Kerberos, LDAP, PAM ou Ao usar seu telefone como WAP com o Radius configurado, todos disponíveis gratuitamente no Debian e em outros repositórios de distribuição.

Já entendi tudo, só preciso atualizar o banco de dados UID / GID do Android, que é atualizado toda vez que você instala um aplicativo, pelo que sei que é possível.

Atualização: (19:08 30 de junho de 2014)

Depois de revisar os dados nos seguintes arquivos ...

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

... Atualizei minha pergunta para incluir "como a interpreto?"

  • Eu acho que vou precisar criar um módulo PAM personalizado e misturar Bionic e Glibc em uma única biblioteca C, eles precisam ser compatíveis com aplicativos de ambos os lados, sem exceções, esperar exceções em C ++; p --- eu escrevi algumas regras básicas :) para eu seguir. Também posso precisar escrever um wrapper para sistemas populares de gerenciamento de pacotes, como o rpm e o apt, que falsificam a instalação de um apk e fornecem a cada novo pacote deb | rpm um UID e talvez apenas vincule tudo o que é necessário ao FHS. Essa pode ser a solução mais ideal que eu poderia buscar, embora a maioria funcione, pois cada uma delas precisaria de um conjunto de permissões em seu "manifesto", talvez um menu durante a instalação que o usuário possa dar e receber conforme necessário.
  • Alguém tem uma boa referência que explica a sintaxe desses arquivos? Não sou muito versado em XML, para não mencionar que seu uso geralmente depende do aplicativo que o interpreta.
  • Eu entendo o packages.listarquivo, com exceção da nullentrada na última coluna, alguém pode explicar isso?

Respostas:


1

Viu a GET_ACCOUNTSpermissão? ( Nota do editor: esse recurso em particular também pode não ser útil para esta pergunta, pois aparentemente é um recurso desenvolvido mais para autenticação na web.)

Pessoalmente, estou lendo sobre o tópico com relação aos valores de UID / GID calculados no momento da instalação do APK - atualmente, como pesquisa para um simples 'artigo de blog -, mas também gostaria de estudar um pouco mais esse tópico. Referindo-se à documentação de referência sobre esses recursos do sistema operacional com múltiplos links, no Android, parece que existe um Serviço de Conta no sistema operacional Android. ( Ed. Nota Pode parecer, além disso, que o Serviço de Conta no Android pode ser mais um serviço desenvolvido para aplicativos sobre as contas da web de um usuário do Android)

Embora pessoalmente eu esteja preocupado em escrever outro artigo, imediatamente, mas certamente o Serviço de Contas pode ter um estudo mais aprofundado. Talvez possa ser relevante, ortogonalmente, no que diz respeito à aplicação do Kerberos em dispositivos Android. Existe um trabalho existente no que diz respeito à implementação dos serviços Kerberos na plataforma Android. Para aplicativos da web, é claro que há OAuth / OAuth2.

Evidentemente, o Android não usa arquivos passwd / shadow convencionais do UNIX ( Anderson2013 ). Minha melhor estimativa, atualmente, é que o serviço de conta do sistema operacional Android pode ser o assunto de uma maneira de um estudo mais aprofundado ... pelo menos até o ponto de descobrir que o serviço de conta do Android pode ser um utilitário de autenticação da web ( API: AccountManager ).

Tenho certeza de que há algo mais sobre a alternativa /etc/passwddo Android em algum lugar do código-fonte do Android. Felizmente, é próximo, no entanto, a mesma coisa pode ser abordada no CyanogenMod.


1

Aqui estão meus pensamentos sobre como o Android implementa a pesquisa UID / GID. Espero que seja útil para quem está tendo as perguntas.

grp_pwd.cpp descreve como o Android converte um UID / nome de usuário em uma passwdestrutura. A partir da getpwuidfunção, podemos ver que

  1. O UID é primeiro comparada com os auxiliares predefinido generated_android_ids.hsob $(AOSP_ROOT)/out/soong/.intermediates/bionic/libc/generated_android_ids/geno qual é gerado a partir android_filesystem_config.h acordo com biônico / libc / Android.bp e biônico / Android.bp . Os AIDs são armazenados em um nome de usuário para mapear o UID struct android_id_info android_ids[]e, quando consultados, são convertidos na passwdestrutura com uide giddefinidos como AID, diretório inicial definido como /e shell definido como /system/bin/sh( código ).

  2. Se nenhum usuário for encontrado na etapa anterior, a função procurará usuários definidos pelo OEM. Os UIDs desses usuários variam de AID_OEM_RESERVED_STARTpara AID_OEM_RESERVED_ENDe AID_OEM_RESERVED_2_STARTpara AID_OEM_RESERVED_2_END. Os usuários definidos pelo fornecedor são armazenados /vendor/etc/passwd. Os nomes de usuário são definidos como oem_${uid}e os outros atributos são definidos da mesma maneira que os usuários do AID.

  3. Por fim, ele verifica todos os usuários do aplicativo app_id_to_passwd()e o processo é muito semelhante.

Se você deseja obter todas as passwdentradas, consulte getpwent()o mesmo arquivo e também a página de manual do getpwent (3)


0

Antes de tudo, como você está ciente de que todo aplicativo tem seu próprio PID (Process ID) exclusivo, esse PID é atribuído ao aplicativo pelo kernel do sistema operacional.

  1. No Android ADT, é possível visualizar fora do curso o PID no logcat.
  2. Se você deseja visualizar o PID no seu dispositivo, é necessário instalar um Aplicativo na Play Store (não é possível garantir se o PID exibido pelo aplicativo é genuíno ou não)
  3. Vir para a parte de modificação é um grande número
  4. Não, você não pode modificar o PID como desejar, pois isso levará a preocupações de segurança e a ambiguidade entre os aplicativos de outro aplicativo pode ter o mesmo PID, resultando em conflito.

6
Isso não tem nada a ver com o PID, que é variável, com exceção do init, que é sempre o PID 1, porque é o primeiro processo a ser criado; isso tem mais a ver com a conscientização do Android dos UIDs da minha pilha glibc (e vice-versa). ), como o daemon Postgres, e não, não é uma preocupação de segurança, tornar a pilha Bionic ciente desses UIDs e GIDs extras que tenho no meu sistema para aumentar a segurança. Como conscientizar o Android Kerberos, LDAP e PAM pode ser uma falha de segurança ?! Seria fantástico!
Overloaded_Operator
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.