4

我已经WearableListenerService在我的主应用程序和配套的 Wear 应用程序中实现了一个。在清单中,服务需要声明为android:exported="true"(或根本不声明,默认为true),因为它是由 Google Play 服务启动的。系统上的任何应用程序都可以调用没有权限的导出服务,但我找不到添加到服务声明以保护它的正确权限。我已经查看了手机和 Wear 设备上的权限,pm list permissions但我没有看到任何看起来像我需要的东西。

  1. 是否有我可以/应该添加的权限来保护我的服务?
  2. 如果没有,通过检查调用者的包名称来手动保护服务是否是个好主意?
4

2 回答 2

10

了解如何在 Android Wear 上实现 WearableListenerService 的最佳方法是查看 SDK 提供的现有示例之一。如果您查看 $SDK/samples/android-20/wearable/DataLayer 中包含的 DataLayer 示例,它会完整实现您想要做的事情。

如果您查看可穿戴端的 AndroidManifest.xml,您可以看到它具有以下内容:

    <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

    <service
            android:name=".DataLayerListenerService" >
        <intent-filter>
            <action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
        </intent-filter>
    </service>

为了您的安全考虑......当我们在清单中声明服务并为其添加过滤器时,它会自动成为导出服务。所以一般来说,其他应用程序可以绑定到该服务。对于 WearableListenerService,框架中会进行安全检查,以确保绑定到该服务的代理是 Google Play 服务,因此没有其他人可以真正绑定到该服务,除非应用程序开发人员在这种情况下公开了其他意图过滤器目的是让其他人访问它。

因此,如果您以与 Wear SDK 示例相同的方式实现代码,您的应用程序应该是安全的,您无需担心任何额外的权限等。

于 2014-07-23T18:18:37.867 回答
2
  1. 是否有我可以/应该添加的权限来保护我的服务?
  2. 如果没有,通过检查调用者的包名称来手动保护服务是否是个好主意?

您无需担心WearableListenerService使用权限或调用程序包检查来保护您的实施。正如@Wayne 在他的回答中指出的那样:there is a security check that happens in the framework。此检查在WearableListenerService基类中完成。您可以在以下文章中找到对 Wearable SDK 的进一步安全分析: https ://labs.mwrinfosecurity.com/blog/android-wear-security-analysis 。这是它的引文:

该方法pr()首先检查是否com.google.android.gms经过 Google 签名,然后调用cU()以检查调用进程 UID 是否用于包com.google.android.gms(Google Play 服务包)。如果进一步反编译该类,可以看出这种安全检查发生在WearableListenerService.

 

不幸的是,目前 Lint 检查器会在可穿戴侦听器服务声明不包含BIND_LISTENER过滤器时产生误报警告(其中包含会产生其他警告,因为它现在已被弃用并且应该避免):

导出的服务应定义实体必须具有的权限才能启动服务或绑定到它。没有这个,任何应用程序都可以使用这个服务。

这肯定是安全检测器代码中的一个错误(它只是在BIND_LISTENER意图被弃用时没有更新)。我已经在 Android 错误跟踪器上打开了一个关于此的问题。同时,为了摆脱警告,需要在tools:ignore="ExportedService"其可穿戴监听服务声明中添加。

于 2016-09-27T16:37:24.907 回答