【问题标题】:Protecting extra data in Android Intent保护 Android Intent 中的额外数据
【发布时间】:2013-03-19 13:46:30
【问题描述】:

我正在使用 Intent 在新任务中启动新 Activity。此 Intent 在其附加内容中包含该 Activity 所需的一些私有数据。此数据不应被其他应用程序读取。 我们已经调查了这些数据是否确实没有泄露。我们发现,通过使用 getRecentTasks() 中的 RecentTaskInfo,任何具有 GET_TASK 权限的任意应用程序都可以读取这些额外的数据。 这不是很安全。 一旦我们发现这个泄漏,我们就停止了搜索。是否有更多方式泄露这些数据? 还有,如何确保 extra 中的数据不被其他应用程序读取?

【问题讨论】:

    标签: android android-intent android-4.2-jelly-bean


    【解决方案1】:

    从 Android 4.1.1 开始,添加了一个额外的权限,以防止第三方应用程序使用 RecentTaskInfo 读取额外内容。此权限(android.Manifest.permission.GET_DETAILED_TASKS)只能由系统获取。如果没有这个权限,额外的将在baseIntent 通过RecentTaskInfo 返回之前被换出。

    来自commit http://androidxref.com/4.2.2_r1/history/frameworks/base/services/java/com/android/server/am/ActivityManagerService.java#8238e717df4bc5eebf15f97172d68af3599a95bb的评论:

    添加新的签名级权限以获取任务的详细信息。

    第三方应用现在无法访问额外的意图 与任务相关联,以防止其中的私人数据泄露。

    更改 ID:I95af9e181ac42557bc8b981807e7ddd266a88d0e

    因此,似乎正在努力使 Intent extra 更安全地传输敏感信息。我不知道是否还有其他方式可以泄漏这些额外内容,但至少从 JB 开始,这些额外内容似乎还可以。

    【讨论】:

    • 嗯,这当然很酷。我将不得不进一步调查。谢谢!
    【解决方案2】:

    此 Intent 在其 extras 中包含该 Activity 所需的一些私有数据

    为什么?将标识符传递给 extras 中的私有数据,其中将这些标识符解析为该私有数据(例如,数据库查询)只能由 Activity 完成。

    我们发现,通过使用 getRecentTasks() 中的 RecentTaskInfo,任何具有 GET_TASK 权限的任意应用程序都可以读取这些额外的数据

    是的,我 blogged about this 差不多两年前了,其他人可能在此之前就已经这样做了。

    还有其他方式泄露这些数据吗?

    所有启动其他组件的请求都通过操作系统进程进行,因此数据一直“泄露”给操作系统。

    而且,根据您对 Intent 的操作,您可能会以其他方式泄漏它(例如,将 Intent 本身作为 Parcelable 传递给其他应用程序)。

    而且,我如何确保 extra 中的数据不被其他应用程序读取?

    你不能。同样,不要将私有数据放在活动附加内容中,而是使用可用于获取该私有数据的标识符。

    【讨论】:

    • 虽然我同意可以使用您的解决方案(顺便说一下,它将适用于“所有”api 级别),但似乎更新的 Android 版本实际上解决了您在博客。检查我在答案中链接的提交..
    • 我可以接受操作系统能够读取我的数据,问题出在非操作系统应用程序上。如果我正确解释了您的解决方案,则意味着设置了 ContentProvider。这只是将安全问题转移到另一个位置:如何确保查询仅在预期活动访问它时返回答案?当多个应用程序需要向它们发送安全信息但不允许它们查看彼此的信息时,我认为权限不是一个可行的解决方案。
    • @user2186703:“如果我正确解释了您的解决方案,则意味着设置了 ContentProvider”——不。具有标识符的数据(如数据库表中的主键)的概念已经存在了几十年。由于 Android 已经存在几十年了,所以有一些方法可以使用标识符来查找数据,而无需使用 Android 特定的构造,例如 ContentProvider。因此,“标识符”是指数据库表的键,HashMap 的键,CSV 表的行号,JSON 对象的键等。
    • @user2186703:如果您要使用 ContentProvider 来实现这一点,您可能可以使用意图“数据”和 FLAG_GRANT_READ_URI_PERMISSION 来为接收活动提供特定于 uri 的一次性读取权限,这可以使用查询检索私有数据。但是,如果您可以确定 JB+ 为目标,您可能需要考虑坚持最初的解决方案,因为它似乎比 Jellybean 之前更安全。 (见其他答案)
    【解决方案3】:

    您有私有存储空间,只有您的应用程序才能读取。在非 root 设备上,您存储在那里的信息只能由您的应用访问。

    您可以使用SharedPreference 来存储您的数据 - 数据存储在您应用指定的私有存储中。

    或者,您可以直接使用私有存储并在其中连接任意文件,如下所示:

    FileOutputStream fos;
    try {
        fos = openFileOutput (FILENAME, Context.MODE_PRIVATE);
        fos.write (string.getBytes ());
        fos.close ();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      相关资源
      最近更新 更多