Thông tin id người dùng / nhóm được lưu trữ trên Android ở đâu và làm cách nào để diễn giải nó?


15

Tôi đã tự hỏi khá lâu rồi; Android lưu trữ thông tin id người dùng và nhóm ở đâu?

Chẳng hạn, trên Linux tiêu chuẩn, thông tin người dùng và nhóm được lưu trữ trong /etc/passwd/etc/group, tương ứng. Khi bạn thêm người dùng vào một nhóm, tên người dùng / uid của người đó sẽ được thêm vào danh sách người dùng trong nhóm đó, ví dụ như mục nhập nhóm âm thanh của tôi /etc/grouptrông như thế này:

audio:x:29:pulse,edge-case

Trường hợp xung được ánh xạ tới uid của daemon pulseaudio và trường hợp cạnh được ánh xạ tới uid của tôi (1000), trên hộp Linux của tôi.

Theo tôi hiểu, mỗi ứng dụng được cài đặt trên Android đều có uid và gid riêng và đây là cơ sở của "hộp cát" các ứng dụng xảy ra trên Android vì tất cả chúng đều chạy trong quy trình của riêng chúng và không thể truy cập dữ liệu của người khác xử lý hoặc các tệp thuộc sở hữu của ứng dụng khác trừ khi có tuyên bố trong tệp Manifest được tạo bởi các lập trình viên ứng dụng, điều này cho biết thông tin nào sẽ được chia sẻ cho các ứng dụng khác và không. Đây cũng là cách các ứng dụng đạt được hoặc đúng hơn là yêu cầu quyền truy cập vào các dịch vụ mạng trong khi cài đặt bằng cách yêu cầu thêm vào nhóm INTERNET hoặc đại loại như thế, đừng trích dẫn tôi tên của nhóm mạng NET, nó có thể giống như INET hoặc INET6, theo cách nào đó tôi biết có một số cấp truy cập mạng có thể được cấp cho một ứng dụng thông qua cơ chế này trên Android.

Câu hỏi của tôi là, thông tin này được lưu trữ trong Android ở đâu?

Hơn nữa, nó có thể sửa đổi?

Tôi muốn tích hợp một ngăn xếp glibc với nó và dữ liệu trong nó trong /etc/{passwd,group}các tập tin của tôi , tin tôi đi, chúng tồn tại trên điện thoại của tôi, tôi thậm chí còn cài đặt apt với rất nhiều tính năng khác.

Cập nhật: Đã thực hiện nhiều tìm kiếm hơn và đây có thể là những gì tôi đang tìm kiếm.

Tôi sẽ cần phải đào sâu hơn một chút và chắc chắn rằng đó là tất cả mọi thứ tôi đang tìm kiếm.

Cập nhật: (5:40 ngày 27 tháng 6 năm 2014)

Vì ai đó nghĩ rằng tôi không biết tôi đang làm gì hoặc nói về điều gì, hãy để tôi làm rõ;

UID người dùng trên Android được bù với 100000 và UID ứng dụng được bù với 10000 khi được ánh xạ tới số người dùng _ số ứng dụng, do đó, khi ps hiển thị một cái gì đó như u0_a10, có nghĩa là Người dùng có UID 100000 đang chạy ứng dụng với UID 10010,

Tôi đã lấy tên UID và tên người dùng / daemon từ system / core / include / private / android_filesystem_config.h và sử dụng chúng để cập nhật các tập tin / etc / passwd và / etc / group (Trên hộp Android của tôi), ví dụ như / etc / tệp passwd (trên hộp Android của tôi) trông như thế này:

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

Tôi đã thiết lập cấu hình trong /etc/adduser.conf để tạo người dùng mới như vậy (Trên hộp Android của tôi):

# 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

Điều này phù hợp với chính sách của Android, tôi cho phép người dùng hệ thống "dựa trên glibc" vẫn được tạo từ phạm vi 100-999 Tôi tin và tôi đã sửa đổi người dùng âm thanh trên các tệp / etc / passwd và / etc / group của mình thành 1005, như đó là trên Android.

Tôi cần cập nhật Android và đồng bộ hóa nó với thông tin liên quan đến UID người dùng cũng như với các UID Daemon hoặc người dùng hệ thống của tôi từ ngăn xếp glibc.

Bạn có thể đọc thêm về điều này trong cuốn sách "Android nhúng" của Karim Yaghmour Bán tại đây

