問題
kernel檢查
跟蹤到kernel中net/core/dev.c,在函式dev_ioctl中,會檢查cap_net_admin許可權:
if(!
capable
(cap_net_admin
))
return
-eperm
;
進入這個函式,發現檢查的是程序是否在group aid_net_admin中:
if(cap
==cap_net_admin
&&in_egroup_p
(aid_net_admin
))
return0;
這裡aid_net_admin跟android在init中的許可權定義有些類似。
android許可權定義
在system/core/include/private/android_filesystem_config.h中,android定義了一組uid和gid,如aid_root, aid_system, aid_net_admin。每乙個id對應有字串,如root, system, net_admin。當使用者程式需要訪問受限資源是,需要保證自己加入到對應的group中。
我在frameworks中搜尋net_admin,沒有找到任何檔案。搜尋藍芽許可權net_bt_admin時,找到了檔案/etc/permissions/platform.xml。這裡存放有androidmanifest.xml中許可權與底層許可權的對應關係:
name
="android.permission.bluetooth_admin"
>
gid="net_bt_admin"
/>
我想,當開發者在androidmanifest.xml中申請許可權時,framework會通過platform.xml將它對應到net_bt_admin,進而確定所屬組aid_***。這樣,每個apk就有不同的許可權。
另外,在android_filesystem_config.h,還可以看到為某些特定目錄和特定檔案靜態設定的group,如/system/bin/ping加入了aid_net_raw。嘗試
我在platform.xml的android.permission.internet許可權下加入了group net_admin,使它變成:
name
="android.permission.internet"
>
gid="inet"
/>
gid="net_admin"
/>
然後,在androidmanifest.xml中請求許可權android.permission.internet。重啟系統後執行apk,發現可以修改mac了!
apk檔案的group設定
packagemanagerservice建構函式會解析platform.xml,建立android許可權和gid的對應關係。然後,掃瞄apk時,會由請求的許可權找到對應的gid,並儲存在package類中。
packagemanagerservice
() readpermissions
();/* 解析/etc/permissions/platform.xml */
readpermissionsfromxml
() readpermission
()/* 建立permisstion名字與gid的關係,放在map msettings.mpermissions中*/
scandirli
() updatepermissionslp
() grantpermissionslp
()
grantpermissionslp
()
protectionlevel有4種:
normal - 安裝時即授予許可權,不需要確認
dangerous - 危險的許可權,需要使用者確認授予
signatureorsystem - 擁有相同的signature,或者放在system image中
i/activitymanager
(134
):start
proc com
.android
.settings
foractivity com
.android
.settings
/.settings
:pid
=792
uid=
1000
gids
=
後面的就是所在的組的id列表。
Android許可權管理
編譯配置 許可權判斷 feature許可權宣告及分配 frameworks base data etc platform.xml 特殊feature許可權開放 如在 system etc permissions目錄下增加android.hardware.usb.host.xml檔案 handheld...
Android 6 0許可權管理
android 6.0在我們原有的androidmanifest.xml宣告許可權的基礎上,又新增了執行時許可權動態檢測,以下許可權都需要在執行時判斷 身體感測器 日曆攝像頭 通訊錄地理位置 麥克風 簡訊儲存空間 if contextcompat.checkselfpermission this,m...
Android 6 0 許可權管理
android 6.0 之後許可權需要動態的獲取,否則是無法正常使用某些功能的。主布局檔案 主要是來模擬動態的獲取許可權,因此布局檔案中無其他多餘內容,其中textview也可以省略。使用3.1 在全域性中 宣告 private static final int request code camer...