ハードウェアセキュリティの最新動向
Armのポインタ認証(PAC)の仕組みとして、正しいものはどれか。
- Aポインタを使うたびに、OSにシステムコールで問い合わせて、そのポインタが正しい値かどうかを確かめてもらう
- Bポインタの値と文脈の値から、CPUの中の鍵で短い認証コードを計算してポインタの上位のビットに入れ、使う前に確かめる
- CポインタのすべてのビットをCPUの中の鍵で暗号化してからメモリに保存し、読み出すたびにCPUの中で復号してから使う
答えと解説を見る
正解:B. ポインタの値と文脈の値から、CPUの中の鍵で短い認証コードを計算してポインタの上位のビットに入れ、使う前に確かめる
64ビットのポインタのうち、仮想アドレスに使わない上位のビットに、ポインタの値と文脈の値(例えばスタックポインタ)からCPUの中の鍵で計算した認証コードを入れます。関数の戻りアドレスなどを使う直前に、専用の命令で計算し直して比べ、合わなければ使えないアドレスに変えるので、スタックの戻りアドレスを書き換える攻撃(ROPなど)が難しくなります。鍵はソフトウェアから読めないので、攻撃者は書き換えたポインタに合う認証コードを作れません。ただし、認証コードの長さは仮想アドレスの幅などの設定で決まり、多くの場合十数ビット以下と短いので、何度も推測できる状況では、偶然一致する確率を考える必要があります。
- A. 毎回OSに問い合わせると非常に遅くなります。確認はCPUの命令で行います。
- B. 正しい。鍵を知らない攻撃者は、書き換えたポインタに合う認証コードを作れません。
- C. ポインタの値そのものは暗号化しません。アドレスの部分はそのままで、上位のビットに認証コードを付けます。