アプリケーションが AIDL を使用してリモート サービスを呼び出す場合、セキュリティは提供されますか? それとも、単に悪意のあるアプリケーションがデータを読み取れるようなものですか?
4 に答える
Android では、通常、あるプロセスが別のプロセスのメモリにアクセスすることはできません。
AIDL インターフェイスを使用してアプリケーションにバインドすると、システムはそれらのプロセス間の接続を確立します。したがって、AIDL インターフェイスを介して共有される情報を読み取ることができるのは、これら 2 つのアプリケーションだけです。
確認したい場合は、 で追加のチェックを行ってonBind(Intent intent)
、接続しているのが自分のアプリケーションであることを確認する必要があります。
ヒント: このページの最初の部分を読んでください: http://developer.android.com/guide/components/aidl.html
メソッドをいつでもフィルタリングして、許可されるパッケージを制限できます。パッケージに権限がない場合は 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));
}
セキュリティの例service
by signature
、 using 、同じ署名android:protectionLevel="signature"
(同じキーストア)に署名するアプリのみがサービスにバインドできます
アプリケーションサーバーAndroidManifest.xml
<manifest ...>
<permission
android:name="my.MyCustomPermission"
android:protectionLevel="signature" />
<application
...>
<service
...
android:permission="my.MyCustomPermission">
...
</service>
</application>
</manifest>
AppClientAndroidManifest.xml
<manifest ...>
<uses-permission android:name="my.MyCustomPermission"/>
<application
...
</application>
</manifest>