web-dev-qa-db-ja.com

Androidでバッファオーバーフローはどのように有害ですか?

Androidでバッファオーバーフローはどのようにして潜在的に危険なのでしょうか?

具体的には、各アプリに独自のユーザーIDがあり、Dalvik VM同じIDを持つコピーで実行されている場合。オーバーフローが発生しても、アプリのmemページに書き込まれるシェルコードは、アプリ自体と同じ権限を持っていますか?

16
shura

Stagefrightを例にとってみましょう。C++で記述されたメディアライブラリです。

オーバーフローが割り当てられた特権をバイパスする方法は簡単です。 Cコードはメモリに直接書き込むことができます。何を入れるかを確認するのは開発者の仕事です。そうしないと、同じ特権の他の命令を喜んで上書きします。 Stagefrightには多くの特権があります。そして、バッファから流出する情報は、インターネットからのランダムな猫のビデオである可能性があります(これは、メディアライブラリの特権を獲得します)

したがって、オーバーフローが有害ではないと仮定するのは簡単です。 Stagefrightにはバッファオーバーフローが含まれており、これは非常に危険です。 Android開発者は、アドレス空間レイアウトのランダム化(ASLR)を実装するなどして、悪用を困難にしました。これにより、オフセットの使用が予測不可能になり、コード実行ではなくエラーが発生します。ブラウザの脆弱性により、メモリページの現在の場所に関する情報が漏洩する可能性があるため、コードの実行が可能です。

メタファー、ASLRバイパスを含むStagefrightの実装について読むことをお勧めします。論文とPoCコードはオンラインで入手できます。

20
J.A.K.

オペレーションの質問を言い換えてみましょう:AndroidユーザーIDベースのアプリ分離モデルがあり、オーバーフローでそれを回避するにはどうすればよいですか?

答えは、アプリ、サービス、システムアプリ、Linuxカーネル自体の間で共有される部分をオーバーフローすることです。これらのコンポーネントの多くはC/C++で記述されているため、脆弱です。

これは、すべてのマルチユーザーシステムで特権を昇格させる方法であり、Androidは特別なことではありません。

9
billc.cn

オーバーフローが発生した場合でも、アプリのメモリページに書き込まれたシェルコードは、アプリ自体と同じ権限しか持たないと思いましたか?

オーバーフローがカーネルまたはプロセス間通信で公開された何か(Androidはサービスとして多くのものを提供する)にない限り、はい。

ただし、3つの主要なアプリケーションであるメッセージング、電子メール、およびブラウザには、かなり多くの特権があることに注意してください。重要な個人データを盗むのに十分です。これらのアプリケーションは、信頼できない外部コンテンツを解釈するアプリケーションでもあります。したがって、外部のコンテンツ(Webページなど)が許可されていないアクセス許可を使用できないようにするのは、これらのアプリケーションの責任です。

一部のコンテンツ(特にビデオとJavaScript)の解釈はCPUとメモリを集中的に使用するため、これらのアプリケーションは多くの潜在的に脆弱なCまたはC++コードも実行しますJavaおよびJVM(= Android JVMはデスクトップのものよりも劣ります)このタスクは、またコードが他のプラットフォームから再利用される前でもありません。深刻なエクスプロイトのほとんどがターゲットにしているのは、このコードの脆弱性です。

2
Jan Hudec

私はAndroidセキュリティの専門家ではありませんが、Apache/Linuxシナリオについて考えてみましょう。Android (Androidかどうかでバッファオーバーフローが発生する可能性があるかどうか)は、今のところ質問は省略しておきましょう。

  1. バッファオーバーフローにより、攻撃者は実行中のプロセスのメモリにコードを挿入できます。通常、攻撃者はシェル(/ bin/bashなど)を開始するコードを挿入しようとします。これは、stdoutをリモートの攻撃ボックスに送信し、そのボックスからstdinを受信します。その結果、攻撃者のコンピューターにターミナルウィンドウが表示されますが、シェルプロセスは攻撃されたボックスで実行されます。 Android=で言うように、プロセスはユーザースペースで実行されます。同じことがLinux上の通常のWebサーバーシナリオにも当てはまります。つまり、所有者が持っていないプロセスメモリにコードを挿入します多くの特権を持っている(www-dataまたはApacheはLinuxではまったく強力ではない)現時点では、ユーザーがOSで実行することを許可されている攻撃者のボックスからリモートでのみアクションを実行できます。Linuxでは、これはかなり制限があり、Androidでも同様です。
  2. 攻撃者が目指している次のステップは、特権の昇格です。つまり「サンドボックス」タイプの問題から抜け出すことができるOS /その他の欠陥を見つけてください。Windows/ Linux /何にでも何千ものバグがあり、制限されたユーザーからの権限昇格を可能にしますroot/Administrator(過去15年間でカウント)。 Androidの場合、これはAndroid OSでユーザースペースから抜け出すことができるようなバグを見つける必要があることを意味します。完璧ではないのでこの世界には存在する可能性のあるバグが存在する可能性が高く、発見するかどうかは時間とエネルギーに依存します。
  3. Androidでバッファオーバーフローは発生しますか?もちろん可能です。 Androidは、ほとんどのオペレーティングシステムと同様にCで記述されています。すべての電話ベンダーが独自のOSを持っているため、Samsung/LG /開発者がコードに欠陥を導入していないことが確実になります?JavaとCの間のインターフェースでは、Cパーツは引き続き適切な境界チェックを行う必要があります。それ以外の場合はメモリを上書きします。ただし、アプリ開発者はこの問題を心配する必要はありません。 Javaではメモリアドレスに直接書き込むことができないためです。
1
kaidentity

コードをプロセスに注入したとしましょう。今することができます:

  • プロセスにアクセス可能なデータと権限を混乱させる(アプリのアカウント詳細を盗み、アプリに権限がある場合は写真にアクセスし、攻撃されたアプリがTwitterである場合はTwitterメッセージを自分の名前で投稿する...)
  • 特権昇格攻撃を使用してより高い特権を取得する
  • アプリの一部(特にメディアライブラリ)は、より高い権限で実行される場合があります。それらを攻撃すると、より高い特権を得ることができます。私が正しく覚えていれば、Stagefrightはこれを使用しました。
  • 電話で別のアプリ/プロセス(リモートからアクセスできないものも)を攻撃し、ターゲットに到達するまですべてを繰り返します

したがって、(最初は)自分のアドレススペースにしかアクセスできない場合でも、多くの可能性があります。

説明のために:アプリのプロセスはユーザーIDで実行されています。プロセスはDalvik VMである可能性があります。また、Android C/C++で記述されたNDKを使用するネイティブコードである場合もあります。これは、メディアライブラリ、ゲーム、低レベルOS機能でよく使用されます。

一般に、重要なバッファーオーバーフローの脆弱性のみがメディアで説明されていますが、これらはすべての脆弱性のほんの一部です。

0
H. Idden