2012-07-12 11 views
9

私のアプリケーションでは、android:protectionLevel = "signature"でアクセス権を定義しています。他のアプリケーションが同じ許可名を定義するのを防ぐ方法

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

私の意図は、署名されたアプリケーションによってのみ起動できるアプリケーションモジュールです。これらのアプリケーションモジュールは、その活動にアンドロイド:許可を持っています。 これは正常に動作します。しかし... サードパーティ製のアプリは私が許可を無効にするために、他のアプリを防ぐことができ、同じ権限名を使用して、私のアプリを最初にインストールされている場合は、この

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

のように、通常の保護レベルを変更することができます。ただし、自分のアプリをアンインストールしてからアプリをインストールすると、そのアクセス権が再定義されます。

他のアプリケーションが同じ許可名を使用することを防ぐことはできますか?たとえば、許可をアプリケーションパッケージのような一意のIDにすることはできますか?

マニフェストは暗号化されていますが、このアクセス許可が必要なアクティビティを開始しようとすると誰でもlog catのアクセス許可名を読み取ることができます(必要なアクセス権名を持つ例外がスローされます)。

+0

良い質問ですが、私の推測では、他のアプリケーションを制限する方法はありません。 – FoamyGuy

+0

これはセキュリティ上の問題です。署名されていないアプリケーションが低水準の保護を定義する私の許可を置き換えてから、自分の署名したモジュールを使用することができるので、署名されたアプリケーションモジュールが私の署名付きコアアプリケーションのみが起動されることを許可することはできません。 – Dennix

+0

異なるパッケージ名、署名、protectionLevel = normalのアプリケーションの修正版を作成して、テストを設定することができます。両方のアプリが同じデバイスにある場合、どうなるかを確認してください。私の推測は、a)署名チェックが最初に始まり、不正なアプリが正しい署名を必要とするあなたのアプリにアクセスできないことを確認する。そして、b)異なるレベルのprotectionLevelを持つ同じパーミッション文字列が同じデバイス上に共存することができます。 – tiguchi

答えて

5

罰則はありません。 Javaの世界の他の部分と同様、ドメイン名の登録インフラストラクチャにも頼りがちです。あなたの所有するあなたの公開インターネットドメイン名(例えば、com.myawesomecompany.myapp.MYPERMISSION)を使用してあなたの許可名に接頭辞を付けることです。

ドメイン名の一意性は、レジストラコミュニティによって当然適用されます。

はい、システムは悪用されています。

EDIT:ブロードキャストベースのチャネルを確保している場合は、双方向の署名チェックを追加できます。アクセス権名を第2のパラメータとしてContext.sendBroadcast()を呼び出します。

EDIT2:Androidアプリのより大きなセキュリティの写真を目の当たりにしている間に、あなたはこれを思い知らされているように感じます。それは印象的ではありません。特権インフラストラクチャを濫用することは、Androidアプリをどのようにハックするかではありません。私があなたの意図を傍受しようとすると、私は偽の意図の受信者(活動、サービス)をまとめることはありません。代わりに、私はあなたのアプリ、シグネチャ、およびすべての本物の受信機にデバッガと接続します。

公開されているツールを使用すると、特定のAPK用のEclipseプロジェクトを作成するのに数分かかることがあります。 Eclipseにロードし、実行中のプロセスに接続し、関連するシステムAPI(Androidはオープンソースであり、覚えている)にブレークポイントを設定してください。少し余計な努力を払って、APKのための逆コンパイルされたJavaソースを取得し、システムのものとは異なり、あなたの方法に関してデバッグすることができます。

+0

私の許可の前に私の公開インターネットドメイン名を使用しても、同じプレフィックスを使用する別のアプリケーションは避けられません。 Androidはアプリケーションのパッケージ名にアクセス許可名を紐付けなければならないと思います。 – Dennix

+0

私が言ったように - 故意の虐待のために開いている。 –

+0

Androidは、アプリケーションのパッケージ名にアクセス許可名を紐付けなければならないと思います。したがって、2つの異なるアプリケーションでは、同じパーミッションの定義はありません。 – Dennix

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" /> 

この例では、リソースに同じ符号キーでアクセスできますが、確実にパッケージの削除をブロードキャストできません。