13

カナリアが使用されている場合、return-into-libc および return-oriented プログラミングのエクスプロイトが可能かどうか/どのように可能かを理解しようとしています。
カナリアは、戻り値とオーバーフローするバッファの間のスタックに配置され、戻り値をライブラリ関数または計算の場所に変更するために上書きする必要があります。Canaries は 1997 年から存在しており (StackGuard)、ROP は 2007 年に初めて導入された手法です (Shacham)。

カナリアはこの種の攻撃を不可能にしますか?

4

2 に答える 2

19

カナリアはこの種の攻撃を不可能にしますか?

いいえ、そうではありません。return-to-libc または ROP の実行がより困難になりますが、そのような攻撃に対する特効薬ではありません。

まず第一に、スタック カナリアは、バッファ オーバーフローによるリターン アドレスの破壊に対してのみ保護します。しかし、メモリを破壊する方法は他にもあります。間接的なポインタの上書きフォーマット文字列の脆弱性が 2 つ挙げられます。

第 2 に、スタック カナリアを元の値で上書きすることでバイパスできます。これが最新の実装で簡単だと言っているわけではありませんが、不可能ではないことは確かです。

第三に、これらの攻撃はreturn -to-libc やReturn Oriented Programming と呼ばれていますが、これらの攻撃を実行するには return 命令が必要だと誰が言いますか? これらの攻撃は、プロセッサがロードしてジャンプ先のアドレスを指定するメモリ ロケーションを破壊することによって開始できます。最も一般的な例は、関数ポインターです。ただし、 GOTまたはlongjmpバッファーを上書きすることもできます。(補足として、ROP はreturn 命令を使用せず実行できることが示されています!)

4 番目の理由は、スタック カナリアの本質的な弱点ではなく、ほとんどの実装の 1 つです。通常、スタック カナリアは、サイズが 8 以上のスタック ベースの文字バッファーを持つ関数にのみ配置されます。したがって、これらの実装では、他のバッファーでのオーバーフローは検出されません。このエクスプロイトは、整数配列のオーバーフローを使用していたため、スタック カナリアで検出できませんでした。

于 2012-04-26T14:03:35.383 に答える
3

これは、gccで作成されたカナリアを説明するWebサイトです。http://xorl.wordpress.com/2010/10/14/linux-glibc-stack-canary-values/。カナリアはret命令が実行される前にチェックされるため、カナリアを上書きするとエクスプロイトは失敗します(ほとんどの場合、スタック上のリターンアドレスを上書きするために行う必要があります)。ROPとReturntoLib cもリターンアドレスを上書きするため、どちらの方法も機能しません。

于 2011-04-13T08:52:14.660 に答える