Android'de kullanıcı / grup kimliği bilgileri nerede saklanır ve nasıl yorumlanır?


15

Bir süredir merak ediyorum; Android kullanıcı ve grup kimliği bilgilerini nerede saklıyor?

Örneğin, standart Linux'ta, kullanıcı ve grup bilgileri sırasıyla /etc/passwdve içinde saklanır /etc/group. Bir gruba kullanıcı eklediğinizde, kullanıcı adı / kullanıcı kimliği bu gruptaki kullanıcılar listesine eklenir; örneğin, içindeki ses grubu girişim /etc/groupşöyle görünür:

audio:x:29:pulse,edge-case

Nabız, pulseaudio arka plan programının daidine eşleştirilir ve edge-case, Linux kutumda uid'ime (1000) eşlenir.

Anladığım kadarıyla, Android'e yüklenen her uygulama kendi kullanıcı kimliğini ve yönünü alır ve bu, Android'de gerçekleşen ve hepsi kendi işlemlerinde çalıştığı ve başka bir uygulamanın verilerine erişemediği için uygulamaların "korumalı alanının" temelidir. uygulama programcıları tarafından oluşturulan ve hangi bilgilerin diğer uygulamalarla paylaşılacağını ve nelerin paylaşılmayacağını belirten bir Bildirim dosyasında olmadığı sürece başka bir uygulamaya ait işlem veya dosyalar. Bu aynı zamanda uygulamaların İNTERNET grubuna veya bunun gibi bir şeye eklenmesini talep ederek kurulum sırasında ağ hizmetlerine erişim kazanması veya daha çok talep etmesidir, bana NET net grubunun adına teklif vermeyin, daha çok INET veya INET6, her iki şekilde de Android'deki bu mekanizma yoluyla bir uygulamaya verilebilecek birkaç ağ erişimi seviyesi olduğunu biliyorum.

Sorum şu: Android'de bu bilgiler nerede saklanıyor?

Dahası, değiştirmek mümkün mü?

Bir glibc yığınını ve içindeki /etc/{passwd,group}dosyalarımla entegre etmek istiyorum , bana güvenin, telefonumda varlar, hatta birçok başka güzellikle yüklü bir apt var.

Güncelleme: Daha fazla arama yapıyordum ve aradığım şey bu olabilir.

Biraz daha derine inmem ve aradığım her şey olduğundan emin olmalıyım.

Güncelleme: (5:40 27 Haziran 2014)

Birisi ne yaptığımı veya hakkında konuştuğumu bilmediğimi düşündüğünden, açıklığa kavuşturayım;

Android'deki kullanıcı UID'leri 100000 ile dengelenir ve Uygulama UID'leri, kullanıcı numarası _ uygulama numarasına eşlendiğinde 10000 ile dengelenir, bu nedenle ps, u0_a10 gibi bir şey gösterdiğinde, UID 100000'li Kullanıcı UID 10010 ile uygulama çalıştırdığı anlamına gelir.

UID ve kullanıcı / daemon adlarını sistem / core / include / private / android_filesystem_config.h dosyasından aldım ve / etc / passwd ve / etc / group dosyalarımı (Android kutumda) güncellemek için kullandım, örneğin / etc / passwd dosyası (Android kutumda) şöyle görünür:

....
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 dosyasında yeni kullanıcılar oluşturmak için yapılandırmayı ayarladım (Android kutumda):

# 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

Bu, Android'in politikasına uygun olarak, "glibc tabanlı" sistem kullanıcılarının 100-999 aralığından oluşturulmasına izin verdim ve / etc / passwd ve / etc / group dosyalarımdaki ses kullanıcısını 1005 olacak şekilde değiştirdim. Android'de.

Android'i güncellemem ve Kullanıcı UID'lerimle ilgili bilgilerin yanı sıra Daemon veya glibc yığınından sistem kullanıcı UID'leri ile senkronize etmem gerekiyor.

Bununla ilgili daha fazla bilgiyi Karim Yaghmour'un "Gömülü Android" kitabından edinebilirsiniz.

