スタックカナリア
バッファオーバーフロー攻撃への対策のうち,関数の呼出し時にスタック上のリターンアドレスの手前にランダムな値を配置し,関数から戻る直前にその値が書き換えられていないかを検査することによって,リターンアドレスの改ざんを検知するものはどれか。
- アASLR(Address Space Layout Randomization)
- イDEP(Data Execution Prevention)
- ウスタックカナリア
- エCFI(Control Flow Integrity)
正解と解説を見る
正解 ウ
この問題の基礎知識
- スタックバッファオーバーフローは,スタック上のバッファの境界を超えて書き込み,その先にあるリターンアドレスなどを書き換えて,関数から戻るときに攻撃者の指定した箇所へ制御を移させる攻撃である。
- バッファオーバーフロー対策は働く段階で区別できる。書換えの検知,データ領域でのコード実行の防止(DEP,NX ビット),メモリ配置のランダム化による飛び先の予測の妨害(ASLR),分岐先が正当な制御フローの範囲内かの検証(CFI)などがある。
- ソースコードの段階では,境界を検査する安全な関数を用いることや,境界検査を行う言語を用いることが根本的な対策となる。
ASLR は,スタックやヒープ,共有ライブラリなどを配置するメモリアドレスを実行のたびにランダム化し,攻撃者が飛び先のアドレスを予測しにくくする対策である。スタック上の値の改ざん検査は行わない。
DEP は,CPU の NX(XD)ビットなどを利用してスタックやヒープなどのデータ領域を実行不可とし,そこに注入されたシェルコードの実行を防ぐ対策である。リターンアドレスの改ざん自体は検知しない。
リターンアドレスの手前にカナリアと呼ばれるランダムな値を置き,関数のリターン直前に値が変化していないかを検査する。スタック上のバッファがあふれてリターンアドレスまで上書きされると途中のカナリアも壊れるので,改ざんを検知して処理を停止できる。
CFI は,間接分岐や関数呼出しの飛び先が,あらかじめ解析した正当な制御フローの範囲内にあるかを実行時に検証する対策である。ランダムな値をスタックに置いて書換えを検査する仕組みではない。
照合の根拠(4 件)
- ウ(正解): StackGuard/ProPolice などがカナリアによるバッファオーバーフロー検知を提供する
Examples include: the Microsoft Visual Studio /GS flag, Fedora/Red Hat FORTIFY_SOURCE GCC flag, StackGuard, and ProPolice, which provide various mechanisms including canary-based detection and range/index checking.
CWE-121 · Potential Mitigations(新しいタブで開きます) - ア(誤り): ASLR はメモリ配置をランダム化して飛び先を予測しにくくする対策で,値の改ざん検査ではない
Run or compile the software using features or extensions that randomly arrange the positions of a program's executable and libraries in memory. Because this makes the addresses unpredictable, it can prevent an attacker from reliably jumping to exploitable code.
CWE-121 · Potential Mitigations(新しいタブで開きます) - イ(誤り): DEP は NX/XD ビットによる実行防止であり,リターンアドレス改ざんの検知ではない
Use a CPU and operating system that offers Data Execution Protection (using hardware NX or XD bits) or the equivalent techniques that simulate this feature in software, such as PaX [ REF-60 ] [ REF-61 ].
CWE-119 · Potential Mitigations(新しいタブで開きます) - エ(誤り): CFI は ROP などによる制御フローの乗っ取りを防ぐもの(定義の詳細は未確認)
Intel CET is an instruction set extension to implement control flow integrity and defend against ROP and COP/JOP style subversion attacks.
NISTIR 8320 · Appendix B.2.1.1(新しいタブで開きます)
カナリアをリターンアドレスの手前に置きリターン直前に検査するという仕組みの詳細を説明する読める一次資料が見つからなかった(IPA セキュア・プログラミング講座は現サイトで 404,NISTIR 8151 に記載なし,JPCERT/CC のセキュアコーディング資料にも記載なし。GCC・Clang・Microsoft の文書や MITRE D3FEND(D3-SFCV)は接続できない)。CFI も制御フロー保護であることまでしか確認できていない。