Androidでバッファオーバーフローはどのようにして潜在的に危険なのでしょうか?
具体的には、各アプリに独自のユーザーIDがあり、Dalvik VM同じIDを持つコピーで実行されている場合。オーバーフローが発生しても、アプリのmemページに書き込まれるシェルコードは、アプリ自体と同じ権限を持っていますか?
Stagefrightを例にとってみましょう。C++で記述されたメディアライブラリです。
オーバーフローが割り当てられた特権をバイパスする方法は簡単です。 Cコードはメモリに直接書き込むことができます。何を入れるかを確認するのは開発者の仕事です。そうしないと、同じ特権の他の命令を喜んで上書きします。 Stagefrightには多くの特権があります。そして、バッファから流出する情報は、インターネットからのランダムな猫のビデオである可能性があります(これは、メディアライブラリの特権を獲得します)
したがって、オーバーフローが有害ではないと仮定するのは簡単です。 Stagefrightにはバッファオーバーフローが含まれており、これは非常に危険です。 Android開発者は、アドレス空間レイアウトのランダム化(ASLR)を実装するなどして、悪用を困難にしました。これにより、オフセットの使用が予測不可能になり、コード実行ではなくエラーが発生します。ブラウザの脆弱性により、メモリページの現在の場所に関する情報が漏洩する可能性があるため、コードの実行が可能です。
メタファー、ASLRバイパスを含むStagefrightの実装について読むことをお勧めします。論文とPoCコードはオンラインで入手できます。
オペレーションの質問を言い換えてみましょう:AndroidユーザーIDベースのアプリ分離モデルがあり、オーバーフローでそれを回避するにはどうすればよいですか?
答えは、アプリ、サービス、システムアプリ、Linuxカーネル自体の間で共有される部分をオーバーフローすることです。これらのコンポーネントの多くはC/C++で記述されているため、脆弱です。
これは、すべてのマルチユーザーシステムで特権を昇格させる方法であり、Androidは特別なことではありません。
オーバーフローが発生した場合でも、アプリのメモリページに書き込まれたシェルコードは、アプリ自体と同じ権限しか持たないと思いましたか?
オーバーフローがカーネルまたはプロセス間通信で公開された何か(Androidはサービスとして多くのものを提供する)にない限り、はい。
ただし、3つの主要なアプリケーションであるメッセージング、電子メール、およびブラウザには、かなり多くの特権があることに注意してください。重要な個人データを盗むのに十分です。これらのアプリケーションは、信頼できない外部コンテンツを解釈するアプリケーションでもあります。したがって、外部のコンテンツ(Webページなど)が許可されていないアクセス許可を使用できないようにするのは、これらのアプリケーションの責任です。
一部のコンテンツ(特にビデオとJavaScript)の解釈はCPUとメモリを集中的に使用するため、これらのアプリケーションは多くの潜在的に脆弱なCまたはC++コードも実行しますJavaおよびJVM(= Android JVMはデスクトップのものよりも劣ります)このタスクは、またコードが他のプラットフォームから再利用される前でもありません。深刻なエクスプロイトのほとんどがターゲットにしているのは、このコードの脆弱性です。
私はAndroidセキュリティの専門家ではありませんが、Apache/Linuxシナリオについて考えてみましょう。Android (Androidかどうかでバッファオーバーフローが発生する可能性があるかどうか)は、今のところ質問は省略しておきましょう。
コードをプロセスに注入したとしましょう。今することができます:
したがって、(最初は)自分のアドレススペースにしかアクセスできない場合でも、多くの可能性があります。
説明のために:アプリのプロセスはユーザーIDで実行されています。プロセスはDalvik VMである可能性があります。また、Android C/C++で記述されたNDKを使用するネイティブコードである場合もあります。これは、メディアライブラリ、ゲーム、低レベルOS機能でよく使用されます。
一般に、重要なバッファーオーバーフローの脆弱性のみがメディアで説明されていますが、これらはすべての脆弱性のほんの一部です。