我正在使用Intent在新任务中启动一个新的Activity。此Intent在其附加内容中携带该Activity所需的一些私有数据。其他应用程序不应读取此数据。 我们已经调查过这些数据是否确实没有泄露。我们发现通过使用getRecentTasks()中的RecentTaskInfo,任何具有GET_TASK权限的任意应用程序都可以读取这些额外数据。 这不是很安全。 一旦发现这个泄漏,我们就停止了搜索。这些数据泄露的方式有多少? 而且,如何确保其他应用程序无法读取额外数据?
答案 0 :(得分:8)
从Android 4.1.1开始,添加了一项额外的权限,以防止第三方应用使用RecentTaskInfo
读取额外内容。此权限(android.Manifest.permission.GET_DETAILED_TASKS
)只能由系统获取。如果没有此权限,则会在通过baseIntent
返回RecentTaskInfo
之前更换额外内容。
添加新的签名级权限以获取任务的详细信息。
第三方应用现在无法访问意图的额外内容 与任务相关联,以防止其中的私人数据泄露。
更改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();
}