Mục tiêu của tôi là làm cho các chương trình như nvlc hoạt động nhưng tôi cần phải đồng bộ hóa UID và GID để Android biết về người dùng của tôi và các nhóm mà họ thuộc về để người dùng trí tuệ của tôi có quyền truy cập vào các thiết bị âm thanh.

Ngoài ra, tôi cần thông báo cho Android về Postres và đó là thành viên trong nhóm mạng để nó có thể mở ổ cắm và cho phép truy cập vào cơ sở dữ liệu. Hiện tại tôi đã vô hiệu hóa PARANOID_NETWORKING trong kernel, nhưng bản hack này chỉ phục vụ để làm cho Android trở nên an toàn như vanilla Linux, không hơn không kém. Sẽ tốt hơn nếu giữ cài đặt hoang tưởng và áp dụng các quyền của nhóm cho những trình tiện ích / người dùng nào tôi thấy phù hợp.

Điều này sẽ làm cho Android trở thành một hệ điều hành tuyệt vời cho các máy chủ đối mặt công khai với các điều khiển hoang tưởng và tinh chỉnh như vậy. Hãy tưởng tượng bạn có quyền truy cập vào Kerberos, LDAP, PAM hoặc Khi sử dụng điện thoại của bạn dưới dạng Wap có cấu hình Radius, tất cả đều có sẵn từ Debian và các bản phân phối khác miễn phí.

Tôi đã hiểu tất cả những điều này, tôi chỉ cần biết cách cập nhật cơ sở dữ liệu UID / GID của Android, được cập nhật mỗi khi bạn cài đặt một ứng dụng, vì vậy tôi biết điều đó là có thể.

Cập nhật: (7:08 tối ngày 30 tháng 6 năm 2014)

Sau khi xem qua dữ liệu trong các tệp sau ...

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

... Tôi đã cập nhật câu hỏi của mình để bao gồm "làm thế nào để tôi giải thích nó?"

  • Tôi nghĩ rằng tôi sẽ cần phải tạo một mô-đun PAM tùy chỉnh và trộn Bionic và Glibc vào một thư viện C duy nhất, chúng cần tương thích với các ứng dụng ở cả hai bên, không có ngoại lệ, mong đợi các ngoại lệ C ++ đó là; p --- Tôi đã viết một vài quy tắc của ngón tay cái-2 :) để tôi tuân theo. Tôi cũng có thể cần phải viết một trình bao bọc cho các hệ thống quản lý gói phổ biến như vòng / phút và apt thực hiện cài đặt apk và cung cấp cho mỗi gói gỡ lỗi mới một UID và có thể chỉ cần liên kết sym mọi thứ vào FHS. Đó có thể là giải pháp lý tưởng nhất mà tôi có thể thực hiện, mặc dù công việc nhiều nhất, vì mỗi công việc sẽ cần một bộ quyền trong "bảng kê khai" của chúng, có thể là một menu trong khi cài đặt mà người dùng có thể cung cấp và thực hiện theo nhu cầu.
  • Có ai có một tài liệu tham khảo tốt giải thích cú pháp của các tập tin này? Tôi không rành về XML lắm, chưa kể nó sử dụng thường phụ thuộc vào ứng dụng diễn giải nó.
  • Tôi không hiểu các packages.listtập tin ngoại trừ nullmục nhập trong cột cuối cùng, bất cứ ai có thể giải thích điều đó?

Bản sao có thể có của UID
xavier_fakerat

Câu trả lời:


1

Nhìn thấy sự GET_ACCOUNTScho phép? ( Ed. Lưu ý: Tính năng cụ thể đó có thể không hữu ích cho câu hỏi này, vì rõ ràng đây là một tính năng được phát triển để xác thực web.)

Cá nhân, tôi đang đọc về chủ đề liên quan đến các giá trị UID / GID được tính toán tại thời điểm cài đặt APK - hiện tại, là nghiên cứu cho một bài viết blog đơn giản - nhưng tôi cũng muốn nghiên cứu thêm về chủ đề này. Nhắc đến tài liệu tham khảo về các tính năng HĐH được liên kết nhiều lần này, trong Android, có vẻ như có Dịch vụ tài khoản trong HĐH Android. ( Ed. Lưu ý Có vẻ như, hơn nữa, Dịch vụ Tài khoản trong Android có thể là một dịch vụ được phát triển cho ứng dụng về tài khoản web của người dùng Android)

