Linuxの新しい mseal システムコールの詳細分析
mseal は Linux カーネル 6.10 バージョンで導入された新しいシステムコールで、メモリ保護のための「メモリ封印」機能を提供する。
- このシステムコールは、プログラム実行中にメモリ領域を不正な変更から不変にし、攻撃者がメモリ権限を変更したりメモリレイアウトを操作したりできないようにする。
mseal はリモート攻撃者によるコード実行を防ぐためのものであり、機密データをメモリに保存するローカル攻撃者への防御を目的とした既存の memfd_create および memfd_secret とは異なる。
mseal の動作方式
mseal の関数シグネチャはシンプルで、開始アドレスと長さを受け取り、該当するメモリ領域を封印する。
do_mseal 関数はメモリ領域をロックし、check_mm_seal と apply_mm_seal を通じてメモリ領域の有効性を検査して封印する。
- 封印されたメモリ領域は、
mprotect、munmap、mremap などのシステムコールによって権限変更、マッピング解除、サイズ変更などを行えない。
mseal が防御する攻撃手法
- NX 強化:
mseal は VMA の実行権限を変更できないようにし、シェルコードベースの攻撃を防ぐ。
- マッピング解除ベースのデータ専用攻撃の緩和:
mseal はメモリ領域の任意の解除および再マッピングを防ぎ、データ専用攻撃を阻止する。
mseal を活用したソフトウェア強化
mseal はソフトウェアの特定のメモリ領域を封印することで、セキュリティを強化できる。
- 開発者は
mseal を使用して、信頼できないデータが存在しうるメモリ領域を選択的に封印できる。
- glibc との統合が進むにつれて、自動封印機能が追加される可能性がある。
GN⁺ のまとめ
mseal は Linux カーネルに新たに導入されたセキュリティ機能であり、メモリ領域を封印してリモート攻撃者によるコード実行を防ぐ。
- このシステムコールは既存のメモリ保護方式とは異なり、メモリ権限の変更およびマッピング解除を防ぐことで、データ専用攻撃を阻止する。
mseal の導入はソフトウェアセキュリティの強化に重要な役割を果たし、glibc との統合を通じて、より多くのユースケースが期待される。
- 類似機能を持つ他のプロジェクトとして、メモリ保護のための
memfd_create および memfd_secret がある。
1件のコメント
Hacker Newsのコメント
カーネルメーリングリストで「熱い議論」があったと言及されている。内部事情に詳しい人が異論や懸念を要約してくれないか気になっているというコメントがある。メーリングリストはあまりに強烈なので避ける傾向があるという
Chrome はこの呼び出しを必要としているが、攻撃者が別のフラグで再マップできてしまうため、seal されたページを解除できない
mseal()とその後の記事へのリンクが共有されている現代の (x86_64) アーキテクチャには安全なプログラミングを促進する多くの機能があるにもかかわらず、OS がこうした呼び出しを実装しなければならないことに悲しさを感じる
msealシステムコールをLD_PRELOADのトリックで無効化できるか、という質問がある記事中の
mseal()のプロトタイプは文法的に正しくない。第1引数はunsigned start addrではなくunsigned long start_addrであるべきだOpenBSD にはかなり前からこの機能があった。なぜ Linux では今になってようやく導入されるのか、という疑問が出ている