【翻譯】Android安全之Linux內核篇


原文出處:http://bbs.pediy.com/showthread.php?p=1335415#post1335415php


做爲最廣爲人知的開源項目之一,Linux已經被全世界的成千上萬的研究人員進行研究、***、以及打補丁等,並被證實確實是一款安全的、可靠性高的、可信的、穩定的操做系統。所以,Android的操做系統基於Linux內核也就一點也不奇怪了。Android不只在進程、內存、以及文件系統管理上依賴於Linux,也是Android安全架構的核心組件。在Android操做系統中Linux內核負責應用軟件運行時的沙盒環境以及一些權限的管理。

Android沙盒
     讓咱們仔細的考慮下Android應用程序安裝過程時的具體細節吧。話說安卓應用程序呀,老是以安卓包(.apk爲後綴名)的形式進行發佈的。
而這個包呢,由Dalvik可執行文件、資源、本地庫文件、以及一個配置文件構成滴,而且呢,會附帶有開發者的簽名。在Android設備上能夠經過三種方法來安裝一個應用程序:
    1. Google play
    2.打包安裝程序Packege  Installer
    3.adb  install 
Google Play是一個比較特別的應用程序,第三方的開發者們上傳到市場中,用戶能夠經過這個Google Play找到並進行安裝。儘管呢,儘管Google Play也是個第三方的應用程序,可是其具備訪問Android受保護的組件(由於與Android操做系統具備相同的簽名),這是其餘三方程序不具有的。若是用戶安裝的程序是其餘的來源呢,就會顯示的使用打包安裝程序(Packege Installer)了。這個系統程序會爲開始安卓包的安裝過程提供一個界面。而由安卓提供的adb install,主要是給第三方的開發者使用的。前面的兩種方式在安裝過程當中,須要用戶贊成一個權限列表,最後的那個方法就是比較低調的進行安裝咯,這就是爲何其主要做爲開發者的工具了,其目的就是爲了在設備上作安裝測試滴。安裝的過程如圖1所示:
linux

