6. PACによるROPの検知
○ ポインタの認証を⾏うための命令が追加されている
l 認証コードを⽣成してポインタに埋め込む命令︓ PAC*
l 認証コードを検証してポインタを復元する命令︓ AUT*
l ポインタ認証機構が実装されていないCPUではNOP命令扱いになる
→ 後⽅互換性
○ gccのオプション-sign-return-addressを付与することで,上記命令が挿⼊される
1. PACIASPで,認証コードを⽣成し,LRに埋め込む
l 関数の開始時,LR(Link Register)には戻り先アドレスが格納されている
2. AUTIASPで,スタックからLRに復元した戻り先アドレスを認証する
2020/11/30 Ritsumeikan Security Team
5
function :
PASIASP ; create PAC
stp FP, LR, [SP, #0] ; store LR
… ; function body
ldp FP, LR, [SP, #0] ; load LR
AUTIASP ; authenticate
ret ; return
7. PACの⽣成
○ 複数のキー(128bit)が⽤意されており,各キーは64bitのシステムレジスタ
(カーネルモードからしかアクセスできない)に格納される
l 命令アドレスへのポインタ⽤のキーが2つ
l データアドレスへのポインタ⽤のキーが2つ
l 汎⽤キーが1つ
l 命令・データアドレスについて,PACの⽣成と検証を⾏う命令は,どちらのキーを使⽤するか指定する
○ 認証コード⽣成アルゴリズムは,IMPLEMENTED DEFINE(プロセッサの実装による)
l アルゴリズムには,QARMAが推奨されている
○ 認証コード⽣成には,ポインタとキー,Modifier(例えばスタックポインタ)が⽤いられる
l スタックポインタは,呼び出す時と返る時に値が同じ
l PACIASPの場合,命令アドレスへのポインタをキーAとSPを⽤いて認証コードを⽣成する
2020/11/30 Ritsumeikan Security Team
6
Pointer
Key
Modifier
P +
PAC Pointer + PAC