私はインテントを使って、新しいタスクで新しいアクティビティを開始しています。このインテントには、そのアクティビティが必要とするプライベートデータが付属しています。このデータは、他のアプリケーションによって読み取られるべきではありません。 このデータが実際に流出していないかどうかを調査しました。 getRecentTasks()のRecentTaskInfoを使用することで、この余分なデータはGET_TASK権限を持つ任意のアプリケーションから読み取れることがわかりました。 これはあまり安全ではありません。 この漏れが見つかったら検索を停止しました。このデータが漏洩する方法が増えていますか? そして、余分なデータが他のアプリケーションによって読み取られないようにするにはどうすればよいですか?Androidインテントで余分なデータを保護する
答えて
このテントは
なぜそのエキストラでその活動が必要とするいくつかのプライベートなデータを運びますか?これらの識別子をそのプライベートデータ(例えば、データベースクエリ)に解決することは、そのアクティビティによってのみ実行されることができる、エクストラのプライベートデータに識別子を渡す。
は、我々は)(getRecentTasksからRecentTaskInfoを使用して、この余分なデータが
はい、私blogged about thisほぼ2年前GET_TASK権限を持っている任意のアプリケーションによって読み取り可能であることが判明し、他の人はおそらくいましたそれ以前は。
このデータがさらに漏洩する方法はありますか?
他のコンポーネントを起動するすべての要求は、OSプロセスによって行われるため、データは常にOSに「リーク」されます。
そして、あなたがIntent
で何をすべきかに応じて、あなたは他の方法でそれを漏らすかもしれない(例えば、他のアプリに、Parcelable
として、Intent
自体を渡します)。
また、余分なデータを他のアプリケーションが読み取れないようにするにはどうすればよいですか?
できません。繰り返しますが、プライベートデータをアクティビティエクストラに入れないでください。代わりに、プライベートデータを取得するために使用できる識別子を使用してください。
あなたのプライベートストレージスペースは、アプリケーションによってのみ読み込み可能です。ルートされていない端末では、そこに保存されている情報はアプリからのみアクセスできます。
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();
}
追加の許可が余分に使用してサードパーティのアプリケーションによって読まれています守るために追加されました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
だから、その努力が機密情報を輸送する意図余分のより安全な作りに置かれているようです。これらの余分なものが漏れる他の方法があるかどうかはわかりませんが、少なくとも余分なものはJBから上がっているようです。
まあ、それは確かにクールです。私はこれをさらに調査しなければならないでしょう。ありがとう! – CommonsWare
私はあなたのソリューションが使用できることに同意しますが(そして、「すべての」APIレベルにも適用されます)、Androidの最新バージョンでは実際にあなたのブログに記載されている問題が修正されているようです。私の答えにリンクしているコミットをチェックしてください。 – baske
OSが私のデータを読むことができますが、問題はOS以外のアプリケーションにあります。ソリューションを正しく解釈すると、ContentProviderの設定を意味します。セキュリティ問題を別の場所に移動するだけです。目的のアクティビティがアクセスしたときにクエリが回答を返すようにする方法は?複数のアプリケーションで安全な情報を送信する必要がある場合には、実行可能なソリューションとしてアクセス許可が表示されませんが、他の情報を見ることはできません。 – user2186703
@ user2186703: "ソリューションを正しく解釈すると、ContentProviderの設定を意味します。" - いいえ。データベーステーブルの主キーのような識別子を持つデータの概念は、数十年前からありました。 Androidは何十年にもわたっていないので、ContentProviderのようなAndroid固有の構造を使わずに識別子を使ってデータを見つける方法があります。したがって、 "識別子"によって、私はあなたのデータベーステーブルへのキー、またはあなたの 'HashMap'へのキー、あるいはあなたのCSVテーブルの行番号、あるいはあなたの' JSON'オブジェクトへのキーなどを意味します。 – CommonsWare