web-dev-qa-db-ja.com

Androidサイドチャネル:1つのアプリが他のアプリについて何を観察できるか?

悪意のあるAndroidアプリは、同じ電話で実行されている他のアプリの動作についてどのような情報を観察できますか?

より詳細には、アプリMが悪意があり、バックグラウンドで実行されているとします。アプリAが正当で、同じ電話で実行されているとします。 AについてMが観察できる情報は何ですか? Aの動作またはユーザーとAの相互作用について、Mは何を推測できますか?

私は/procに世界中で読み取り可能ないくつかのファイルがあることを知っています。これにより、Mは/proc/N/fooを読み取ることによってAに関するいくつかの(おそらく無害な)情報を観察できます。ここで、NはpidですアプリAの一部のプロセスの一部であり、fooは世界中で読み取り可能なファイルです。これはMに何を見させますか?この情報に基づいて、Mは何を推測できますか?

アプリMがアプリAの動作について何か学習できる方法は他にありますか?たとえば、アプリMはアプリAが通信しているIPアドレスを学習できますか?アプリMは、アプリAが現在何らかの排他的アクセスのリソース/センサー(たとえば、マイク、カメラなど)を使用しているかどうかを知ることができますか?アプリMは、画面のソフトキーボードを介してアプリAに入力されたテキストについて何か推測できますか?

8
D.W.

少なくともマルチコアプラットフォーム(およびほとんどの新しいスマートフォンはマルチコア)では、攻撃者が十分な精度でクロックにアクセスできる限り、ブランチ予測とキャッシュに対するすべてのサイドチャネル攻撃が機能します。 ARMアーキテクチャには、アプリケーションコードが使用できる「サイクルカウンタ」がありますが、特権コード(カーネル)から最初に有効にする必要があります。詳細は この回答 を参照してください。ネイティブAndroid 2.3( [〜#〜] ndk [〜#〜] )で始まるアプリのコードが可能です。

Androidでサイクルカウンターがデフォルトで有効になっているかどうかはわかりません。新しく起動したCPUでは無効になっていますが、AndroidはLinuxカーネルを使用しており、サイクルカウンターはgettimeofday()システムコールの実装を含む多くのタスクに非常に便利です。 Linuxカーネルがそれを有効にしている可能性があります。これはテストする必要があります。

[〜#〜] if [〜#〜]サイクルカウンターが有効になっている場合、Javaメソッド System.nanoTime() も純粋なJavaアプリの場合)と同じ情報を返す可能性があります。そのため、キャッシュをプルオフするためにネイティブに移行する必要がない場合もあります- Androidのタイミング攻撃。

また、、他の正確な時計が存在する可能性があります。たとえば、GPS APIは Location.getElapsedRealtimeNanos() を使用してこれを提供します。

キャッシュアクセスに対するサイドチャネル攻撃は 一般的なAES実装 で実証されています(実験室の条件では、まだ実証されています)。暗号化アルゴリズムに対するこのような攻撃についてはかなりの作業が行われていますが、ここでは暗号化に固有のことは何もありません。暗号アルゴリズムがkeysを使用し、キーが秘密を集中することは偶然に起こります。キーを知ることで多くのことが明らかになるため、キーは価値の高いターゲットです。また、このような攻撃はすべて暗号技術者によって研究されており、暗号技術者は暗号アルゴリズムに取り組んでいます。ただし、サイドチャネルリークは、暗号化されているかどうかにかかわらず、アルゴリズムのすべての実装で発生する可能性があります。通常、デバイスで暗号化が行われるのは、一部の機密データがそのデバイスによって処理され、暗号化だけでなく、そのすべての処理が異常にリークする可能性があるためです。問題は現実的であり、すべてを包括しています。

これらの仮定の下では、他のアプリが何をするかについて、アプリから多くのデータを推測できると仮定する必要があります。自分と同じハードウェアで同時にコードを実行するローカルの攻撃者に対する防御は困難です。

5
Tom Leek

たくさん。完全なリストを提示するのではなく、いくつかの代表的な例を示します。

アプリMはアプリAが通信しているIPアドレスを知ることができますか?

はい、目を閉じて両手を後ろで縛っていても。 /proc/net/tcpは、開いているすべての接続を一覧表示しますTCP=接続です。これが私です。Androidでは、uidがアプリケーションを公開します。特定のプロセスの同じ情報を/proc/$pid/net/tcpのすべてのユーザーが利用できます。

Shell@Android:/ $ cat /proc/net/tcp                                            
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     
   0: 3600030A:AF4C 10CEFCC6:0050 01 00000000:00000000 00:00000000 00000000 10004        0 402734 1 00000000 37 3 8 10 -1                            
…

アプリMは、アプリAが現在何らかの排他的アクセスのリソース/センサー(たとえば、マイク、カメラなど)を使用しているかどうかを知ることができますか?

リソースが排他的アクセスの場合、アプリMは少なくともポーリングして、リソースが使用中かどうかを確認できます。 Mは、この情報を/proc/$pid/stat*のアプリAのアクティビティ統計と関連付けることができます。

アプリMは、画面のソフトキーボードを介してアプリAに入力されたテキストについて何か推測できますか?

はい。スマートフォンには多くの入力デバイスがあります:カメラ、マイク、加速度計、… 加速度計のみ

制御された設定では、予測モデルは平均してPIN入力された43%の時間とパターン73%の時間を50回のPINと50パターンのテストセットから選択した場合、5回の試行で分類できます。 。制御されていない設定では、ユーザーが歩いている間も、5回の試行でPINの20%とパターンの40%を分類できます。

その成功率は50個のランダムなPINの間だけであり、19741975の間で決定する際の成功率はおそらく低くなります。一方、この研究では加速度計のみを使用しており、カメラやタイミングなどの他のデータを組み合わせると、速度が向上する可能性があります。

タイミング対策は多くのデータをリークする可能性があります。 Tom Leek's answer を参照してください。

/procを通じて得られる情報はAndroidに固有のものです。他のオペレーティングシステムでは、この情報が公開される場合とされない場合があります。 SEAndroid のようなものは、この情報が他のアプリケーションに漏洩するのを防ぐことができます。一方、サイドチャネルの問題は、データフローの分離を改善するだけでは回避できません。他のアプリケーションの実行中に時間を伝えたり、ハードウェアデバイスにアクセスしたりする機能などの便利な機能を排除する必要があります。これは、一部の設定(スマートカードなど)では許容できるが、スマートフォンでは許容できない場合があります。