7

当应用程序使用 AIDL 调用远程服务时,是否提供了任何安全性?还是只是像恶意应用程序可以读取数据一样?

4

4 回答 4

3

在 Android 上,一个进程不能正常访问另一个进程的内存。

当您绑定到具有 AIDL 接口的应用程序时,系统将在这些进程之间建立连接。因此,只有这两个应用程序可以读取通过 AIDL 接口共享的信息。

如果您想确定,您应该在 , 中进行额外检查onBind(Intent intent),以确保连接的是您自己的应用程序

提示:阅读本页第一部分:http: //developer.android.com/guide/components/aidl.html

于 2012-09-06T06:52:46.440 回答
1

您可以随时过滤您的方法以限制允许的包。如果包没有权限,则抛出 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));
 }
于 2012-09-06T06:23:21.147 回答
1

示例安全性servicesignature通过使用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>
于 2021-01-28T02:55:07.597 回答
0

此外,在建立与远程服务的服务连接时。指定运行服务的应用程序的包名称。

像这样

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(),系统将引发异常。

于 2017-02-27T13:43:20.667 回答