android安全機制

Android是一個多進程系統,在這個系統中,應用程序(或者系統的部分)會在自己的進程中運行。系統和應用之間的安全性通過Linux的facilities(工具,功能)在進程級別來強制實現的,比如會給應用程序分配user ID和Group ID。更細化的安全特性是通過"Permission"機制對特定的進程的特定的操作進行限制,而"per-URI permissions"可以對獲取特定數據的access專門權限進行限制。 所以,應用程序之間的一般是不可以互相訪問的,但是anroid提供了一種permission機制,用於應用程序之間數據和功能的安全訪問。

  1.安全架構
  Android安全架構中一箇中心思想就是:應用程序在默認的情況下不可以執行任何對其他應用程序,系統或者用戶帶來負面影響的操作。這包括讀或寫用戶的私有數據(如聯繫人數據或email數據),讀或寫另一個應用程序的文件,網絡連接,保持設備處於非睡眠狀態。
  一個應用程序的進程就是一個安全的沙盒。它不能干擾其它應用程序,除非顯式地聲明瞭“permissions”,以便它能夠獲取基本沙盒所不具備的額外的能力。它請求的這些權限“permissions”可以被各種各樣的操作處理,如自動允許該權限或者通過用戶提示或者證書來禁止該權限。應用程序 需要的那些“permissions”是靜態的在程序中聲明,所以他們會在程序安裝時被知曉,並不會再改變。
  所有的Android應用程序(。apk文件)必須用證書進行簽名認證,而這個證書的私鑰是由開發者保有的。該證書可以用以識別應用程序的作者。該證書也不需要CA簽名認證(注:CA就是一個第三方的證書認證機構,如verisign等)。Android應用程序允許而且一般也都是使用self- signed證書(即自簽名證書)。證書是用於在應用程序之間建立信任關係,而不是用於控制程序是否可以安裝。簽名影響安全性的最重要的方式是通過決定誰可以進入基於簽名的permisssions,以及誰可以share 用戶IDs。

  2.用戶IDs和文件存取
  每一個Android應用程序(。apk文件)都會在安裝時就分配一個獨有的Linux用戶ID,這就爲它建立了一個沙盒,使其不能與其他應用程序進行接觸(也不會讓其它應用程序接觸它)。這個用戶ID會在安裝時分配給它,並在該設備上一直保持同一個數值。
  由於安全性限制措施是發生在進程級,所以兩個package中的代碼不會運行在同一個進程當中,他們要作爲不同的Linux用戶出現。我們可以通過 使用AndroidManifest。xml文件中的manifest標籤中的sharedUserId屬性,來使不同的package共用同一個用戶 ID。通過這種方式,這兩個package就會被認爲是同一個應用程序,擁有同一個用戶ID(實際不一定),並且擁有同樣的文件存取權限。注意:爲了保持安全,只有當兩個應用程序被同一個簽名簽署的時候(並且請求了同一個sharedUserId)纔會被分配同樣的用戶ID。
  所有存儲在應用程序中的數據都會賦予一個屬性——該應用程序的用戶ID,這使得其他package無法訪問這些數據。當通過這些方法getSharedPreferences(String, int),openFileOutput(String, int)或者 openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory)來創建一個新文件時,你可以通過使用MODE_WORLD_READABLE and/or MODE_WORLD_WRITEABLE標誌位來設置是否允許其他package來訪問讀寫這個文件。當設置這些標誌位時,該文件仍然屬於該應用程序, 但是它的global read and/or write權限已經被設置,使得它對於其他任何應用程序都是可見的。
  例如:APK A 和APK B 都是C公司的產品,那麼如果用戶從APK A中登陸成功。那麼打開APK B的時候就不用再次登陸。 具體實現就是A和B設置成同一個User ID:

2011031516002978.jpg

  這個"com.c" 就是user id。 APK B就可以像打開本地數據庫那樣打開APK A中的數據庫了。APK A把登陸信息存放在A的數據目錄下面。APK B每次啓動的時候讀取APK A下面的數據庫判斷是否已經登陸:

2011031516032534.jpg

  3.權限
  權限用來描述是否擁有做某件事的權力。Android系統中權限分爲普通級別(Normal),危險級別(dangerous),簽名級別(signature)和系統/簽名級別(signature or system)。系統中所有預定義的權限根據作用的不同,分別屬於不同的級別。
  對於普通和危險級別的權限,我們稱之爲低級權限,應用申請即授予。其他兩級權限,我們稱之爲高級權限或系統權限,應用擁有platform級別的認證才能申請。當應用試圖在沒有權限的情況下做受限操作,應用將被系統殺掉以警示。
  系統應用可以使用任何權限。權限的聲明者可無條件使用該權限。
  目前Android系統定義了許多權限,通過SDK文檔用戶可以查詢到哪些操作需要哪些權限,然後按需申請。
  爲了執行你自己的權限,你必須首先在你的AndroidManifest.xml中使用一個或多個<permission> 標籤聲明。例如,一個應用程序想用控制誰能啓動一個activities,它可以爲聲明一個做這個操作的許可,如下:

2011031516074011.jpg

  4.使用權限
  應用需要的權限應當在users-permission屬性中申請,所申請的權限應當被系統或某個應用所定義,否則視爲無效申請。同時,使用權限的申請需要遵循權限授予條件,非platform認證的應用無法申請高級權限。
  所以,程序間訪問權限大致分爲兩種:
  -第一種低級點的(permission的protectlevel屬性爲normal或者dangerous),其調用者apk只需聲明<uses-permission>即可擁有其permission。
  -第二種高級點的(permission的protectlevel屬性爲signature或者signatureorsystem),其調用者apk就需要和被調用的apk一樣擁有相同的signature。
  若想擁有使用權限,必須在AndroidManifest.xml文件中包含一個或更多的<uses-permission> 標籤來聲明此權限。

2011031516353469.jpg

  應用程序安裝的時候,應用程序請求的permissions是通過package installer來批准獲取的。package installer是通過檢查該應用程序的簽名來確定是否給予該程序request的權限。在用戶使用過程中不會去檢查權限,也就是說要麼在安裝的時候就批准該權限,使其按照設計可以使用該權限;要麼就不批准,這樣用戶也就根本無法使用該feature,也不會有任何提示告知用戶嘗試失敗。
  例如高級權限用有system級別權限設定的api時,需要使其apk擁有system權限。比如在 android 的API中有供給SystemClock.setCurrentTimeMillis()函數來修改系統時間。有兩個方法:

  第一個方法簡單點,不過需要在Android系統源碼的情況下用make來編譯:
  1. 在應用程序的AndroidManifest.xml中的manifest節點中插手android:sharedUserId="android.uid.system"這個屬性。
  2. 修改Android.mk文件,插手LOCAL_CERTIFICATE := platform這一行
  3. 使用mm命令來編譯,生成的apk就有修改系統時間的職權範圍了。

  第2個方法麻煩點,不外不消開虛擬機跑到源碼情況下用make來編譯:
  1. 同上,插手android:sharedUserId="android.uid.system"這個屬性。
  2. 使用eclipse編譯出apk文件,但是這個apk文件是不能用的。
  3. 使用針系統的platform密碼鑰匙來從頭給apk文件簽名。signapk platform.x509.pem platform.pk8 input.apk output.apk


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章