2 ポイント 投稿者 GN⁺ 2024-10-27 | 1件のコメント | WhatsAppで共有

Linuxの新しい mseal システムコールの詳細分析

  • mseal は Linux カーネル 6.10 バージョンで導入された新しいシステムコールで、メモリ保護のための「メモリ封印」機能を提供する。
  • このシステムコールは、プログラム実行中にメモリ領域を不正な変更から不変にし、攻撃者がメモリ権限を変更したりメモリレイアウトを操作したりできないようにする。
  • mseal はリモート攻撃者によるコード実行を防ぐためのものであり、機密データをメモリに保存するローカル攻撃者への防御を目的とした既存の memfd_create および memfd_secret とは異なる。

mseal の動作方式

  • mseal の関数シグネチャはシンプルで、開始アドレスと長さを受け取り、該当するメモリ領域を封印する。
  • do_mseal 関数はメモリ領域をロックし、check_mm_sealapply_mm_seal を通じてメモリ領域の有効性を検査して封印する。
  • 封印されたメモリ領域は、mprotectmunmapmremap などのシステムコールによって権限変更、マッピング解除、サイズ変更などを行えない。

mseal が防御する攻撃手法

  • NX 強化: mseal は VMA の実行権限を変更できないようにし、シェルコードベースの攻撃を防ぐ。
  • マッピング解除ベースのデータ専用攻撃の緩和: mseal はメモリ領域の任意の解除および再マッピングを防ぎ、データ専用攻撃を阻止する。

mseal を活用したソフトウェア強化

  • mseal はソフトウェアの特定のメモリ領域を封印することで、セキュリティを強化できる。
  • 開発者は mseal を使用して、信頼できないデータが存在しうるメモリ領域を選択的に封印できる。
  • glibc との統合が進むにつれて、自動封印機能が追加される可能性がある。

GN⁺ のまとめ

  • mseal は Linux カーネルに新たに導入されたセキュリティ機能であり、メモリ領域を封印してリモート攻撃者によるコード実行を防ぐ。
  • このシステムコールは既存のメモリ保護方式とは異なり、メモリ権限の変更およびマッピング解除を防ぐことで、データ専用攻撃を阻止する。
  • mseal の導入はソフトウェアセキュリティの強化に重要な役割を果たし、glibc との統合を通じて、より多くのユースケースが期待される。
  • 類似機能を持つ他のプロジェクトとして、メモリ保護のための memfd_create および memfd_secret がある。

1件のコメント

 
GN⁺ 2024-10-27
Hacker Newsのコメント
  • カーネルメーリングリストで「熱い議論」があったと言及されている。内部事情に詳しい人が異論や懸念を要約してくれないか気になっているというコメントがある。メーリングリストはあまりに強烈なので避ける傾向があるという

    • メカニズム自体は理にかなっているように見えるが、これがまだカーネルに存在していなかったことに驚いている
  • Chrome はこの呼び出しを必要としているが、攻撃者が別のフラグで再マップできてしまうため、seal されたページを解除できない

    • これはランタイムに割り当てられたページには使えないことを意味し、プロセスの全寿命にわたって保持するつもりでない限り利用できない
    • JS サンドボックスのようなメモリには使えないという意味なのか、という疑問が出ている
    • Chrome のメモリ/プロセス管理の仕組みに詳しくないので、なぜそれが問題にならないのか確信が持てない
  • mseal() とその後の記事へのリンクが共有されている

  • 現代の (x86_64) アーキテクチャには安全なプログラミングを促進する多くの機能があるにもかかわらず、OS がこうした呼び出しを実装しなければならないことに悲しさを感じる

    • 旧式システムをパッチで延命しようとする試みが、コンピューティングの進歩を妨げ、数十億人を危険にさらしている
    • アーキテクチャ上のバグは存在するが、ソフトウェアが現在の機能を適切に活用できていない
  • mseal システムコールを LD_PRELOAD のトリックで無効化できるか、という質問がある

  • 記事中の mseal() のプロトタイプは文法的に正しくない。第1引数は unsigned start addr ではなく unsigned long start_addr であるべきだ

  • OpenBSD にはかなり前からこの機能があった。なぜ Linux では今になってようやく導入されるのか、という疑問が出ている