Blind_return_oriented_programming
参照:
リターン指向プログラミング
「ブラインドリターン指向のプログラミング」
ブラインドリターン指向プログラミング(BROP)は、攻撃者がターゲットバイナリを所有していない場合でも、エクスプロイトを正常に作成できるエクスプロイト手法です。Bittauらによって示されたBROP攻撃。64ビットシステムのアドレス空間配置のランダム化(ASLR)とスタックカナリアを打ち負かしました。
コンテンツ
1 ROPの歴史
2 BROPのシナリオ
3 攻撃のフェーズ
3.1 スタック読み取り 3.2 ブラインドROP 3.3 エクスプロイトを構築する
4 BROP防止
5 同様の攻撃
6 参考文献
ROPの歴史
OSのセキュリティとハードウェア、Linux PAXプロジェクトなどのセキュリティ機能の現在の改善により、コードインジェクションは不可能になりました。次に、セキュリティ研究者は、NX(実行不可能)メモリを打ち負かすためにリターン指向プログラミングと名付けた新しい攻撃を考案しました。この攻撃は、スタック、特にリターンアドレスを制御することによってプログラムフローに影響を与えることに依存しています。ガジェットは、この攻撃の基本単位です。ガジェットは、スタックの特定の状態とともに、戻り命令で終わる命令シーケンスのグループです。ガジェットは、メモリからレジスタにワードをロードするような操作を実行したり、条件付きジャンプなどのより複雑な操作を実行したりできます。十分な大きさのターゲットバイナリで、チューリング完全ガジェットのコレクションを構築できます。これは、シェルコードを実行するのに十分すぎるほどです。ROPが行う1つの仮定は、攻撃者がターゲットバイナリを所有しているため、ガジェットのアドレスを事前に知っているというものです。
BROPのシナリオ
BROP が関連する可能性のある3つの新しいシナリオがそれらは:(i)は、閉じたバイナリサービスの場合には、毛羽や侵入テストの必要性のような技術が使用される脆弱性を発見します。(ii)オープンソースライブラリの既知の脆弱性は、それを使用するプロプライエタリバイナリがクローズドソースであっても、悪用される可能性が(iii)バイナリが不明なオープンソースサーバーをハッキングするためにも使用できます。この攻撃は、既知のスタックの脆弱性を持つサービスがサーバー上にあり、クラッシュ時にサービスを再起動する必要があることを前提としています。
攻撃のフェーズ
スタック読み取り
戻り命令ポインタは通常、スタックカナリアによって保護されています。スタックカナリアは、その値がバッファオーバーランによって変更されると、プログラムをクラッシュさせます。攻撃のBROPモデルでは、バッファオーバーランはバイトごとに実行されます。オーバーランを試行するたびに、プログラムがクラッシュするか、実行が継続されます。プログラムのクラッシュは、スタック値が誤って推測されたことを意味します。したがって、256回の試行(平均的なケースは128回の試行)で、スタック値を推定できる可能性が64ビットマシンでは、カナリアをリークするには、このようなスタック読み取りが4回必要になります。カナリアがリークすると、リターン命令ポインタが同じように摂動する可能性がただし、スタックカナリアの推定は正確ですが、戻り命令アドレスについては同じことが言えないことに注意して攻撃者は、アドレス空間のテキストセグメント内の任意のアドレスをリークできることに満足します。
ブラインドROP
この段階が攻撃の中心です。このフェーズの目的は、書き込みシステムコールを開始し、バイナリのダンプを攻撃者に送信することです。書き込みシステムコールには、ソケット、バッファ、長さの3つのパラメータがx86-64の呼び出し規約では、パラメーターをレジスターに渡す必要があるため、writeシステムコールの引数を設定するには、rsi、rdi、およびrdxへの適切なポップ命令が必要になります。pop rdi、retなどの命令シーケンスはこの点で役立ちます。書き込みシステムコールの単純なROPバージョンは次のようになります。(1)pop rdi; ret(ソケット)(2)pop rsi; ret(バッファ)(3)pop rdx; ret(長さ)(4)pop rax; ret(システムコール番号を書き込む)(5)システムコール
この方法の問題の1つは、スタック上のアドレスを返した後にアドレススペースで有用なガジェットが見つかったとしても、実行不可能なスタックが発生する可能性が高いことです。これを改善するために、BROP提案者はストップガジェットを考案しました。停止ガジェットは、無限ループやシステムコールのブロック(スリープなど)など、プログラムをブロックさせるものです。これにより、攻撃の影響を受けたプロセッサが無限ループに陥り、攻撃者が攻撃を続行できるようになります。
上で述べたのは、攻撃の最低限の方法論です。実際には、攻撃を効率的に実行するのに役立ついくつかの最適化を実行できます。その中で最も重要なのは、システムコール番号をsyscall関数に渡す代わりに、Procedure Linker Tables(PLT)を使用して書き込みシステムコールを追跡することです。その他には、strcmpを使用してRDXレジスタにデータを入力することが含まれます。これは、pop RDXであるため、ret命令シーケンスは非常にまれです。
エクスプロイトを構築する
書き込みがPLTで見つかると、攻撃者はターゲットバイナリの内容をダンプして、さらに多くのガジェットを見つけることができます。攻撃者は、従来のROPガジェット検索手法を使用して、十分な数を収集し、シェルコードを作成できます。シェルコードを入手すると、悪用されたシステムをルートアクセスで完全に制御できるようになります。
BROP防止
BROP攻撃の大きな前提は、サーバーがクラッシュするたびに再起動し、再起動してもアドレス空間が再ランダム化されないことです。したがって、起動時にアドレススペースの再ランダム化を有効にすると、BROPに対するほぼ完全な保護を提供できます。NetBSDとLinuxで使用されているもう1つの手法は、クラッシュ時のスリープです。これにより、攻撃が大幅に遅くなり、システム管理者は疑わしいアクティビティを調べることができます。これとは別に、ROPスタイルの制御フローハイジャック攻撃に対する従来の保護とは別に、制御フローの整合性は、証明可能な防止を提供できますが、パフォーマンスのオーバーヘッドが大きくなります。
同様の攻撃
性質がBROPに似ている別の攻撃は、JIT(Just-In-Time)-ROP、またはJIT-ROPです。これは、情報開示に基づく別の攻撃でもあり、アドレス空間配置のランダム化を打ち負かすことができます。BROPとJIT-ROPはどちらも、ROP攻撃を開始するために、バイナリ上でガジェットを見つけようとします。目標は、ある種のデータ漏洩を悪用することです。ただし、BROPとは異なり、JIT-ROPはインタラクティブな攻撃ではなく、クラッシュ/クラッシュのない状況に適応しようとします。むしろ、攻撃者はガジェットを検出するスクリプトを送信し、その後、配信のための攻撃を作成します。 。また、JIT-ROPには、攻撃の前に既知の2つの異なる脆弱性(ヒープとスタックの両方)が必要ですが、BROPではスタックの脆弱性を認識するだけで済みます。
参考文献
^ 「ブラインドリターン指向プログラミング(BROP)」。スタンフォードセキュアコンピュータシステムグループ。
^ キーナー、ローレンス。「ブラインドリターン指向のプログラミング攻撃の一般性と限界の評価」(PDF)。Calhoun:NPS機関アーカイブ:26 。
ハッキングブラインド、Andrea Bittau、Adam Belay、Ali Mashtizadeh、David Mazieres、Dan Boneh
Return Oriented Programming、Hovav Shacham etal。
http://www.scs.stanford.edu/brop/
http://www.scs.stanford.edu/brop/bittau-brop.pdf
http://ytliu.info/blog/2014/05/31/blind-return-directiond-programming-brop-attack-yi/