Mặc dù cá nhân tôi đang bận tâm về việc viết một bài viết khác, ngay lập tức, nhưng chắc chắn Dịch vụ Tài khoản có thể chịu một số nghiên cứu thêm. Có lẽ nó có liên quan, trực giao, liên quan đến việc áp dụng Kerberos trên các thiết bị Android. Có một số công việc hiện có, liên quan đến việc triển khai các dịch vụ Kerberos trên nền tảng Android. Đối với các ứng dụng web, tất nhiên có OAuth / OAuth2.

Rõ ràng, Android không sử dụng các tệp passwd / bóng thông thường của UNIX ( Anderson2013 ). Ước tính tốt nhất của tôi, hiện tại, là Dịch vụ tài khoản hệ điều hành Android có thể là một chủ đề cho một nghiên cứu tiếp theo ... ít nhất, cho đến khi phát hiện ra rằng Dịch vụ tài khoản Android có thể là một tiện ích xác thực web ( API: Quản lý tài khoản ).

Tôi chắc chắn có một cái gì đó nhiều hơn về sự thay thế của Android /etc/passwd, ở đâu đó trong mã nguồn Android. Hy vọng rằng, nó gần với tuy nhiên điều tương tự có thể được tiếp cận trong CyanogenMod.


1

Dưới đây là suy nghĩ của tôi về cách Android triển khai tra cứu UID / GID. Tôi hy vọng nó sẽ hữu ích cho bất cứ ai đang có câu hỏi.

grp_pwd.cpp mô tả cách Android dịch UID / tên người dùng sang passwdcấu trúc. Từ getpwuidchức năng chúng ta có thể thấy rằng

  1. UID trước tiên được so sánh với các AID được xác định trước từ generated_android_ids.hbên dưới $(AOSP_ROOT)/out/soong/.intermediates/bionic/libc/generated_android_ids/genđược tạo từ android_filesystem_config.h theo bionic / libc / Android.bpbionic / Android.bp . Các AID được lưu trữ trong tên người dùng thành bản đồ UID struct android_id_info android_ids[]và khi được tra cứu, chúng được chuyển đổi sang passwdcấu trúc uidgidđược đặt thành AID, thư mục chính được đặt thành /và shell được đặt thành /system/bin/sh( ).

  2. Nếu không tìm thấy người dùng trong bước trước, chức năng sẽ tìm kiếm người dùng được xác định OEM. UID của những người dùng này bao gồm từAID_OEM_RESERVED_START để AID_OEM_RESERVED_ENDAID_OEM_RESERVED_2_STARTđể AID_OEM_RESERVED_2_END. Người dùng do nhà cung cấp xác định được lưu trữ trong /vendor/etc/passwd. Tên người dùng được đặt thành oem_${uid}và các thuộc tính khác được đặt theo cùng kiểu với người dùng AID.

  3. Cuối cùng, nó sẽ kiểm tra tất cả người dùng ứng dụng app_id_to_passwd()và quá trình này rất giống nhau.

Nếu bạn muốn có được tất cả passwdcác mục, xin vui lòng xemgetpwent() trong cùng một tệp và trang chủ của getpwent (3)


0

Trước hết, như bạn biết rằng mỗi Ứng dụng đều có bộ mã riêng (ID quy trình) riêng, bộ PID này được gán cho ứng dụng bởi hạt nhân của Hệ điều hành.

  1. Trong Android ADT, bạn có thể tắt khóa học xem PID trong logcat.
  2. Nếu bạn muốn xem PID trong thiết bị của mình thì bạn cần cài đặt Ứng dụng từ cửa hàng play (không thể đảm bảo rằng liệu PID được hiển thị bởi ứng dụng có phải là chính hãng hay không)
  3. Đến với phần sửa đổi là một số lớn
  4. Không, bạn không thể sửa đổi PID theo mong muốn của mình vì nó sẽ dẫn đến các mối lo ngại về bảo mật cũng như sự mơ hồ giữa các ứng dụng cho một ứng dụng khác có thể có cùng một PID do đó dẫn đến Xung đột.

6
Điều này không liên quan gì đến PID, biến này ngoại trừ init luôn là PID 1 vì đây là quá trình đầu tiên được tạo ra, điều này có liên quan nhiều hơn đến việc Android nhận ra UID từ ngăn xếp glibc của tôi (và ngược lại ), chẳng hạn như daemon Postgres, và không, nó không phải là vấn đề bảo mật, làm cho ngăn xếp Bionic nhận thức được các UID và GID bổ sung mà tôi có trên hệ thống của mình sẽ tăng cường bảo mật. Làm thế nào có thể làm cho Android Kerberos, LDAP và PAM trở thành một lỗ hổng bảo mật?! Nó sẽ là tuyệt vời!
Quá
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.