7

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

4

3 回答 3

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

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

于 2013-03-19T14:14:35.023 回答
6

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

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

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

是的,我在近两年前写过关于这个的博客,其他人可能在此之前就写过。

是否有更多方式泄露这些数据?

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

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

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

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

于 2013-03-19T13:55:17.997 回答
1

You have private storage space, which is readable only by your application. On non-rooted devices, the information you store there will only be accessible to your app.

You could use a SharedPreference to store your data - the data is stored in your app's designated private storage.

Alternatively, you can use the private storage directly and wire arbitrary files there like this:

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();
} 
于 2013-03-19T13:57:54.147 回答