2015-09-24 67 views
1

我有一個應用程序(讓我們稱之爲「L」),它提供了Service其他應用程序可以綁定到。 Service要求綁定客戶端有權限"my.permission"與自定義權限依賴關係的討厭問題

我有另一個應用程序(我們稱之爲「X」),它使用「L」中的Service。在清單中爲 「X」,我有:

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

現在我在Android 4.4(奇巧)以下不同的方案:

  1. 用戶安裝第一應用程序 「L」,然後應用「X 」。用戶運行應用程序「X」。 「X」以「L」成功綁定到Service。客戶很高興。
  2. 用戶安裝第一個應用程序「X」,然後安裝應用程序「L」。用戶運行應用程序「X」。由於安全異常,「X」無法綁定到「L」中的Service。 Android宣稱應用程序「X」沒有必要的權限「my.permission」。客戶非常憤怒。

經過大量的實驗,事實證明,在第二種情況下,當用戶安裝應用程序「X」,Android將在清單的權限請求,但不知道權限"my.permission"任何東西,所以它拒絕授予應用程序「X」此權限。解決這個問題的唯一方法是卸載應用程序「X」並重新安裝。此時,由於已經安裝了應用「L」,Android知道該許可並授予應用「X」的許可。

經過多次實驗後,我想出了一個解決問題的辦法。我添加了以下到清單的應用「X」:

<permission android:name="my.permission/> 

現在,當我安裝的第一個應用「X」,那麼Android知道的權限(因爲它是在清單中聲明),並授予權限應用程序。客戶很高興。


一段時間後...

現在我已經在Android 5.0(棒棒堂)以下情況:

  1. 用戶安裝第一個應用程序 「L」,然後應用「X 」。由於INSTALL_FAILED_DUPLICATE_PERMISSION,Android拒絕安裝應用程序「X」。客戶很憤怒!
  2. 用戶安裝第一個應用程序「X」,然後安裝應用程序「L」。由於INSTALL_FAILED_DUPLICATE_PERMISSION,Android拒絕安裝應用程序「L」。客戶很憤怒!

要解決此問題,我現在從應用程序「X」中刪除<permission>聲明,然後在Android 5.0上再次嘗試安裝。我現在有和4.4一樣的問題。

我發現讓它工作的唯一方法是強制用戶在應用程序「X」之前安裝應用程序「L」。顧客不開心。

任何想法?

回答

1

現在,當我安裝第一個應用程序「X」時,Android知道權限(因爲它在清單中聲明)並將權限授予應用程序。客戶很高興。

不幸的是,這也是一個重大的安全缺陷,如any app can do the same thing。自定義權限主要針對固件/預裝應用程序設計。

任何想法?

最大的問題是用相同的簽名密鑰簽署L和X.在這種情況下,它們可以具有相同的<permission>元素。但是,我假設他們沒有被同一個密鑰簽名,否則你不會發布這個問題。

我知道的唯一另一種替代方法是通過自定義權限不安全,但改爲使用其他安全措施。在L的onBind()中,您應該可以使用getCallingUid()來查看呼叫者是誰。通過包名稱和signature check驗證X是調用者。如果可能有多個應用程序填充了X的角色,那麼您將在L的包名/簽名哈希對中加入一個白名單進行檢查。

+0

感謝您的快速回復。當然這裏的情況是,應用程序「L」由另一個供應商提供,而不是由我提供,因此使用相同證書籤署這兩個應用程序是不可能的。在我看來,自定義許可的東西被構建的方式是相當破碎的,因爲它打破了這種依賴關係(這很常見)。 –

+0

@DavidWasser:是的,正如我寫的那樣,他們的設計真的是預先安裝的應用程序,沒有問題誰先安裝。其次,它們適用於來自同一供應商的應用程序套件。除此之外,他們不是很好。 – CommonsWare