シャドースタック
シャドースタック とは何ですか?
シャドースタックシャドースタックは戻りアドレスの控えを保持する独立した保護スタックで、通常スタックの改ざんを CPU が検出して ROP 攻撃を阻止します。
シャドースタックは通常のコールスタックと並行して動作し、呼び出しごとに戻りアドレスを両方のスタックにプッシュし、リターン時に両者を比較します。値が一致しなければ CPU がトラップを発生させ、改ざんされた戻りアドレスが使われる前にプロセスを終了します。学術的な CFI 研究で広く知られ、Intel CET シャドースタックや Arm v8.5-A の Guarded Control Stack(GCS)としてハードウェアに実装されました。LLVM SafeStack や clang -fsanitize=safe-stack のソフトウェア実装もありますが、性能と隔離のコストが伴います。シャドースタックは CFI の後方エッジを担い、間接呼び出しは CFI/IBT 等の前方エッジ機構と組み合わせる必要があります。
● 例
- 01
Windows 11 が CET 対応 CPU でユーザーモードシャドースタックを強制する。
- 02
Arm GCS が保存された LR を上書きするスタックバッファ溢れを検出する。
● よくある質問
シャドースタック とは何ですか?
シャドースタックは戻りアドレスの控えを保持する独立した保護スタックで、通常スタックの改ざんを CPU が検出して ROP 攻撃を阻止します。 サイバーセキュリティの アプリケーションセキュリティ カテゴリに属します。
シャドースタック とはどういう意味ですか?
シャドースタックは戻りアドレスの控えを保持する独立した保護スタックで、通常スタックの改ざんを CPU が検出して ROP 攻撃を阻止します。
シャドースタック はどのように機能しますか?
シャドースタックは通常のコールスタックと並行して動作し、呼び出しごとに戻りアドレスを両方のスタックにプッシュし、リターン時に両者を比較します。値が一致しなければ CPU がトラップを発生させ、改ざんされた戻りアドレスが使われる前にプロセスを終了します。学術的な CFI 研究で広く知られ、Intel CET シャドースタックや Arm v8.5-A の Guarded Control Stack(GCS)としてハードウェアに実装されました。LLVM SafeStack や clang -fsanitize=safe-stack のソフトウェア実装もありますが、性能と隔離のコストが伴います。シャドースタックは CFI の後方エッジを担い、間接呼び出しは CFI/IBT 等の前方エッジ機構と組み合わせる必要があります。
シャドースタック からどのように防御しますか?
シャドースタック に対する防御は通常、上記の定義で述べたとおり、技術的統制と運用上の実践を組み合わせます。
シャドースタック の別名は何ですか?
一般的な別名: リターンスタック, セーフスタック, GCS。
● 関連用語
- appsec№ 217
コントロールフロー整合性(CFI)
CFI はプログラムの間接呼び出しと戻りを事前計算した正当な遷移先集合に制限し、ROP や JOP による制御フロー奪取を阻止します。
- appsec№ 545
Intel CET
Intel CET(制御フロー強制技術)は、ハードウェアシャドースタックと間接分岐追跡(IBT)を組み合わせ、ROP/JOP/COP の悪用を阻止する CPU 機能です。
- appsec№ 925
リターン指向プログラミング(ROP)
ROP は、RET で終わる短い命令列(ガジェット)を連結して、新しいコードを注入することなく任意の計算を実現するコード再利用型のエクスプロイト手法です。
- appsec№ 1095
スタックカナリア
スタックカナリアは、関数のローカルバッファと保存された戻りアドレスの間に置かれた秘密値で、制御フローを奪取される前にスタックオーバーフローを検出します。
- appsec№ 064
ASLR
ASLR はコード、スタック、ヒープ、ライブラリの配置アドレスを実行ごとに乱数化し、攻撃者がエクスプロイトに使う目標アドレスを予測できないようにする緩和策です。
- appsec№ 670
メモリ安全性
メモリ安全性とは、プログラムが正当に確保していないメモリを読み書きしたり実行したりしないという性質で、脆弱性のクラスをまとめて排除できます。