【问题标题】:How Can the Settings App Start an App's Non-Exported Activity?设置应用程序如何启动应用程序的非导出活动?
【发布时间】:2023-03-03 00:47:01
【问题描述】:

Android N 允许您将自己的活动链接到应用程序的页面中 设置。只需为android.intent.action.APPLICATION_PREFERENCES 添加<intent-filter>。 Android N 的设置应用程序将在您的应用程序中查找 有<intent-filter>。如果设置找到一个,它将添加一个齿轮 图标到您的应用程序的设置页面,如果用户点击齿轮,他们 将被带到您指定的活动。

我担心安全问题,所以我提交了an issue,寻找可以与android:permission 一起使用的权限,以允许设置启动我们的活动,但不允许其他应用启动我们的活动(例如,@987654330 @)。

cketti 然后指出you could just mark the activity as not exported, via android:exported="false"。令我惊讶的是,这行得通。

设置应用如何启动标记为未导出的活动?

我当然可以看到有一个控制这个的权限。但是,快速阅读设置应用程序的清单(master branchn-developer-preview-5 分支)并没有发现任何明显的问题。

所以:

  • 是否有允许应用启动另一个应用的非导出组件的权限?如果有,是哪一个?

  • 如果没有,设置是如何实现的?

【问题讨论】:

  • 你在这里回答了类似的问题:stackoverflow.com/questions/13892721/…
  • @Shaishav:虽然它是关于一个相关主题(使用<intent-filter> 保护活动),但它并没有解决我在这里提出的问题。

标签: android android-permissions android-source android-security


【解决方案1】:

我猜想清单中没有任何内容允许应用调用导出的活动。我相信它实现这一点的方法是在 Settings 应用程序的 Android.mk 文件中设置LOCAL_PRIVILEGED_MODULE := true。此标志将授予应用程序系统级权限,并在 OS 编译期间将其放置在 system/priv-app/ 目录中。

如果您查看frameworks/base/core/java/android/app/ActivityManager.java 的方法checkComponentPermission,您可以看到如果UID 是SYSTEM 的UID,则无论导出的设置如何,都会授予组件权限。

【讨论】:

  • 我认为它是基于设置应用程序的 UID 的概念。我不是 100% 相信 checkComponentPermission() 是做出决定的地方,因为我不认为 SDK 类会决定你是否被允许开始一项活动。
  • @CommonsWare 你是什么意思 - I would not expect an SDK class to be deciding whether or not you're allowed to start an activity?你会期待什么?
  • @Vikram:我原以为它会在系统服务 (ActivityManagerService?) 或类似的东西中确定。现在,他们可能使用与 SDK 中相同的 checkComponentPermission() 方法。
  • 我同意这有点奇怪,它可以在其他地方确定。我做了一点挖掘,似乎 AOSP 的其他领域确实调用了ActivityManagercheckComponentPermission。如ActivityManagerService,它有确切的方法,但将逻辑委托给ActivityManager
  • @CommonsWare 我明白你的意思。它用@hide 注释,告诉我它不是供公众消费的,它应该是ActivityManagerService 的一部分,而ActivityManager.checkComponentPermission(...) 又依赖于ActivityManager.checkComponentPermission(...)。奇怪的是,Bobbake4 的答案看起来是正确的。
【解决方案2】:

虽然@Bobbake4 的回答是基于 UID 的检查是正确的,但

如果您查看 frameworks/base/core/java/android/app/ActivityManager.java 中的 checkComponentPermission 方法,您可以看到如果 UID 是 SYSTEM 的 UID,则无论导出的设置如何,都会授予组件权限。

我相信关于LOCAL_PRIVILEGED_MODULE 的第一部分是无关紧要的。目录位置不控制获取哪个 UID 设置,而是由sharedUserId in the manifest 设置。正如documentation 中所述,这仅适用于使用与平台相同的证书对应用进行签名的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    相关资源
    最近更新 更多