カナリアはこの種の攻撃を不可能にしますか?
いいえ、そうではありません。return-to-libc または ROP の実行がより困難になりますが、そのような攻撃に対する特効薬ではありません。
まず第一に、スタック カナリアは、バッファ オーバーフローによるリターン アドレスの破壊に対してのみ保護します。しかし、メモリを破壊する方法は他にもあります。間接的なポインタの上書きやフォーマット文字列の脆弱性が 2 つ挙げられます。
第 2 に、スタック カナリアを元の値で上書きすることでバイパスできます。これが最新の実装で簡単だと言っているわけではありませんが、不可能ではないことは確かです。
第三に、これらの攻撃はreturn -to-libc やReturn Oriented Programming と呼ばれていますが、これらの攻撃を実行するには return 命令が必要だと誰が言いますか? これらの攻撃は、プロセッサがロードしてジャンプ先のアドレスを指定するメモリ ロケーションを破壊することによって開始できます。最も一般的な例は、関数ポインターです。ただし、 GOTまたはlongjmp
バッファーを上書きすることもできます。(補足として、ROP はreturn 命令を使用せずに実行できることが示されています!)
4 番目の理由は、スタック カナリアの本質的な弱点ではなく、ほとんどの実装の 1 つです。通常、スタック カナリアは、サイズが 8 以上のスタック ベースの文字バッファーを持つ関数にのみ配置されます。したがって、これらの実装では、他のバッファーでのオーバーフローは検出されません。このエクスプロイトは、整数配列のオーバーフローを使用していたため、スタック カナリアで検出できませんでした。