同步适配器服务已导出但未受保护

时间:2013-12-10 10:34:28

标签: android

研究员!

我的应用中有一个同步适配器和相应的同步服务。根据{{​​3}},我已经宣布了所有内容,包括同步服务。更大的图片看起来像这样:

<service
    android:name="com.myapp.SyncService"
    android:exported="true"
    android:process=":sync">

    <intent-filter>
        <action
            android:name="android.content.SyncAdapter"/>
    </intent-filter>

    <meta-data
        android:name="android.content.SyncAdapter"
        android:resource="@xml/syncadapter" />

</service>

虽然在服务上将android:exported属性设置为true是有意义的(让Android系统能够到达它),但我对如何将其绑定在一起感到困惑访问权限。除了我的应用程序和Android系统之外,我不希望任何其他人访问该服务。

我可能有点天真地为此创建了自己的许可:

<permission
    android:name="com.myapp.permission.SYNC_ADAPTER"
    android:protectionLevel="signatureOrSystem" />

但是在protectionLevel上读一点让我更加惊讶。 Google example code

  

请避免使用此选项[...]“signatureOrSystem”权限用于某些特殊情况,其中多个供应商将应用程序内置到系统映像中,并且需要明确共享特定功能,因为它们是一起构建的。

描述的场景远非我的用例。那么问题仍然存在:

如何保护我的同步服务,以便Android系统(但没有第三方应用)可以访问它?

非常感谢任何澄清!

5 个答案:

答案 0 :(得分:3)

beworker是对的。我使用了签名权限,系统可以毫无困难地同步。

答案 1 :(得分:0)

我有同样的问题。在此处查看此示例源代码作为指南https://android.googlesource.com/platform/packages/apps/Exchange/+/ics-mr0/AndroidManifest.xml,似乎同步适配器已明确导出=“true”而没有任何权限。

答案 2 :(得分:0)

看起来没有SyncAdapter权限。我猜我们可以安全地忽略错误。请参阅此处提交的错误:https://code.google.com/p/android/issues/detail?id=37280

答案 3 :(得分:0)

对于您的用例,“签名”保护级别应该足够,该用例授予对系统程序包的访问权限。 'signatureOrSystem'还授予对内置在系统映像中的应用的访问权限。

源代码:请参见grantSignaturePermission()方法 https://android.googlesource.com/platform/frameworks/base/+/a029ea1/services/java/com/android/server/pm/PackageManagerService.java

答案 4 :(得分:0)

为两个服务设置 exported=false

  • 一个注册到 SyncAdapter,另一个注册到 AccountAuthenticator 意图

系统通过意图can still call SyncAdapter 服务!

所以似乎没有必要为exported=true而烦恼

  • 在 Android 10(模拟器)上测试

以下(对我而言)与上述作品无关。

我是这样解释这个帖子里的回复的:

  • exported 服务(见下文)中请求此权限(见示例)应仅允许使用您的签名(以及系统)签名的应用调用此服务。

  • 如果您使用 exported=false,则系统无法调用您的服务,即如果您的应用程序关闭,同步将不会启动(?)

    <permission
        android:name="com.myapp.USE_SYNC_AND_AUTHENTICATOR"
        android:protectionLevel="signature" />

    <application>
        <!-- Export sync and auth to allow the Android System to call them. -->
        <!-- Protect it using a signature permission.  -->
        <service
            android:name="com.myapp.SyncService"
            android:exported="true"
            android:process=":sync"
            android:permission="com.myapp.USE_SYNC_AND_AUTHENTICATOR">
            <intent-filter>
                <action android:name="android.content.SyncAdapter" />
            </intent-filter>
            <meta-data
                    android:name="android.content.SyncAdapter"
                    android:resource="@xml/sync_adapter" />
        </service>
        <service>..authenticator..</service>
    </application>