ข้อมูล id ผู้ใช้ / กลุ่มถูกเก็บไว้ใน Android และฉันจะตีความได้อย่างไร


15

ฉันสงสัยมาระยะหนึ่งแล้ว Android เก็บข้อมูลผู้ใช้และ ID กลุ่มไว้ที่ไหน

ตัวอย่างเช่นบน Linux มาตรฐานข้อมูลผู้ใช้และกลุ่มจะถูกเก็บไว้ใน/etc/passwdและ/etc/groupตามลำดับ เมื่อคุณเพิ่มผู้ใช้ในกลุ่มชื่อผู้ใช้ / uid ของเขาหรือเธอจะถูกเพิ่มไปยังรายชื่อผู้ใช้ในกลุ่มนั้นตัวอย่างเช่นรายการกลุ่มเสียงของฉัน/etc/groupมีลักษณะดังนี้:

audio:x:29:pulse,edge-case

ที่ซึ่งชีพจรถูกแมปกับ uid ของ pulseaudio daemon และ edge-case จะถูกแมปกับ uid ของฉัน (1,000) บนกล่อง Linux ของฉัน

ตามที่ฉันเข้าใจมันแต่ละแอพที่ติดตั้งบน Android จะเป็นของตัวเองทั้ง uid และ gid และนี่คือฐานของ "แซนด์บ็อกซ์" ของแอพที่เกิดขึ้นบน Android ในขณะที่พวกเขาทำงานในกระบวนการของตัวเอง กระบวนการหรือไฟล์ที่แอพอื่นเป็นเจ้าของเว้นแต่มีการประกาศในไฟล์ Manifest ที่สร้างขึ้นโดยโปรแกรมเมอร์แอพซึ่งกำหนดข้อมูลที่จะแชร์กับแอพอื่น ๆ นี่เป็นวิธีที่แอพได้รับหรือต้องการเข้าถึงบริการระบบเครือข่ายในระหว่างการติดตั้งโดยขอให้เพิ่มกลุ่มอินเทอร์เน็ตหรืออะไรทำนองนั้นอย่าอ้างฉันในชื่อกลุ่ม NET net มันอาจจะเป็น INET หรือ INET6 ทั้งสองวิธีที่ฉันรู้ว่ามีการเข้าถึงเครือข่ายหลายระดับที่สามารถมอบให้กับแอปพลิเคชันผ่านกลไกนี้บน Android

คำถามของฉันคือข้อมูลนี้เก็บอยู่ที่ไหนใน Android?

ยิ่งไปกว่านั้นมันเป็นไปได้ที่จะแก้ไข?

ฉันต้องการรวม glibc stack เข้ากับมันและข้อมูลที่อยู่ใน/etc/{passwd,group}ไฟล์ของฉันเชื่อฉันพวกเขามีอยู่ในโทรศัพท์ของฉันฉันยังมีการติดตั้ง apt กับสารพัดอื่น ๆ อีกมากมาย

อัปเดต: ทำการค้นหาเพิ่มเติมและ นี่อาจเป็นสิ่งที่ฉันกำลังมองหา

ฉันจะต้องขุดให้ลึกขึ้นอีกหน่อยและตรวจสอบให้แน่ใจว่าเป็นทุกสิ่งที่ฉันกำลังมองหา

อัปเดต: (5:40 27 มิถุนายน 2014)

เนื่องจากมีคนคิดว่าฉันไม่รู้ว่าฉันกำลังทำอะไรหรือพูดถึงอะไรให้ฉันอธิบาย;

UID ของผู้ใช้บน Android จะถูกชดเชยด้วย 100000 และ UID ของแอปจะถูกชดเชยด้วย 10,000 เมื่อแมปกับหมายเลขผู้ใช้ _ แอปดังนั้นเมื่อ ps แสดงบางอย่างเช่น u0_a10 ซึ่งหมายความว่าผู้ใช้ UID 100000 กำลังเรียกใช้แอปที่มี UID 10010

ฉันได้ดึง UID และชื่อผู้ใช้ / daemon จากระบบ / core / include / private / android_filesystem_config.h และใช้เพื่ออัปเดตไฟล์ / etc / passwd และ / etc / group ของฉัน (ในกล่อง Android ของฉัน) เช่น my / 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 based" ยังคงถูกสร้างขึ้นจากช่วง 100-999 ฉันเชื่อและฉันได้แก้ไขผู้ใช้เสียงในไฟล์ / etc / passwd และ / etc / group เป็น 1005 เช่น มันเป็นบน Android

