ハードウェアセキュリティの最新動向
制御フロー完全性をハードウェアで支える機能について、関数からの戻りを守るものと、関数ポインタなどによる間接的な呼び出しやジャンプを守るものの組み合わせとして、正しいものはどれか。
- A戻りはシャドウスタックやポインタ認証、間接的な呼び出しやジャンプは、飛び先の先頭に決められた印の命令があることを求める仕組みで守る
- B戻りは飛び先の先頭に決められた印の命令があることを求める仕組み、間接的な呼び出しやジャンプはシャドウスタックで守る
- C戻りはKPTI(カーネルページテーブル分離)、間接的な呼び出しやジャンプはIOMMUによるアドレスの変換で守る
答えと解説を見る
正解:A. 戻りはシャドウスタックやポインタ認証、間接的な呼び出しやジャンプは、飛び先の先頭に決められた印の命令があることを求める仕組みで守る
シャドウスタックは戻りアドレスを複製と比べ、ポインタ認証は戻りアドレスに付けた認証コードを確かめるので、どちらも関数からの戻りを守ります。間接的な呼び出しやジャンプについては、IntelのIBTやArmの分岐先識別(Branch Target Identification)が、飛び先の先頭に印の命令(x86ではENDBR64)があることを求め、関数の途中などへの分岐を例外にします。ただし、印のある場所ならどの関数にも飛べてしまうので、型の合う関数だけに飛び先を絞るコンパイラによる細かい確認と組み合わせることもあります。KPTIはMeltdownへの対策、IOMMUは機器のDMAを制限する仕組みで、制御の流れは守りません。
- A. 正しい。戻りと間接的な分岐では、守る仕組みが違います。
- B. 組み合わせが逆です。印の命令は間接的な分岐の飛び先を、シャドウスタックは戻りを守ります。
- C. KPTIもIOMMUも、制御の流れを守る仕組みではありません。