制御フロー完全性とは

せいぎょふろーかんぜんせい

プログラムの実行の流れが、本来のプログラムで起こりうる経路(制御フローグラフ)から外れないようにする対策の総称。関数からの戻りを守るシャドウスタックやポインタ認証、間接的な呼び出しやジャンプの飛び先を決められた印のある場所に限るIntelのIBTやArmの分岐先識別などのハードウェアの機能と、コンパイラが入れる飛び先の確認がある。戻りアドレスや関数ポインタを書き換えて、既存のコードの断片をつなぐ攻撃を難しくする。

「制御フロー完全性」は、1分野の1問の練習問題に出てきます(ハードウェアセキュリティの最新動向など)。

この用語の分野: ハードウェアセキュリティの最新動向

制御フロー完全性の練習問題に挑戦

制御フロー完全性をハードウェアで支える機能について、関数からの戻りを守るものと、関数ポインタなどによる間接的な呼び出しやジャンプを守るものの組み合わせとして、正しいものはどれか。

  1. A戻りはシャドウスタックやポインタ認証、間接的な呼び出しやジャンプは、飛び先の先頭に決められた印の命令があることを求める仕組みで守る
  2. B戻りは飛び先の先頭に決められた印の命令があることを求める仕組み、間接的な呼び出しやジャンプはシャドウスタックで守る
  3. C戻りはKPTI(カーネルページテーブル分離)、間接的な呼び出しやジャンプはIOMMUによるアドレスの変換で守る
答えと解説を見る

正解:A. 戻りはシャドウスタックやポインタ認証、間接的な呼び出しやジャンプは、飛び先の先頭に決められた印の命令があることを求める仕組みで守る

シャドウスタックは戻りアドレスを複製と比べ、ポインタ認証は戻りアドレスに付けた認証コードを確かめるので、どちらも関数からの戻りを守ります。間接的な呼び出しやジャンプについては、IntelのIBTやArmの分岐先識別(Branch Target Identification)が、飛び先の先頭に印の命令(x86ではENDBR64)があることを求め、関数の途中などへの分岐を例外にします。ただし、印のある場所ならどの関数にも飛べてしまうので、型の合う関数だけに飛び先を絞るコンパイラによる細かい確認と組み合わせることもあります。KPTIはMeltdownへの対策、IOMMUは機器のDMAを制限する仕組みで、制御の流れは守りません。

「制御フロー完全性」が出てくる問題(1問)

  1. 制御フロー完全性をハードウェアで支える機能について、関数からの戻りを守るものと、関数ポインタなどによる間接的な呼び出しやジャンプを守るものの組み合わせとして、正しいものはどれか。

ハードウェアセキュリティの最新動向の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

関連する用語

関数ポインタ シャドウスタック ポインタ認証(PAC) KPTI Meltdown IOMMU DMA(ダイレクトメモリアクセス) Arm CCA HBOM(ハードウェア部品表) MTE(メモリタギング拡張)

用語集の一覧へ