ฉันต้องการอัปเดต Android และซิงโครไนซ์กับข้อมูลเกี่ยวกับ UID ผู้ใช้ของฉันเช่นเดียวกับ Daemon หรือ UID ผู้ใช้ระบบจาก glibc stack

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ในหนังสือ "Embedded Android" โดย Karim Yaghmour ขายที่นี่

เป้าหมายของฉันคือการรับโปรแกรมเช่น nvlc ให้ทำงาน แต่ฉันต้องได้รับ UID และ GIDs ให้ตรงกันเพื่อให้ Android รับรู้ถึงผู้ใช้ของฉันและกลุ่มที่พวกเขาอยู่เพื่อให้ตัวอย่างเช่นผู้ใช้สมองของฉันที่มีการเข้าถึงอุปกรณ์เสียง

นอกจากนี้ฉันต้องแจ้ง Android เกี่ยวกับ Postres และเป็นสมาชิกในกลุ่มเครือข่ายเพื่อให้สามารถเปิดซ็อกเก็ตและอนุญาตให้เข้าถึงฐานข้อมูล ฉันได้ปิดการใช้งาน PARANOID_NETWORKING ในเคอร์เนลในขณะนี้ แต่แฮ็คนี้ให้บริการเพื่อทำให้ Android ปลอดภัยเหมือน vanilla Linux ไม่น้อย มันจะเป็นการดีถ้าให้การตั้งค่าหวาดระแวงและใช้การอนุญาตกลุ่มกับ daemons / ผู้ใช้ที่ฉันเห็นว่าเหมาะสม

สิ่งนี้จะทำให้ Android เป็นระบบปฏิบัติการที่ยอดเยี่ยมสำหรับเซิร์ฟเวอร์สาธารณะที่มีการควบคุมหวาดระแวงและการปรับจูนดังกล่าว ลองนึกภาพว่ามีการเข้าถึง Kerberos, LDAP, PAM หรือเมื่อใช้โทรศัพท์ของคุณเป็น WAP ที่มีการกำหนดค่า Radius ซึ่งทั้งหมดนี้สามารถใช้ได้จาก Debian และ repos การกระจายอื่น ๆ ฟรี

ฉันได้สิ่งนี้มาทั้งหมดฉันแค่ต้องรู้วิธีอัปเดตฐานข้อมูล UID / GID ของ Android ซึ่งจะได้รับการปรับปรุงทุกครั้งที่คุณติดตั้งแอพดังนั้นฉันรู้ว่ามันเป็นไปได้

อัปเดต: (7:08 น. 30 มิถุนายน 2557)

หลังจากผ่านข้อมูลในไฟล์ต่อไปนี้ ...

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

... ฉันได้อัปเดตคำถามของฉันเพื่อรวม "ฉันจะตีความได้อย่างไร"

  • ฉันคิดว่าฉันจะต้องสร้างโมดูล PAM ที่กำหนดเองและผสมผสาน Bionic และ Glibc ลงในไลบรารี C เดียวพวกเขาต้องเข้ากันได้กับแอปพลิเคชันทั้งสองด้านโดยไม่มีข้อยกเว้นคาดว่าจะมีข้อยกเว้น C ++ นั่นคือ p --- ฉันได้เขียน กฎสองข้อของ thumb-2 :) ให้ฉันทำตาม ฉันอาจต้องเขียน wrapper ไปยังระบบการจัดการแพกเกจยอดนิยมเช่น rpm และ apt ที่ปลอมการติดตั้ง apk และให้ UID ใหม่แพ็คเกจ deb | rpm และบางที sym-link ทุกอย่างลงใน FHS นั่นอาจเป็นทางออกที่ดีที่สุดที่ฉันสามารถทำได้แม้จะใช้งานได้ดีที่สุดเพราะแต่ละอย่างจะต้องมีชุดการอนุญาตใน "รายการ" ของพวกเขาอาจมีเมนูระหว่างการติดตั้งที่ผู้ใช้สามารถให้และรับได้ตามต้องการ
  • ใครบ้างมีการอ้างอิงที่ดีที่อธิบายถึงไวยากรณ์ของไฟล์เหล่านี้หรือไม่ ฉันไม่ค่อยคุ้นเคยกับ XML มากและไม่ต้องพูดถึงการใช้งานขึ้นอยู่กับแอปพลิเคชันที่ตีความมัน
  • ฉันเข้าใจpackages.listไฟล์ด้วยข้อยกเว้นของnullรายการในคอลัมน์สุดท้ายทุกคนสามารถอธิบายได้หรือไม่

มีความเป็นไปได้ที่ซ้ำกันของUID ของแต่ละแอพพลิเคชั่นเก็บอยู่ที่ไหน?
xavier_fakerat

