RISC-VのPrivileged仕様Version 1.12 ではePMPレジスタ群(PMP Enhancements)についての仕様が検討されている。 これについて調査してみよう。
仕様書は以下に置いてある。誰でもダウンロードできる。
https://raw.githubusercontent.com/riscv/riscv-tee/main/Smepmp/Smepmp.pdf
そもそものモチベーションは、現状のPMPはスーパバイザモードについてのみ適用されており、マシンモードでは適用することが出来ない。これではマシンモードと非特権モードを使った攻撃を防ぐことが出来ない。
現在のスーパバイザモードを使った攻撃手法として以下が紹介されている:
- SMAP(Supervisor memory Access Prevention) : 特定のコードパスをたどらない限り、OSが非特権プロセスのメモリにアクセスできないようにするもの
- SMEP(supervisor Memory Execution Prevention) : OSが常に非特権プロセスのメモリを実行できないようにするもの
これについては、sstatus.SUM
ビットによるSMAPのサポートと、Uビットでマークされた仮想メモリページの実行を常に拒否するSMEPのサポートが、Privilege Specで義務付けられているSupervisor mode (OS)の特権ですでに行われている。
これに対して、マシンモードでもさらにPMPが適用できるようにするのがePMPの主たる目的だ。このために、以下のレジスタを定義する。
Machine Security Configuration (
mseccfg
)- Machine modeでのみアクセス可能
- 64ビット幅。RV64では0x747、RV32では0x747(下位32ビット)、0x757(上位32ビット)のアドレスに割り当てられている。
mseccfg
では、ビット2にRule Locking Bypass (mseccfg.RLB
)と呼ばれるフィールドを導入し、以下の機能を持たせているmseccfg
では、ビット1にMachine Mode Whitelist Policy (mseccfg.MMWP
)というフィールドを導入しているmseccfg
では、ビット0にMachine Mode Lockdown (mseccfg.MML
)というフィールドを導入している- これはスティッキービットで、一度設定するとPMPのリセットがかかるまで解除できない
mseccfg.MML
が設定されると、システムの動作は次のように変わるpmpcfg.L
の意味が変わり、ルールをロックしてすべてのモードで強制するのではなく、セットされているときは M モード専用、セットされていないときは S/U モード専用としてルールをマークする
- これまで予約されていたエンコーディングpmpcfg.RW=01とエンコーディング
pmpcfg.LRWX
=1111は、Shared-Regionをエンコードする - M-mode-onlyルールはMモードで強制され、SupervisorモードやUserモードでは拒否される。また、
mseccfg.RLB
が設定されていない限り、PMPのリセットが行われるまで、関連するコンフィグレーションやアドレスレジスタの変更が無視されるようにロックされる。S/U-mode-onlyルールはSupervisorおよびUserモードに適用され、Mモードでは拒否される。Shared-Regionルールはすべてのモードに適用されるが、pmpcfg.L
ビットおよびpmpcfg.X
ビットによる制限がある。 pmpcfg.L
が設定されていないShared-Regionルールは、MモードとS/Uモード間のデータ共有に使用されるため、実行は許可されない。Mモードはその領域への読み書きのアクセス権を持ち、S/Uモードはpmpcfg.X
が設定されていなければ読み書きのアクセス権、pmpcfg.X
が設定されていれば読み書きのアクセス権を持つ。pmpcfg.L
が設定されているShared-Regionルールは、M-modeとS/U-modeの間でコードを共有するために使用することができるので、書き込みはでききない。M-modeとS/U-modeの両方が領域の実行アクセス権を持ち、pmpcfg.X
が設定されていればM-modeも読み取りアクセス権を持つ。ルールはロックされたままなので、関連するコンフィグレーションやアドレス・レジスタを変更しても、mseccfg.RLB
が設定されていない限り、PMPのリセットまで無視される。pmpcfg.LRWX
=1111のエンコーディングは、MモードとS/Uモードの間でデータを共有する場合に使用できる。この場合、どちらのモードもその領域に対して読み取り専用のアクセスしかできない。ルールはロックされたままなので、関連するコンフィグレーションやアドレス・レジスタが変更されても、mseccfg.RLB
が設定されていない限り、PMPのリセットまで無視される。- 実行可能権限でMモード専用またはロックされた共有領域ルールを追加することはできず、そのようなpmpcfgの書き込みは無視され、pmpcfgは変更されまない。の制限は、起動時などに
mseccfg.RLB
を設定することで一時的に解除できる。
- 実行可能権限でMモード専用またはロックされた共有領域ルールを追加することはできず、そのようなpmpcfgの書き込みは無視され、pmpcfgは変更されまない。の制限は、起動時などに
- マシンモードの特権を持つコードの実行は、実行可能な特権を持つ M モードオンリールールまたはロックされた Shared-Region ルールが一致するメモリ領域からのみ可能。
mseccfg.MML
が設定されていない場合、pmpcfg.RW=01の組み合わせは、将来の標準的な使用のために予約されたままとなる。