注目★★★★★Lobsters
ARM64の謎のハング、NX bitがAndroid起動を救った
30秒で把握
- 1ARM64のCTR_EL0処理が投機的命令フェッチで端末停止を誘発
- 2Device属性はデータアクセスのみ抑止し命令フェッチを許可
- 3NX bit設定でMMIOへの投機的フェッチを防ぎAndroid起動に成功
要約
SonyaはARM64ハイパーバイザの開発中、CTR_EL0インターセプトを有効にすると端末が停止する原因を、NX bitの欠如による投機的命令フェッチだと突き止めた。ARMのDeviceメモリ属性は投機的なデータアクセスを防ぐが、命令フェッチは防がない。実行可能ページでは投機的フェッチがMMIO領域やアドレス0のBoot ROMに及び、システムが停止していた。メモリを非実行に設定すると、カーネルへのパッチなしでAndroidまで起動した。ARMではNX bitがセキュリティだけでなく、投機的命令アクセスを抑止する属性として機能する。
あなたへの影響
ARM64でハイパーバイザやMMIOを扱う開発者は、Device属性だけでなく実行権限も確認し、MMIO領域を非実行に設定してください。
推奨:NX bitはDEP(Data Execution Prevention)で使われる実行禁止属性です。