Android應用層對裝置的訪問許可權的實現

2021-06-18 17:55:53 字數 3285 閱讀 6339

android應用層對裝置的訪問許可權的實現

如果應用程式出現開啟裝置許可權不夠的錯誤,可能是建立裝置節點時賦予的許可權不夠。

問題:攝像頭總是許可權不夠,只能在shell下重新設定可用。

分析:android對裝置節點的管理不是使用udev,在init裡面,system/core/init/下的init.c和devices.c裡對裝置節點的建立設定了許可權。

andoid安全機制包括兩個層次:系統層和應用層。應用層的安全機制建立在授權與申請基礎上,本文不講。系統層的安全機制包括給 每個使用者程序分配單獨的uid和gid,使用程序本身可以防止位址空間的共享,從而避免使用執行緒方式對資料的全域性可見性。使用了uid則對於外存也加了封 鎖,當然這得感謝unix的使用者空間機制。系統層安全機制還包括對裝置訪問的控制,在這個方面,android的做法與傳統有所不同。

android除了給予使用者程序以單獨的uid外,給系統服務也分配了固定的uid,諸如system/core/include/private/android_filesystem_config.h檔案中定義了這些固定的uid:

define aid_system 1000 

#define aid_radio 1001 

#define aid_bluetooth 1002 

#define aid_graphics 1003 

#define aid_input 1004 

#define aid_audio 1005 

#define aid_camera 1006 

#define aid_log 1007 

......................................

傳統的做法是,除了root,其它全是普通使用者,兩類使用者的許可權在核心裡是規定死的,這也保證了unix核心的安全性。比如dev目錄下的裝置文 件,一般使用者主是root,而且對其他使用者不開放讀寫能力。使用者使用裝置一般通過系統呼叫如ioctl,而系統呼叫屬於受信**。

android的問題是,引入的這些系統使用者,實際上在許可權方面是無法與普通uid區分的,如果系統使用者能訪問乙個裝置,那麼一般使用者也 能。所以,andoid沒有別的選擇,只能預設開啟裝置檔案的全域性讀寫。這在systemcore/init/device.c做了定義: ,

,,.....................................

裝置檔案當然還是存放於/dev目錄下,但dev目錄的填充不是由udev做的,而是由android的init程序做的。這個步驟由make_device函式完成,各個裝置的許可權來自於上述device.c檔案的規定。

這種裝置許可權分配的潛在危險是,任何使用者程序都可以操作裝置,如果底層裝置驅動有漏洞,那麼整個系統的安全性就是存在風險的,而unix系統最大的安全隱患,正是來自於裝置驅動。

在android中,由於沒有mdev和udev,所以它沒有辦法動態的生成裝置節點,那麼它是如何做的呢?

我們可以在system/core/init/下的init.c和devices.c中找到答案:

init.c中的int main(int argc, char **argv) 

建立了一些基本的裝置節點。

int main(int argc, char **argv) 

return 0; }

我們再來看看handle_device_fd(),該函式定義在devices.c中

void handle_device_fd(int fd)  } 

而handle_device_event定義如下:

static void handle_device_event(struct uevent *uevent) 

... 

} make_device定義如下:

static void make_device(const char *path, int block, int major, int minor) 

其他動態裝置的節點建立,android也規定好了裝置節點的名字和許可權等。下面這個函式會返回你要建立的裝置節點的許可權,如果列表中沒 有,就會使用預設600,當然這樣的話,應用程式使用裝置就會出現問題,所以,你要把你的裝置加到列表 static struct perms_ devperms 中。

我們看看get_device_perm如下實現:

static mode_t get_device_perm(const char *path, unsigned *uid, unsigned *gid) 

else if (get_device_perm_inner(devperms, path, uid, gid, &perm) == 0) else else  

/* found perm in partner list. */ 

*uid = dp->uid; 

*gid = dp->gid; 

return dp->perm; 

} /* default if nothing found. */ 

*uid = 0; 

*gid = 0; 

return 0600; 

} } 

我們最後可以看到在devperms中定義了要生成的裝置節點:

static struct perms_ devperms = , 

, , 

, , 

, , 

, , 

/* logger should be world writable (for logging) but not readable */ 

, /* the msm hw3d client device node is world writable/readable. */ 

, /* gpu driver for adreno200 is globally accessible */ 

, /* these should not be world writable */ 

, , 

, , 

, , 

, , 

, , 

, , 

, , 

, , 

, , 

, , 

, , 

, , 

, , 

, , 

, , 

, , 

, , 

, , 

, , 

, , 

, , 

, , 

, , 

, , 

, , 

, /* cdma radio inte***ce mux */ 

, , 

, , 

};

Android網路優化 應用層策略

網路效能指標 1.建立連線的速度 2.傳輸速度 3.到達率 tcp ip底層已經有錯誤重傳機制,但是並不是專門為移動端設計的 4.長連線的存活率 優化切入口 1.dns優化 一般是優化的首選 使用httpdns替代localdns dns是指根據網域名稱查出ip位址,是http協議的前提,所以網路優...

應用層的例項

url檔案 存放物件的伺服器主機名 物件的路徑名 例 1 http請求報文 accept language fr方法字段 url欄位 http版本字段 2 http響應報文 data data data data data 狀態行 協議版本字段 狀態碼 相應狀態資訊 首部行實體體 3 web快取 d...

Android應用層CAN匯流排測試程式

1 can裝置說明 對於can裝置操作是按照網路socket程式設計方式來操作的,在linux命令列方式下,用以下命令來對其進行設定 ip link set can0 type can bitrate 125000 triple sampling on 表示對第一路can can0 裝置設定其波特率...