スタックカナリア
スタックカナリア とは何ですか?
スタックカナリアスタックカナリアは、関数のローカルバッファと保存された戻りアドレスの間に置かれた秘密値で、制御フローを奪取される前にスタックオーバーフローを検出します。
スタックカナリアは 1998 年に Crispin Cowan らが StackGuard で提案した防御技術で、関数のスタックフレームにおいてローカル変数と保存された戻りアドレスの間に配置される乱数値です。コンパイラは関数入口でカナリアを設定し、出口で検証するコードを挿入します。改ざんが検出されると、破壊された戻りアドレスを使う前にプログラムを中断します。現代のツールチェーンでは -fstack-protector や /GS として提供され、プロセスごとの乱数値と終端バイト(通常 0x00)によって、カナリアを含む溢れペイロードにも耐性を持たせます。カナリアは ASLR、DEP、CFI、メモリ安全言語を補完するもので、代替にはなりません。
● 例
- 01
GCC の -fstack-protector-strong が配列を含む関数にカナリアを挿入する。
- 02
MSVC の /GS オプションが strcpy ベースのオーバーフローを検出する。
● よくある質問
スタックカナリア とは何ですか?
スタックカナリアは、関数のローカルバッファと保存された戻りアドレスの間に置かれた秘密値で、制御フローを奪取される前にスタックオーバーフローを検出します。 サイバーセキュリティの アプリケーションセキュリティ カテゴリに属します。
スタックカナリア とはどういう意味ですか?
スタックカナリアは、関数のローカルバッファと保存された戻りアドレスの間に置かれた秘密値で、制御フローを奪取される前にスタックオーバーフローを検出します。
スタックカナリア はどのように機能しますか?
スタックカナリアは 1998 年に Crispin Cowan らが StackGuard で提案した防御技術で、関数のスタックフレームにおいてローカル変数と保存された戻りアドレスの間に配置される乱数値です。コンパイラは関数入口でカナリアを設定し、出口で検証するコードを挿入します。改ざんが検出されると、破壊された戻りアドレスを使う前にプログラムを中断します。現代のツールチェーンでは -fstack-protector や /GS として提供され、プロセスごとの乱数値と終端バイト(通常 0x00)によって、カナリアを含む溢れペイロードにも耐性を持たせます。カナリアは ASLR、DEP、CFI、メモリ安全言語を補完するもので、代替にはなりません。
スタックカナリア からどのように防御しますか?
スタックカナリア に対する防御は通常、上記の定義で述べたとおり、技術的統制と運用上の実践を組み合わせます。
スタックカナリア の別名は何ですか?
一般的な別名: StackGuard, スタッククッキー, GS クッキー。
● 関連用語
- appsec№ 064
ASLR
ASLR はコード、スタック、ヒープ、ライブラリの配置アドレスを実行ごとに乱数化し、攻撃者がエクスプロイトに使う目標アドレスを予測できないようにする緩和策です。
- appsec№ 303
DEP(データ実行防止)
DEP(NX ビット、W^X)はメモリページを実行不可と印付けし、スタックやヒープに注入されたシェルコードの実行を阻止します。
- appsec№ 217
コントロールフロー整合性(CFI)
CFI はプログラムの間接呼び出しと戻りを事前計算した正当な遷移先集合に制限し、ROP や JOP による制御フロー奪取を阻止します。
- appsec№ 1028
シャドースタック
シャドースタックは戻りアドレスの控えを保持する独立した保護スタックで、通常スタックの改ざんを CPU が検出して ROP 攻撃を阻止します。
- appsec№ 925
リターン指向プログラミング(ROP)
ROP は、RET で終わる短い命令列(ガジェット)を連結して、新しいコードを注入することなく任意の計算を実現するコード再利用型のエクスプロイト手法です。
- appsec№ 670
メモリ安全性
メモリ安全性とは、プログラムが正当に確保していないメモリを読み書きしたり実行したりしないという性質で、脆弱性のクラスをまとめて排除できます。
● 関連項目
- № 545Intel CET