Android應用程式獲得root許可權

來源:互聯網
上載者:User

我在博文《Android程式的安全系統》中提到兩種讓root許可權的辦法。最近在網上發現很多朋友轉載那篇文章,但是對那篇文章中提到的第一種方法怎樣實現,不是很明白。本文將會以一個例子實現來示範怎樣讓一個Android應用程式獲得root許可權。

問題

    我遇到的問題是我想在Java應用程式中動態mount一個NFS的系統,但是執行mount命令必須要要root許可權才可以。一般情況下,在Android的Java層是不能獲得root許可權的。

思路

   我在博文《Android程式的安全系統》中提到兩種思路:

1、實現一個init實現一個Service,來協助Android應用程式執行root許可權的命令。
2、實現一個虛擬設備,這個裝置協助Android應用程式執行root許可權的命令。

   本文將會選擇第一種來解決Android應用程式mount NFS檔案系統的問題。

Init.rc Service

   在Android系統init.rc中定義很多Service,具體定義格式可以參考《Android Platform Developer’s Guide》中的“Android Init Language”。Init.rc中定義的Service將會被Init進程建立,這樣將可以獲得root許可權。

  
現在問題是Android應用程式怎樣啟動讓init進程知道我們想運行那個進程呢?答案是設定系統屬性“ctl.start”,把
“ctl.start”設定為你要啟動並執行Service,假設為“xxx”,Android系統將會幫你運行“ctl.start”系統屬性中指定的
Service。那麼運行結果init進程將會將會寫入命名為“init.svc.+Service名稱”的屬性中,也就是“init.svc.xxx”
屬性,應用程式可以參考查閱這個值來確定Service執行的情況。想更深入瞭解Android property系統可以參考博文《(翻譯)Android屬性系統》。

Android property許可權

   
難道Android屬性“ctl.start”是所有進程都可以設定的嗎?那世界不就亂套了,誰都可以可以執行init.rc中Service了,查看
property_service.c中的源碼,設定Android系統屬性的函數為handle_property_set_fd:

   1: void handle_property_set_fd(int fd)
   2: {
   3:     ......
   4:     switch(msg.cmd) {
   5:     case PROP_MSG_SETPROP:
   6:         msg.name[PROP_NAME_MAX-1] = 0;
   7:         msg.value[PROP_VALUE_MAX-1] = 0;
   8:  
   9:         if(memcmp(msg.name,"ctl.",4) == 0) {
  10:             if (check_control_perms(msg.value, cr.uid, cr.gid)) {
  11:                 handle_control_message((char*) msg.name + 4, (char*) msg.value);
  12:             } else {
  13:                 ERROR("sys_prop: Unable to %s service ctl [%s] uid: %d pid:%d\n",
  14:                         msg.name + 4, msg.value, cr.uid, cr.pid);
  15:             }
  16:         }
  17:         ......
  18:     }
  19: }

    從源碼中我們發現如果設定“ctl.”開頭的Android系統property,將會調用check_control_perms函數來檢查調用者的許可權,其定義如下:

   1: static int check_control_perms(const char *name, int uid, int gid) {
   2:     int i;
   3:     if (uid == AID_SYSTEM || uid == AID_ROOT)
   4:         return 1;
   5:  
   6:     /* Search the ACL */
   7:     for (i = 0; control_perms[i].service; i++) {
   8:         if (strcmp(control_perms[i].service, name) == 0) {
   9:             if ((uid && control_perms[i].uid == uid) ||
  10:                 (gid && control_perms[i].gid == gid)) {
  11:                 return 1;
  12:             }
  13:         }
  14:     }
  15:     return 0;
  16: }

    我們發現root許可權和system許可權的應用程式將會授權修改“ctl.”開頭的Android系統屬性。否則將會檢查control_perms全域變數中的定義許可權和Service。

    如果想更深入的瞭解Android Init進程和Android Property的許可權控制,請參考《Android Permission》。

執行個體

    通過上面的介紹我們基本已經有思路了,下面以上面提出的mount nfs檔案系統為例說明:

1、首先定義一個執行mount的指令碼,我把它位於/system/etc/mount_nfs.sh,定義如下:

   1: #!/system/bin/sh
   2:  
   3: /system/bin/busybox mount -o rw,nolock -t nfs 192.168.1.6:/nfs_srv /data/mnt

不要忘了把它加上可執行許可權。

2、在init.rc中加入一個Service定義,定義如下:

   1: service mount_nfs /system/etc/mount_nfs.sh
   2:     oneshot
   3:     disabled

3、讓自己的應用程式獲得system許可權,博文《Android程式的安全系統》中提到了怎樣獲得system許可權,請參考,這裡就不贅述了。

4、在自己應用程式中設定System系統屬性“ctl.start”為“mount_nfs”,這樣Android系統將會幫我們運行mount_nfs系統屬性了。這裡需要強調的是不能夠調用System.getProperty,
這個函數只是修改JVM中的系統屬性。而不能修改Android的系統屬性。可以調用
android.os.SystemProperties(Android 2.1
Eclair系統可以調用這個API),如果你的Android版本不能調用這個類,只能通過JNI,調用C/C++層的API
property_get和property_set函數了。如果想詳細瞭解請參考《(翻譯)Android屬性系統》。代碼如下:

   1: SystemProperties.set("ctl.start", "mount_nfs");

5、最後在自己應用程式中,讀取“init.svc.mount_nfs”Android系統Property,檢查執行結果。代碼如下:

   1: while(true)
   2: {
   3:     mount_rt = SystemProperties.get("init.svc.mount_nfs", "");
   4:     if(mount_rt != null && mount_rt.equals("stopped"))
   5:     {
   6:         return true;
   7:     }
   8:     
   9:     try
  10:     {
  11:         Thread.sleep(1000);
  12:     }catch(Exception ex){
  13:         Log.e(TAG, "Exception: " + ex.getMessage());
  14:     }
  15: }

    init進程維護一個service的隊列,所以我們需要輪訓來查詢service的執行結果。

    通過上面的這些步驟,Android應用程式就能夠調用init.rc中定義的Service了。這樣你的Android應用程式也就獲得了root許可權。

總結

   通過上文可以看出,在Android獲得root許可權還是需要一些前提的,比如:

1、必須是Android系統開發人員,否則你無法修改init.rc等檔案。 2、你的應用程式必須要獲得system許可權。

    這樣可以防止root許可權被應用程式無限制的使用,最終危及Android系統安全。

    希望本文對你能有所協助,如果有錯誤之處敬請指正。

原文

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.