Amacım nvlc gibi programların çalışmasını sağlamak ama UID ve GID'leri senkronize etmem gerekiyor, böylece Android kullanıcılarımdan ve ait oldukları gruplardan haberdar oluyor, örneğin beynim kullanıcısı ses cihazlarına erişebiliyor.

Ayrıca, soketleri açabileceği ve veritabanlarına erişime izin verebilmesi için Android'i Postres ve ağ grubundaki üyeliği hakkında bilgilendirmem gerekiyor. Şimdilik çekirdekteki PARANOID_NETWORKING işlevini devre dışı bıraktım, ancak bu kesmek sadece Android'i vanilya Linux olarak Güvenli hale getirmeye hizmet ediyor, daha az değil. Paranoyak ayarını korumak ve grup izinlerini uygun gördüğüm cinlere / kullanıcılara uygulamak iyi olurdu.

Bu, Android'i bu tür paranoyak ve ince ayarlı kontrollere sahip halka açık sunucular için harika bir işletim sistemi haline getirecektir. Kerberos, LDAP, PAM veya Telefonunuzu Radius yapılandırılmış WAP olarak kullanırken, hepsine Debian ve diğer dağıtım depolarından ücretsiz olarak erişebileceğinizi düşünün.

Bunu anladım, sadece bir uygulama yüklediğinizde güncellenen Android'in UID / GID veritabanını nasıl güncelleyeceğimi bilmeliyim, bu yüzden mümkün olduğunu biliyorum.

Güncelleme: (30 Haziran 2014 19:08)

Aşağıdaki dosyalardaki verileri inceledikten sonra ...

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

... sorumu "nasıl yorumlayabilirim?" İfadesini içerecek şekilde güncelledim.

  • Özel bir PAM modülü oluşturmam ve Bionic ve Glibc'i tek bir C kütüphanesine karıştırmam gerekeceğini düşünüyorum, her iki taraftaki uygulamalarla uyumlu olmaları, istisnalar yok, C ++ istisnaları bekliyorum; p --- yazdım birkaç kural başparmak-2 :) kendim için izleyin. Ayrıca, rpm ve apt gibi popüler paket yönetim sistemlerine, bir apk kurulumunu taklit eden ve her yeni deb | rpm paketine bir UID veren ve belki de her şeyi FHS'ye bağlayan bir paketleyici yazmam gerekebilir. Her biri kendi "manifest" in bir dizi izinlere ihtiyaç duyacağı için, en çok iş olsa da, gidebileceğim en ideal çözüm olabilir, belki bir kullanıcı yükleme sırasında bir menü verebilir ve gerektiği gibi alabilir.
  • Herkes bu dosyaların sözdizimini açıklayan iyi bir referans var mı? Ben XML ile çok iyi usta değilim, bahsetmiyorum genellikle kullanımı yorumlayan uygulamaya bağlıdır.
  • packages.listDosyayı nullson sütundaki giriş dışında anlıyorum, herkes açıklayabilir mi?

Yanıtlar:


1

GET_ACCOUNTSİzni gördünüz mü ? ( Ed. Not: Görünüşe göre web kimlik doğrulaması için moreso geliştirilmiş bir özellik olduğundan, bu özellik bu soru için her yararlı olmayabilir.)

Şahsen, APK kurulumu sırasında hesaplanan UID / GID değerleri ile ilgili olarak şu anda basit bir blog makalesi için araştırma olarak - konuyu okuyorum, ancak bu konuyu biraz daha incelemek istiyorum. Android'de bu çok bağlantılı işletim sistemi özellikleriyle ilgili referans belgelerine bakıldığında , Android işletim sisteminde bir Hesap Hizmeti var gibi görünüyor . ( Ed. Not Ayrıca, Android'deki Hesap Hizmeti , bir Android kullanıcısının web hesaplarıyla ilgili uygulama için geliştirilmiş bir hizmet olabilir)

Şahsen ben başka bir makale yazmaktan endişe duyuyorum, ancak kesinlikle Hesap Hizmeti biraz daha fazla çalışma yapabilir. Belki de Android cihazlara Kerberos uygulamasıyla ilgili olarak ortogonal olarak alakalı olabilir. Android platformunda Kerberos hizmetlerinin uygulanmasıyla ilgili mevcut bir çalışma var. Web uygulamaları için elbette OAuth / OAuth2 var.

