Android安全—權限模型

從架構開始

對于Android架構的一般理解會是铅搓,”在Linux上的Java“瑟押。然而,不準確星掰,這樣的描述直接忽略掉整個平臺的復雜架構多望。

縱觀全局,架構由五部分組成氢烘,包括Android應用層怀偷,Android Framework,Dalvik虛擬機播玖,native code和Linux kernel椎工。如圖

FFDE345A-04FA-4D21-8577-72C41AA35434.png

職能簡介

  • 應用層:允許開發(fā)者擴展與提升設備功能,無需關注底層實現細節(jié)蜀踏。
  • Framework:提供豐富的API調用Android設備上的功能维蒙,包括管理UI元素,數據存儲與應用間傳遞數據果覆。是應用層與Dalvik虛擬機之間的粘合劑颅痊,

上述兩層都是使用Java開發(fā)并在Dalvik虛擬機上運行的。

  • Dalvik:為操作系統特別設計的高性能抽象層局待,執(zhí)行Dalvik Executable(DEX)文件斑响,依賴于native層的libraries。
  • Native:包括系統服務如vold钳榨,Dbus舰罚;網絡服務如dhcpd;其他庫如WebKit薛耻,OpenSSL营罢。其中的一些服務會與內核級服務,驅動程序通信饼齿,另一些則簡化了調用底層代碼饲漾。

Android基于Linux內核做出很多額外的改動瘟滨,例如獲取相機,WIFI能颁,網絡杂瘸,Binder和安全等。

安全模型

Android使用兩套分離伙菊,卻又互相配合的權限模型:沙箱和運行時權限败玉。

在低層級,Linux內核強制使用用戶和用戶組權限镜硕,限制獲取文件系統和Android特定資源的權限运翼。一般被稱為Android's sandBox(沙箱)。

在Android運行時兴枯,通過Dalvik虛擬機和Android Framework實現第二套模型血淌,在用戶安裝應用時啟用,限制了應用能獲取資源的權限财剖。一部分權限直接對應底層操作系統特定用戶和用戶組的權限悠夯。

Android‘s SandBox

Android基于Linux,而Linux繼承了Unix著名的進程獨立和最小特權法則躺坟。需要注意的是沦补,進程作為獨立的用戶運行時,既不能與其他用戶通信咪橙,又無法訪問其他用戶的內存區(qū)域夕膀。

所以沙箱可以理解為幾個概念:標準的Linux進程隔離,大多數應用都有單獨的用戶ID(UID)美侦,嚴格的文件系統權限产舞。

Andoird定義了一系列的AndroidIDs(AIDs)來代替?zhèn)鹘y的用戶和用戶組的密碼驗證,AIDs通過補充組獲取權限或共享資源菠剩,例如在sdcard_rw組的成員擁有讀寫/sdcard文件的權限易猫。

除了文件系統的權限,補充組也用于獲取其他權限赠叼。例如AID_INET組擦囊,允許用戶打開AF_INET和AF_INET6套接字违霞。

當應用運行時嘴办,UID,GID和補充組分配給一個新進程,操作系統不僅會在內核層級強制使用權限限制买鸽,還會在應用運行時進行控制涧郊,這就是Android沙箱。

在Android模擬器中眼五,通過ps命令可以查看進程的PID妆艘。

ps.png

通過cd /proc/1進入PID為1的進程內彤灶,cat status查看UID和GID。

uid.png

Android權限

Android權限模型是多方面的批旺,有API權限幌陕,文件系統權限和IPC權限。正如前面所說汽煮,高層級的權限會對應底層OS的功能搏熄,包括打開套接字,藍牙設備暇赤,和特定的文件路徑心例。

Android高層級權限聲明在AndroidManifest內。應用安裝時鞋囊,PackageManager會將應用權限從Manifest中讀取出來止后,存儲在/data/system/packages.xml中。

通過cat /data/system/packages.xml可以找到系統Phone的UID及權限溜腐。

  <shared-user name="android.uid.phone" userId="1001">
        <sigs count="1">
            <cert index="1" />
        </sigs>
        <perms>
            <item name="android.permission.WRITE_SETTINGS" />
            <item name="android.permission.READ_SMS" />
            <item name="android.permission.READ_CALL_LOG" />
            <item name="android.permission.MODIFY_AUDIO_SETTINGS" />
            <item name="android.permission.SYSTEM_ALERT_WINDOW" />
            <item name="android.permission.SEND_RESPOND_VIA_MESSAGE" />
            <item name="android.permission.SHUTDOWN" />
            <item name="android.permission.INTERNAL_SYSTEM_WINDOW" />
            <item name="android.permission.BROADCAST_SMS" />
            <item name="android.permission.CALL_PRIVILEGED" />
            <item name="android.permission.CHANGE_NETWORK_STATE" />
            <item name="android.permission.RECEIVE_BOOT_COMPLETED" />
            <item name="android.permission.DEVICE_POWER" />
            <item name="android.permission.RECEIVE_SMS" />
            <item name="android.permission.SET_TIME_ZONE" />
            <item name="android.permission.BLUETOOTH" />
