7

新しいタスクで新しいアクティビティを開始するためにインテントを使用しています。このインテントは、エクストラでそのアクティビティが必要とするいくつかのプライベート データを運びます。このデータは、他のアプリケーションで読み取ることはできません。このデータが本当に漏洩していないかどうかを調査しました。getRecentTasks() から RecentTaskInfo を使用することで、GET_TASK パーミッションを持つ任意のアプリケーションがこの余分なデータを読み取ることができることがわかりました。これはあまり安全ではありません。このリークを見つけた時点で、検索を停止しました。このデータが漏洩する他の方法はありますか? また、extra のデータが他のアプリケーションで読み取れないようにするにはどうすればよいですか?

4

3 に答える 3

8

Android 4.1.1 以降、RecentTaskInfo. この権限 ( android.Manifest.permission.GET_DETAILED_TASKS) は、システムによってのみ取得できます。この許可がないと、baseIntentが を介して返される前に、エクストラが交換されRecentTaskInfoます。

commit http://androidxref.com/4.2.2_r1/history/frameworks/base/services/java/com/android/server/am/ActivityManagerService.java#8238e717df4bc5eebf15f97172d68af3599a95bbのコメントから:

タスクの詳細を取得するための新しい署名レベルのアクセス許可を追加します。

サードパーティのアプリは、タスクに関連付けられたインテントのエクストラにアクセスできなくなりました。これにより、インテント内のプライベート データが漏洩するのを防ぐことができます。

変更 ID: I95af9e181ac42557bc8b981807e7ddd266a88d0e

そのため、インテント エクストラをより安全に機密情報を転送できるようにするための努力が払われているようです。これらのエクストラが漏れる可能性がある他の方法があるかどうかはわかりませんが、少なくともエクストラは JB から問題ないようです。

于 2013-03-19T14:14:35.023 に答える
6

このインテントは、エクストラでそのアクティビティに必要ないくつかのプライベート データを運びます

なんで?エクストラで識別子をプライベート データに渡します。これらの識別子をそのプライベート データ (データベース クエリなど) に解決することは、アクティビティによってのみ実行できます。

getRecentTasks() の RecentTaskInfo を使用することで、GET_TASK パーミッションを持つ任意のアプリケーションがこの余分なデータを読み取ることができることがわかりました。

はい、私はこれについてほぼ 2 年前にブログに書きました。

このデータが漏洩する他の方法はありますか?

他のコンポーネントを開始するすべての要求は OS プロセスを経由するため、データは常に OS に「漏えい」しています。

また、 の処理内容によってはIntent、他の方法でリークする可能性があります (たとえば、 をIntentとしてParcelable他のアプリに渡すなど)。

また、extra のデータが他のアプリケーションで読み取れないようにするにはどうすればよいですか?

できません。繰り返しになりますが、プライベート データをアクティビティ エクストラに配置しないでください。代わりに、そのプライベート データを取得するために使用できる識別子を使用してください。

于 2013-03-19T13:55:17.997 に答える
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();
} 
于 2013-03-19T13:57:54.147 に答える