ARM Cortex-MのPXN(Privileged eXecute Never)領域について解説する
はじめに
ARM Cortex-MにはPXN(Privileged eXecute Never)という属性があります。今回はこの内容について解説します。
前提となる項目
本記事の前提となる項目は以下の3点です。
- Cortex-Mの状態遷移
- MPU(Memory Protection Unit)
Cortex-Mの状態遷移
ARM Cortex-Mでは動作モードとして
- スレッドモード
- ハンドラモード
という2つの状態が定義されている。詳細に関しては以下ページに記載されています。
その中のスレッドモード内に
- 特権モード
- 非特権モード
があります。
イメージとしては非特権モードが普通のアプリケーションで特権モードはOSが動作するモードです。
ちなみにハンドラモードはデフォルトで特権モード扱いです。
つまりモードの権限としては基本的には上から順に
- ハンドラモード(特権)
- スレッドモード(特権)
- スレッドモード(非特権)
の3段階があります。
MPU(Memory Protection Unit)
ARM Cortex-AやIntelの多くのCPUのようにLinuxやWindowsが動く多くのCPUではMMU(Memory Management Unit)が搭載されてます。ARM Cortex-Mではその縮小版というべきMPU(Memory Protection Unit)が搭載されています。これによりメモリの設定を行うことができます。
この設定レジスタの一部であるMPU Region Base Address Register(MPU_RBAR)を用いることで特権モードのみアクセスができる/できない、実行可能/実行不可能(eXecute Never領域=XN領域)が制御できます。
出典:https://documentation-service.arm.com/static/65816177b52744113be5e971?token=
この部分をうまく設定することで特権モードのみ実行できるコードというものを設定できます。
本題
先ほどまでは一般的なARM Cortex-Mの話です。CPUの動作モードには上下関係があり、基本的に権限が多いモードのほうができることが多いです。
実は一部のプロファイル(Cortex-M85/55)ではこれとは別にPXN(Privileged eXecute Never)というものが存在します。
これは特権モードでは実行できないという属性です。これがあると何が嬉しいかというとソフトウェアをよりセキュアにすることができます。よくある攻撃の例として非特権モードで侵入コードを潜り込ませこれを特権レベルで実行させるというものがあります。それに対してこの属性を侵入コードを潜りこまさせられそうな領域に付与しておくことで未然防止することができます。
設定方法としてはMPU内のMPU Region Limit Address Register(MPU_RLAR)内にPXNという部分がありここで設定可能です。
出典:https://documentation-service.arm.com/static/65816177b52744113be5e971?token=
まとめ
今回のようにARMマイコンには便利機能が様々にあります。このような機能を用いてシステムを効率的にそしてセキュアに開発していきましょう。
Discussion