2012-09-06 92 views
4

應用程序使用AIDL調用遠程服務時是否提供任何安全性?或者它就像惡意應用程序可以讀取數據一樣?Android AIDL安全

回答

2

在Android上,一個進程無法正常訪問另一個進程的內存。

當您使用AIDL接口綁定到應用程序時,系統將在這些過程之間建立連接。因此,只有這兩個應用程序可以讀取通過AIDL接口共享的信息。

如果你想可以肯定,你應該做一個額外的檢查在onBind(Intent intent),以確保它是你自己的應用程序,它是連接

提示:閱讀本頁面的第一部分:http://developer.android.com/guide/components/aidl.html

+0

您能否詳細說明「在onBind()中的額外檢查」?假設我在使用平臺簽名簽名的系統應用程序中有遠程服務。我有我自己的常規應用程序由我簽名,並希望確定該服務將只接受來自我的應用程序的綁定。我怎樣才能保證這一點? –

+1

最好的辦法是創建一個權限並使用getCallingUid()調用進行檢查,如果該包具有綁定的權限。 –

+0

https://stackoverflow.com/questions/12918731/how-to-get-application-package-name-or-uid-which-is-trying-to-bind-my-service-fr –

1

您可以隨時在您的方法中過濾以限制允許的軟件包。拋出SecurityException如果包裝沒有權限

Collection<String> callingpackages = getCallingPackages(); 

if(!callingpackages.contains("yourpackagename"){ 
//Throw securityException. 
} 

而且getCallingPackages

private Collection<String> getCallingPackages() { 
    int caller = Binder.getCallingUid(); 
    if (caller == 0) { 
     return null; 
    } 
    return Lists.newArrayList(mContext.getPackageManager().getPackagesForUid(caller)); 
} 
0

此外,在與遠程服務進行服務連接時。指定運行服務的應用程序的軟件包名稱。

像這樣

意圖serviceIntent =新意圖( 「com.android.vending.billing.InAppBillingService.BIND」); serviceIntent.setPackage(「com.android.vending」); bindService(serviceIntent,mServiceConn,Context.BIND_AUTO_CREATE);

注意:爲確保您的應用程序安全,始終在啓動服務時使用明確的意圖,並且不要爲您的服務聲明意圖過濾器。使用隱式意圖啓動服務會帶來安全隱患,因爲您無法確定將響應該意圖的服務,並且用戶無法看到啓動哪項服務。從Android 5.0(API級別21)開始,如果您以隱式意圖調用bindService(),則系統會引發異常。