คำตอบ:


1

เห็นการGET_ACCOUNTSอนุญาตหรือไม่ ( Ed. หมายเหตุ:คุณลักษณะเฉพาะนั้นอาจไม่เป็นประโยชน์สำหรับคำถามนี้อย่างใดอย่างหนึ่งเนื่องจากเห็นได้ชัดว่าเป็นคุณลักษณะที่พัฒนาขึ้นสำหรับการตรวจสอบสิทธิ์เว็บ)

โดยส่วนตัวแล้วฉันกำลังอ่านเกี่ยวกับหัวข้อที่เกี่ยวข้องกับค่า UID / GID ที่คำนวณ ณ เวลาที่ติดตั้ง APK - ปัจจุบันเป็นงานวิจัยสำหรับบทความบล็อก 'ง่าย ๆ - แต่ฉันต้องการศึกษาหัวข้อนี้อีกเล็กน้อยเช่นกัน อ้างถึงเอกสารอ้างอิงเกี่ยวกับฟีเจอร์ OS ที่มีการเชื่อมโยงทวีคูณเหล่านี้ใน Android ดูเหมือนว่าจะมีบริการบัญชีใน Android OS ( เอ็ดหมายเหตุอาจดูเหมือนว่ายิ่งไปกว่านั้นบริการบัญชีใน Android อาจเป็นบริการที่พัฒนาขึ้นสำหรับแอปพลิเคชันเกี่ยวกับบัญชีเว็บของผู้ใช้ Android)

แม้ว่าโดยส่วนตัวแล้วฉันหมกมุ่นกับการเขียนบทความอื่นทันที แต่แน่นอนว่าบริการบัญชีอาจมีการศึกษาเพิ่มเติม บางทีมันอาจจะมีความเกี่ยวข้อง orthogonally เช่นเดียวกับการใช้ 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. โพสต์ที่เป็นครั้งแรกที่เมื่อเทียบกับโรคเอดส์ที่กำหนดไว้ล่วงหน้าจากgenerated_android_ids.hภายใต้$(AOSP_ROOT)/out/soong/.intermediates/bionic/libc/generated_android_ids/genซึ่งถูกสร้างขึ้นจากandroid_filesystem_config.hตามไบโอนิค / libc / Android.bpและไบโอนิค / Android.bp เครื่องช่วยฟังจะถูกเก็บไว้ในชื่อผู้ใช้ไปยังแผนที่ 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()ในไฟล์เดียวกันและยัง manpage ของgetpwent (3)


0

ก่อนอื่นตามที่คุณทราบว่าแอปพลิเคชันทุกตัวมี PID เฉพาะ (ID กระบวนการ) PID นี้จะถูกกำหนดให้กับแอปพลิเคชันโดยเคอร์เนลของระบบปฏิบัติการ

  1. ใน Android ADT คุณสามารถปิดการดู PID ใน logcat
  2. หากคุณต้องการดู PID ในอุปกรณ์ของคุณคุณต้องติดตั้งแอปพลิเคชันจากplay store (ไม่สามารถรับประกันได้ว่า PID ที่แสดงโดยแอพนั้นเป็นของแท้หรือไม่)
  3. การมาถึงส่วนของการดัดแปลงเป็นเรื่องใหญ่
  4. ไม่คุณไม่สามารถแก้ไข PID ได้ตามที่คุณต้องการเพราะจะนำไปสู่ปัญหาด้านความปลอดภัยเช่นเดียวกับความกำกวมระหว่างแอพสำหรับแอพอื่นอาจมี PID เดียวกันซึ่งทำให้เกิดข้อขัดแย้ง

6
สิ่งนี้ไม่มีอะไรเกี่ยวข้องกับ PID ซึ่งเป็นตัวแปรยกเว้น init ซึ่งเป็น PID 1 เสมอเนื่องจากเป็นกระบวนการแรกที่จะสร้างสิ่งนี้มีมากขึ้นเกี่ยวกับการทำให้ Android ตระหนักถึง UID จากสแต็ค glibc ของฉัน (และในทางกลับกัน ) เช่น Postgres daemon และไม่ใช่ไม่ใช่ปัญหาด้านความปลอดภัยทำให้ Bionic stack ตระหนักถึง UID พิเศษและ GID ที่ฉันมีในระบบของฉันจะเพิ่มความปลอดภัย การทำให้ Android Kerberos, LDAP และ PAM ทราบได้อย่างไรว่าเป็นข้อบกพร่องด้านความปลอดภัย! มันจะน่ากลัว!
Overloaded_Operator
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.