...
         </perms>
    </shared-user>

這些權限會在應用進程實例化時(例如設置補充GIDs時)授予译株。

用戶組的權限存儲在/etc/permissions/platform.xml中,用于確定應用的補充組GIDs挺益。

通過cat /etc/permission/platform.xml查看古戴。下面列舉存儲權限。

    <permission name="android.permission.READ_EXTERNAL_STORAGE" >
        <group gid="sdcard_r" />
    </permission>

    <permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
        <group gid="sdcard_r" />
        <group gid="sdcard_rw" />
    </permission>

    <permission name="android.permission.ACCESS_ALL_EXTERNAL_STORAGE" >
        <group gid="sdcard_r" />
        <group gid="sdcard_rw" />
        <group gid="sdcard_all" />
    </permission>

這些權限會以下列兩種方式之一強制執(zhí)行:運行時調用方法時進行判斷矩肩,底層操作系統或內核檢查现恼。

API權限

API權限包括用于控制在API/frameword中高層級的功能和第三方框架。例如公用API權限READ_PHONE_STATE黍檩,在文檔中定義為“僅允許讀取電話狀態(tài)”叉袍。需要該權限的應用要在調用任何與電話狀態(tài)相關的API之前獲取授權。相關方法在TelephoneManager中getDeviceSoftwareVersion, getDeviceId等刽酱。

文件系統權限

Android應用沙箱由Unix嚴格的文件系統權限控制喳逛。UIDs和GIDs授予了訪問各自文件系統內的存儲空間。

通過ls -l /data/data查看棵里,UIDs和GIDs(第二润文,第三列)在列表中是獨一無二的,而且再看權限只有特定UIDs和GIDs才能訪問其中內容殿怜。

ls-l.png

正如前面提到的典蝌,補充組GIDs用于獲取共享資源,例如SD卡或外置存儲头谜。

通過ls -l /mnt/查看sdcard讀寫權限骏掀。

sdcard.png

總結

本文對Android權限在低層級和高層級的應用做了大致的介紹,通過兩個互相配合的安全模型,強制限制了應用最小需用權限截驮,獲取共享資源和應用間通信笑陈。

下一篇Android安全—深入理解各層級介紹Android架構里每個模塊為實現安全各自所做的努力。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末葵袭,一起剝皮案震驚了整個濱河市涵妥,隨后出現的幾起案子,更是在濱河造成了極大的恐慌坡锡,老刑警劉巖妹笆,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異娜氏,居然都是意外死亡拳缠,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門贸弥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窟坐,“玉大人,你說我怎么就攤上這事绵疲≌茉В” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵盔憨,是天一觀的道長徙菠。 經常有香客問我,道長郁岩,這世上最難降的妖魔是什么婿奔? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮问慎,結果婚禮上萍摊,老公的妹妹穿的比我還像新娘。我一直安慰自己如叼,他們只是感情好冰木,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著笼恰,像睡著了一般踊沸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上社证,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天逼龟,我揣著相機與錄音,去河邊找鬼猴仑。 笑死审轮,一個胖子當著我的面吹牛,可吹牛的內容都是我干的辽俗。 我是一名探鬼主播疾渣,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼崖飘!你這毒婦竟也來了榴捡?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤朱浴,失蹤者是張志新(化名)和其女友劉穎吊圾,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體翰蠢,經...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡项乒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了梁沧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片檀何。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖廷支,靈堂內的尸體忽然破棺而出频鉴,到底是詐尸還是另有隱情,我是刑警寧澤恋拍,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布垛孔,位于F島的核電站,受9級特大地震影響施敢,放射性物質發(fā)生泄漏周荐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一僵娃、第九天 我趴在偏房一處隱蔽的房頂上張望羡藐。 院中可真熱鬧,春花似錦悯许、人聲如沸仆嗦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘩扼。三九已至,卻和暖如春垃僚,著一層夾襖步出監(jiān)牢的瞬間集绰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工谆棺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留栽燕,地道東北人罕袋。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像碍岔,于是被迫代替她去往敵國和親浴讯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容