保护Android Intent中的额外数据

时间:2013-03-19 13:46:31

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

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

3 个答案:

答案 0 :(得分:8)

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

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

  

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

     

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

     

更改ID:I95af9e181ac42557bc8b981807e7ddd266a88d0e

因此,似乎正在努力使意图更安全地传输敏感信息。我不知道是否还有其他方式可以泄漏这些额外的东西,但至少从JB上来看,额外的东西似乎没问题。

答案 1 :(得分:6)

  

此Intent在其附加内容中包含该Activity所需的一些私有数据

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

  

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

是的,我近两年前blogged about this,其他人甚至可能在此之前做过。

  

这些数据泄漏的方式有多少?

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

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

  

而且,如何确保其他应用程序无法读取额外数据?

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

答案 2 :(得分:1)

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

您可以使用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();
}