我正在使用 Intent 在新任务中启动新活动。此 Intent 在其附加内容中包含该 Activity 所需的一些私有数据。此数据不应被其他应用程序读取。我们已经调查了这些数据是否确实没有泄露。我们发现,通过使用 getRecentTasks() 中的 RecentTaskInfo,任何具有 GET_TASK 权限的任意应用程序都可以读取这些额外的数据。这不是很安全。一旦我们发现这个泄漏,我们就停止了搜索。是否有更多方式泄露这些数据?而且,如何确保额外的数据不被其他应用程序读取?
3 回答
从 Android 4.1.1 开始,添加了一个额外的权限,以防止第三方应用程序使用RecentTaskInfo
. 此权限 ( android.Manifest.permission.GET_DETAILED_TASKS
) 只能由系统获取。如果没有此权限,多余的将在baseIntent
通过RecentTaskInfo
.
添加新的签名级权限以获取任务的详细信息。
第三方应用程序现在无法访问与任务相关的额外意图,以防止其中的私人数据泄露。
更改 ID:I95af9e181ac42557bc8b981807e7ddd266a88d0e
因此,似乎正在努力使 Intent extra 更安全地传输敏感信息。我不知道是否还有其他方式可以泄漏这些额外内容,但至少从 JB 开始,这些额外内容似乎还可以。
此 Intent 在其附加内容中包含该 Activity 所需的一些私有数据
为什么?将标识符传递给额外的私有数据,其中将这些标识符解析为该私有数据(例如,数据库查询)只能由活动完成。
我们发现,通过使用 getRecentTasks() 中的 RecentTaskInfo,任何具有 GET_TASK 权限的任意应用程序都可以读取这些额外的数据
是的,我在近两年前写过关于这个的博客,其他人可能在此之前就写过。
是否有更多方式泄露这些数据?
所有启动其他组件的请求都通过操作系统进程进行,因此数据一直“泄露”给操作系统。
而且,根据您对 的处理Intent
方式,您可能会以其他方式泄漏它(例如,将 anIntent
本身作为传递Parcelable
给其他应用程序)。
而且,如何确保额外的数据不被其他应用程序读取?
你不能。同样,不要将私有数据放在活动附加内容中,而是使用可用于获取该私有数据的标识符。
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();
}