點擊圖片以查看大圖  圖片名稱: @O04)C0JJEAIE`M2C[B58HO.png 查看次數: 1 文件大小: 128.4 KB 文件 ID : 94116

  

圖 1 安卓安全架構android


                                                    圖 1 安卓安全架構
這幅圖展現了安卓安全架構的更爲細節的概況,待會咱們解釋安卓操做系統特性時還會參閱這張圖表。
應用層沙盒在Linux內核中的配置過程是以下的步驟:在應用程序安裝時,每個包都會分配一個惟一的用戶ID(UIDS)和一個組ID(GID),而且在設備上永遠不會被改變。所以,Android上的每個應用都有一個對應的Linux 用戶(user)。用戶名的格式是app_x,而且用戶的UID等於Process.FIRST_APPLICATION_UID+x,而Process.FIRST_APPLICATION_UID是一個等於1000的常量。圖1中exi.apk包在安裝時就分配到了app_1的用戶名,其UID就等於1001.
在Linux中,全部的文件都是自主訪問策略(DAC)的客體,其對三類用戶(文件的擁有者、文件擁有者所在組的用戶,以及其餘用戶)訪問權限的控制由文件的建立者或是文件擁有者設定。對於每一類型的用戶,都有讀、寫、可執行(r-w-x)三元組的權限被賦值。如圖2所示:
點擊圖片以查看大圖  圖片名稱: %S0FYZ8H1})D)(R%MX1]]88.jpg 查看次數: 2 文件大小: 107.5 KB 文件 ID : 94117
 安全

圖2  Android的文件訪問控制網絡

  看第一行最左邊的,d表示當前是文件是一個目錄,即acct是目錄,該文件的擁有者具備讀、寫、可執行的權限,該文件所在的用戶組具備執行的權限,而其餘用戶具備讀、可執行的權限。
所以,只要每個應用擁有本身的UID和GID,Linux內核就能讓其在獨立的地址空間內執行。另外,內核使用UID和GID實現各種應用程序所用設備資源的隔離(內存、CPU等)。每個應用程序在安裝時都會有一個home目錄,舉例來講:/data/data/package_name,其中的package_name就是Android安裝包的名字,好比圖1中的的com.ex.ex3.就Android而言,這個文件夾被稱爲內部存儲(Internal Storage),被用來存放應用程序的私有數據。Linux僅僅給這個應用程序的擁有者賦予對該目錄的讀和寫的權限。也有些例外須要說明,可能存在擁有一樣的認證簽名的應用程序可以彼此共享數據,這類程序可能含有相同的UID,或是在同一個進程內運行。圖3所示中的是使用ps命令列舉的一些進程片斷。
點擊圖片以查看大圖  圖片名稱: N{1358I]C(Z46)$GDOZZ[PX.png 查看次數: 1 文件大小: 28.3 KB 文件 ID : 94118
架構

  圖3   ps列舉進程片斷app

   最左邊的就是應用程序的UID,最右邊的是程序的安裝包名。
   以上的架構在Liinux內核層上創建了一個有用而且高效的應用層沙盒。這種類型的沙盒比較簡單,基於Linux的自主訪問控制模型。幸運的是,因爲Linux內核對沙盒的支撐,本地代碼以及操做系統應用程序都受本節所述的約束。

Linux內核層的權限管理
  在Linux內核層實現權限控制可以限制Linux用戶和組對Android系統資源的訪問能力,這種限制可運用於如文件、驅動、套接字類的資源。Android使用文件系統權限(FileSystem Permissions)和Android特有的內核補丁(Paranoid Networking)限制諸如對網絡套接字、照相機設備、外部存儲器這種底層系統的訪問,如讀取系統日誌啥的。
  對文件以及設備驅動使用文件系統權限管理,就可以限制進程對設備的功能的訪問。例如,系統中會使用某些機制用來限制程序對照相機設備的訪問,/dev/cam設備驅動的擁有者是root,分組爲camera,其權限設置的值是0660,這就意味着只有root和camera組的進程對該設備驅動可以具備讀和寫的權限。權限與組的映射關係定義在/etc/permissions/platform.xml文件中。摘錄的部分以下圖所示:
點擊圖片以查看大圖  圖片名稱: Q7HJ`TI}UYHDX3DH{ZEWD30.png 查看次數: 2 文件大小: 27.8 KB 文件 ID : 94119
ide

  圖4  權限與組的映射關係函數

好比說對於READ_LOGS的權限,只有在組「log」中的用戶才能訪問。在程序安裝時,若是該程序申請對日誌的權限訪問,而用戶贊成的話,該程序就會賦予給「log」組,即分配該程序「log」的GID。這樣,程序就可以讀取日誌的權限了。在Android中還有設置了文件系統權限管理的還有幾處:init程序、init.rc配置文件、ueventd.rc配置文件和系統的ROM配置文件。
在傳統的Linux發佈版中,全部的進程都可以被容許發起網絡鏈接。而在手機操做系統內對網絡的訪問能力必須受到限制。爲了在Android中實現這樣的機制,一類內核補丁被加入到內核中,只容許特定的組有訪問網絡的權限,這樣就對程序網絡訪問進行了控制。Android系統中這樣的補丁被稱爲Paranoid networking。好比,負責網絡鏈接的套接字AF_INET地址家族,內核就會進行檢查,代碼是在/kernel/net/ipv4/af_inet.c內,圖5給出了代碼片斷:
點擊圖片以查看大圖  圖片名稱: )JR~VPE9~~F{{H]F$VHT1CT.png 查看次數: 1 文件大小: 101.6 KB 文件 ID : 94120
 工具

 圖5  建立套接字的代碼片斷

從代碼中能夠看出,在建立套接字時,會調用current_has_network函數檢查該用戶否具備訪問網絡的權限。Linux對網絡訪問權限標籤以及用戶組的映射也是在platform.xml,代碼爲: <permission name="android.permission.NET_ADMIN" >        <group gid="net_admin" /> </permission>另外,Paranoid networking補丁也實現對IPv6和藍牙的訪問控制。而檢查使用的常數,在Linux內核中以硬編碼的形式存在,位於 kernel/include/linux/android_aid.h文件中:#ifndef _LINUX_ANDROID_AID_H#define _LINUX_ANDROID_AID_H/* AIDs that the kernel treats differently */#define AID_NET_BT_ADMIN 3001#define AID_NET_BT       3002#define AID_INET         3003#define AID_NET_RAW      3004#endif這個常數實際上是AID—Android ID,Android實現的一個補充組,與應用層的用戶組存在相應的映射。好比AID_INET與用戶組inet映射,AID_SDCARD_RW與用戶組SDCARD_RW映射。經過補充組AID,可以授予訪問權限。如AID_INET就能打開建立套接字.在Linux內核層次上權限的檢查時判斷當前用戶是否是在特定的組內,只有在組內的成員纔有能力去訪問被保護的功能與資源。在程序安裝時,若是用戶贊成程序所須要的權限,應用程序就會被加入到相應的Linux組內,於是,得到改組擁有的訪問權限 

相關文章
相關標籤/搜索