Açıkçası, Android geleneksel UNIX parola / gölge dosyalarını kullanmaz ( Anderson2013 ). Şimdiye kadarki en iyi tahminim, Android OS Hesap Hizmetinin daha ileri bir çalışma tarzına konu olabileceğidir ... en azından, Android Hesap Hizmetinin bir web kimlik doğrulama yardımcı programı ( API: AccountManager ).

/etc/passwdAndroid kaynak kodunun bir yerinde, Android'in alternatifi hakkında daha fazla şey olduğundan eminim . Umarım, CyanogenMod'da da aynı şeye yaklaşılabilir.


1

İşte Android'in UID / GID aramasını nasıl uyguladığına dair düşüncelerim. Umarım soruları olan herkese yardımcı olur.

grp_pwd.cpp , Android'in bir UID / kullanıcı adını bir passwdyapıya nasıl çevirdiğini açıklar . Gönderen getpwuidfonksiyonu bunu görebilirsiniz

  1. UID birinci önceden tanımlanmış, AİDS ile karşılaştırılır generated_android_ids.haltında $(AOSP_ROOT)/out/soong/.intermediates/bionic/libc/generated_android_ids/genelde edilen android_filesystem_config.h göre biyonik / C kütüphanesi / Android.bp ve biyonik / Android.bp . AID'ler bir kullanıcı adında UID eşlemesinde saklanır struct android_id_info android_ids[]ve bakıldığında, AID passwdile yapıya dönüştürülür uidve gidana dizine ayarlanmış /ve kabuk /system/bin/sh( kod ) olarak ayarlanmış olarak ayarlanır .

  2. Önceki adımda hiçbir kullanıcı bulunamazsa, işlev OEM tanımlı kullanıcıları arayacaktır. Bu kullanıcıların UIDs aralığı AID_OEM_RESERVED_STARTiçin AID_OEM_RESERVED_ENDve AID_OEM_RESERVED_2_STARTiçin AID_OEM_RESERVED_2_END. Satıcı tanımlı kullanıcılar içinde depolanır /vendor/etc/passwd. Kullanıcı adları oem_${uid}ve diğer öznitelikler AID kullanıcılarıyla aynı şekilde ayarlanır.

  3. Son olarak, tüm uygulama kullanıcılarını kontrol edecek app_id_to_passwd()ve süreç çok benzer.

Tüm passwdgirişleri almak istiyorsanız , lütfen getpwent()aynı dosyaya ve getpwent (3) kılavuzuna bakınız.


0

Her şeyden önce, her Uygulamanın kendine özgü bir PID'si (İşlem Kimliği) olduğunu bildiğiniz gibi, bu PID, Uygulamaya İşletim Sistemi çekirdeği tarafından atanır.

  1. Android ADT'de ders dışı PID'yi logcat'te görüntüleyebilirsiniz.
  2. Cihazınızdaki PID'yi görüntülemek istiyorsanız, oyun mağazasından bir Uygulama yüklemeniz gerekir (uygulama tarafından görüntülenen PID'nin orijinal olup olmadığını garanti edemezsiniz)
  3. Modifikasyon kısmına gelmek büyük bir hayır.
  4. Hayır, PID'yi güvenlik endişelerine yol açacağı için dilediğiniz gibi değiştiremezsiniz ve başka bir uygulama için uygulamalar arasındaki belirsizlik aynı PID'ye sahip olabilir ve böylece Çatışma ile sonuçlanabilir.

6
Bunun, her zaman PID 1 olan init hariç değişken olan PID ile ilgisi yoktur, çünkü yaratılacak ilk işlemdir, bunun Android'i glibc yığınımdaki UID'lerden haberdar etmekle daha fazla ilgisi vardır (ya da tam tersi) ), Postgres arka plan programı gibi ve hayır, bu bir güvenlik sorunu değil, Biyonik yığının sistemimdeki bu ekstra UID'lerden ve GID'lerden haberdar olmasını sağlamak güvenliği artıracaktır. Android Kerberos, LDAP ve PAM'ı nasıl bilinçlendirmek bir güvenlik açığı olabilir ?! Harika olurdu!
Overloaded_Operator
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.