当应用程序使用 AIDL 调用远程服务时,是否提供了任何安全性?还是只是像恶意应用程序可以读取数据一样?
4 回答
在 Android 上,一个进程不能正常访问另一个进程的内存。
当您绑定到具有 AIDL 接口的应用程序时,系统将在这些进程之间建立连接。因此,只有这两个应用程序可以读取通过 AIDL 接口共享的信息。
如果您想确定,您应该在 , 中进行额外检查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
,signature
通过使用android:protectionLevel="signature"
,只有签署相同签名(相同密钥库)的应用程序才能绑定到您的服务
应用服务器AndroidManifest.xml
<manifest ...>
<permission
android:name="my.MyCustomPermission"
android:protectionLevel="signature" />
<application
...>
<service
...
android:permission="my.MyCustomPermission">
...
</service>
</application>
</manifest>
应用客户端AndroidManifest.xml
<manifest ...>
<uses-permission android:name="my.MyCustomPermission"/>
<application
...
</application>
</manifest>
此外,在建立与远程服务的服务连接时。指定运行服务的应用程序的包名称。
像这样
Intent serviceIntent = new intent("com.android.vending.billing.InAppBillingService.BIND"); serviceIntent.setPackage("com.android.vending"); bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);
注意:为确保您的应用程序安全,请始终在启动服务时使用显式意图,并且不要为您的服务声明意图过滤器。使用隐式意图启动服务是一种安全隐患,因为您无法确定会响应该意图的服务,并且用户无法看到哪个服务启动。从 Android 5.0(API 级别 21)开始,如果您使用隐式 Intent 调用 bindService(),系统将引发异常。