Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中的權限管理(基於uid gid gids setUid)

Android中的權限管理(基於uid gid gids setUid)

編輯:關於Android編程

我們首先來說一下傳統的Linux基於uid,gid的權限管理機制:

1、用戶的uid gid gids:

Ubuntu操作系統當前登陸的用戶是jltxgcy,那麼該用戶的uid為jltxgcy,gid也是jltxgcy,那麼gids怎麼查看呢?

答案是使用命令:cat /etc/group | grep jltxgcy。如下圖:

/

用戶的gids的名字為adm,dialout,cdrom,plugdev,lpadmin,admin,sambashare。此本分請參考linux用戶組、/etc/group文件及賬戶相關操作命令。

2、進程的uid gid gids:

shell進程uid,gid,gids都來源於用戶,也就是說,該用戶的進程的uid,gid,gids就是用戶的uid,gid,gids;

另外很重要的一點是進程中其實沒有uid,有的只有realUid和effectiveUid。

對於一般的進程來說realUid等於effectiveUid。在進程中真正有作用的effectiveUid。realUid象征著身份,effectiveUid象征著權力。

子進程realUid和effectiveUid都等於父進程的readUid。在shell中執行命令,其實就是fork出了shell進程的子進程。

文件操作時對進程是否有權限的識別的UID,即是指effectiveUid。ps命令輸出的UID是effectiveUid。

3、文件的uid gid:

 

對於/bin/cat來說文件uid為root,gid為root。說明只有effectiveUid為root的進程才可以對文件進行rwx,effectiveGid為root的進程可以對文件進行rx,effectiveUid為其他的進程只可以對文件x。

 

下面舉個例子把剛才講的內容串聯起來。

/

當前用戶為jltxgcy,所以當前進程(shell進程的子進程)的realUid等於effectiveUid都為jltxgcy。

然後執行命令cat test,如上面兩個圖,對於cat來說當前進程effectiveUid為jltxgcy對這個文件來說是可執行的,然後再看test,對於當前進程effectiveUid為jltxgcy來說是可讀的,所以我們能夠通過這個命令看到test裡面的內容,而不會出現Permission Deny。

 

我們接下來要分享的是setUid。首先我們把touch命令改成具有setUid權限的命令,如下圖:

/

然後使用touch命令來建立test1文件,我們看看有什麼不同,如下圖:

/

不同之處是,test的user是jltxgcy,而test1的user是root。

這是因為:當effectiveUid為jltxgcy的進程在執行touch時,由於touch命令的user有了setUid的權限,所以這個進程的effectiveUid被設置為了root,具有了“皇權”,但是realUid仍為jltxgcy。

由於子進程realUid和effectiveUid都等於父進程的readUid,所以它的子進程的realUid和effectiveUid都等於jltxgcy,未正身。

與之不同的su命令,su命令的user也具有setUid權限,su這個進程把自身的effectiveUid提升為root後,把realUid也提升為root。這樣它的子進程就是名正言順的root了,它的子進程的readUid和effectiveUid都為root了。

 

capability是比傳統的rwx權限管理更為細粒度的權限管理,比如當前進程在執行setUid提升自己的effectiveUid時,就會檢查effective capabilty sets是否允許setUid。

 

我們講了這麼多在Linux下的權限管理,那麼在Android下的權限管理是怎麼樣的呢?

用戶:在Android中用戶的概念已經被淡化,通常使用的是root用戶和shell用戶。

進程:shell用戶的進程effectiveUid為2000。為什麼?

/

使用busybox的命令whoami,當前用戶是的uid為2000,那麼2000對應哪個用戶呢?我們查看Android_filesystem_config.h的源碼:

 

#define AID_SHELL         2000  /* adb and debug shell user */
所以當前用戶是shell用戶,並且shell進程的uid為2000。

 

/
當前進程,由於是shell進程的子進程,它的uid為2000,我們cc文件只有sdcard_r這個組才可以讀,那麼為什麼我們的進程可以讀這個文件呢?只有一種可能,那就是當前進程它的gids裡面包含了sdcard_r。

在Android中,shell是進程,命令執行時是shell的子進程,應用程序是進程。

/

這是應用程序的私有文件,這樣的權限機制就阻止了其他進程訪問,有效保障了安全。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved