2012-07-12 63 views
9

我的應用程序使用android:protectionLevel =「signature」定義權限。如何防止其他應用程序定義相同的權限名稱

<permission android:name="my.app.permission.EXAMPLE" android:protectionLevel="signature" /> 

我的意圖是讓應用程序模塊只能通過我已簽名的應用程序啓動。這些應用程序模塊在其活動中具有android:權限。 這工作正常。但是... 第三方應用程序可以使用相同的權限名稱。如果我的應用程序第一次安裝改變了保護級別設置爲正常,像這樣

<permission android:name="my.app.permission.EXAMPLE" android:protectionLevel="normal" /> 

,我就可以防止其他人的應用程序覆蓋的權限。但是,如果有人卸載我的應用程序,然後安裝他的應用程序,則重新定義權限。

是否有可能阻止其他應用程序中使用相同的權限名稱,例如,給予許可,如應用程序包一個唯一的ID?

雖然清單是加密的,當它試圖啓動需要這個權限(將拋出一個異常具有所需的權限名)活動任何人都可以讀取日誌貓權限名稱。

+0

好問題,我的猜測是你沒有辦法限制其他應用程序這樣做。 – FoamyGuy 2012-07-12 18:42:56

+0

這是一個安全問題。我無法保證我簽名的應用程序模塊只會啓動我已簽名的核心應用程序,因爲未簽名的應用程序可以取代定義低級別保護的權限,然後使用我簽名的模塊。 – Dennix 2012-07-12 19:05:46

+0

您可以通過使用不同的軟件包名稱,簽名和protectionLevel = normal來創建應用的修改版本來設置測試。看看兩個應用程序在同一臺設備上會發生什麼。我的猜測是,a)簽名檢查將首先啓動,並確保流氓應用程序無法訪問需要正確簽名的應用程序。和b)具有不同保護級別的相同許可字符串可以共存於同一設備上。 – tiguchi 2012-07-12 19:08:00

回答

5

沒有執法,只有慣例。與Java世界的其他部分一樣,它鬆散地依賴於域名註冊基礎設施。這個想法是,你用你自己的公共互聯網域名(例如com.myawesomecompany.myapp.MYPERMISSION)作爲你的權限名稱的前綴。

域名的唯一性自然是由註冊商社區強制執行的。

是的,系統開放濫用。

編輯:如果你保護基於廣播的頻道,你可以,如果你覺得它添加了雙向簽名檢查。使用權限名稱作爲第二個參數調用Context.sendBroadcast()。

EDIT2:我覺得你這個得太多,而在更大的Android應用程序的安全性圖片閉上眼睛。這並不令人印象深刻。濫用特權基礎設施並不是如何侵入Android應用程序。如果我着手攔截你的意圖,我不會把一個假的意圖接收者(活動,服務)放在一起。相反,我會將調試器連接到應用中的真正接收器,簽名和全部。

隨着公開可用的工具,它需要幾分鐘把togther Eclipse項目對於給定的APK。將它加載到Eclipse中,連接到正在運行的進程,在相關係統API中設置斷點(Android是開源的,請記住),瞧。通過一些額外的努力,您可以獲得APK的反編譯Java源代碼,並根據您的方法進行調試,而不是系統的方法。

+0

儘管我使用我的公共互聯網域名作爲我的權限的前綴,但它不會避免另一個應用程序使用相同的前綴。 我認爲Android應該將權限名稱與應用程序的包名稱綁定。 – Dennix 2012-07-12 18:54:59

+0

就像我說過的 - 它對於故意濫用是開放的。 – 2012-07-12 18:55:41

+0

我認爲Android應該將權限名稱和應用程序的包名稱聯繫起來。因此,兩個不同的應用程序不會有相同的權限定義。 – Dennix 2012-07-12 18:58:33

0

如果你想防止其他應用程序更改權限級別,就可以使用具有水平的「簽名」系統預定義的權限。系統之前沒有其他常規應用程序可以定義權限

使用系統權限來保護您的資源並不意味着您的應用程序必須使用平臺密鑰進行簽名。

例如:

<service 
     android:name="xxx.xxx.xxx.exservice" 
     android:permission="android.permission.BROADCAST_PACKAGE_REMOVED" > 

唯一的問題是AppStore上會顯示您所使用的權限,如果下面的代碼顯示應用程序的清單。XML

<uses-permission android:name="android.permission.BROADCAST_PACKAGE_REMOVED" /> 

在這個例子中,你可以訪問你用相同的符號關鍵資源,但絕對不能廣播包中取出。

相關問題