新しいタスクで新しいアクティビティを開始するためにインテントを使用しています。このインテントは、エクストラでそのアクティビティが必要とするいくつかのプライベート データを運びます。このデータは、他のアプリケーションで読み取ることはできません。このデータが本当に漏洩していないかどうかを調査しました。getRecentTasks() から RecentTaskInfo を使用することで、GET_TASK パーミッションを持つ任意のアプリケーションがこの余分なデータを読み取ることができることがわかりました。これはあまり安全ではありません。このリークを見つけた時点で、検索を停止しました。このデータが漏洩する他の方法はありますか? また、extra のデータが他のアプリケーションで読み取れないようにするにはどうすればよいですか?
3 に答える
Android 4.1.1 以降、RecentTaskInfo
. この権限 ( android.Manifest.permission.GET_DETAILED_TASKS
) は、システムによってのみ取得できます。この許可がないと、baseIntent
が を介して返される前に、エクストラが交換されRecentTaskInfo
ます。
タスクの詳細を取得するための新しい署名レベルのアクセス許可を追加します。
サードパーティのアプリは、タスクに関連付けられたインテントのエクストラにアクセスできなくなりました。これにより、インテント内のプライベート データが漏洩するのを防ぐことができます。
変更 ID: I95af9e181ac42557bc8b981807e7ddd266a88d0e
そのため、インテント エクストラをより安全に機密情報を転送できるようにするための努力が払われているようです。これらのエクストラが漏れる可能性がある他の方法があるかどうかはわかりませんが、少なくともエクストラは JB から問題ないようです。
このインテントは、エクストラでそのアクティビティに必要ないくつかのプライベート データを運びます
なんで?エクストラで識別子をプライベート データに渡します。これらの識別子をそのプライベート データ (データベース クエリなど) に解決することは、アクティビティによってのみ実行できます。
getRecentTasks() の RecentTaskInfo を使用することで、GET_TASK パーミッションを持つ任意のアプリケーションがこの余分なデータを読み取ることができることがわかりました。
はい、私はこれについてほぼ 2 年前にブログに書きました。
このデータが漏洩する他の方法はありますか?
他のコンポーネントを開始するすべての要求は OS プロセスを経由するため、データは常に OS に「漏えい」しています。
また、 の処理内容によってはIntent
、他の方法でリークする可能性があります (たとえば、 をIntent
としてParcelable
他のアプリに渡すなど)。
また、extra のデータが他のアプリケーションで読み取れないようにするにはどうすればよいですか?
できません。繰り返しになりますが、プライベート データをアクティビティ エクストラに配置しないでください。代わりに、そのプライベート データを取得するために使用できる識別子を使用してください。
アプリケーションでのみ読み取り可能なプライベートストレージスペースがあります。ルート権限を取得されていないデバイスでは、そこに保存する情報はアプリにのみアクセスできます。
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();
}