mem-isolate: フォークベースのメモリ安全性には深刻な制限があると専門家が警告

BigGo Editorial Team
mem-isolate: フォークベースのメモリ安全性には深刻な制限があると専門家が警告

Rust コミュニティでは現在、最近リリースされた mem-isolate ライブラリについて議論が行われています。このライブラリは、フォークされたプロセスで潜在的に危険な操作を隔離する技術を通じて、安全でないコードを安全に実行することを約束しています。このアプローチは巧妙ですが、セキュリティおよびシステムプログラミングの専門家たちは、その制限と潜在的な誤用について重大な懸念を示しています。

mem-isolate は、POSIX の fork() システムコールを介して作成された隔離された子プロセスで関数を実行することで動作します。このアプローチは親プロセスのメモリのコピーを作成し、安全でない操作が元のプロセスのメモリ空間に影響を与えずに実行できるようにします。関数が完了すると、結果はパイプを通じて親プロセスにシリアル化され、子プロセスは終了します。

セキュリティの制限

コミュニティのセキュリティ専門家は、mem-isolate が名前が示すような安全性レベルを実際には提供していないと指摘しています。このライブラリは、空間的および時間的なメモリ安全性保証の両方を要求する Rust の安全なコードの定義を満たしていません。

「これは安全な Rust における安全の定義を満たしていないと思います:安全とは単に空間的メモリエラーによってクラッシュしないということだけではなく、コードが実際に空間的かつ時間的にメモリ安全であることを意味します。」

セキュリティの観点から見ると、提供される隔離は表面的なものです。フォークされたプロセスはメモリ内のあらゆる秘密を含むプログラム状態の完全なコピーを維持します。これは、悪用可能な安全でないコードが隔離された環境内でも機密情報にアクセスできることを意味します。さらに、子プロセスは親と同じ権限を維持するため、コード実行の脆弱性は依然として悪用可能です。

mem-isolateの主な制限事項:

  • POSIXシステム(Linux、macOS、BSD)でのみ動作
  • 関数呼び出しごとに約1.9msのオーバーヘッドが発生(直接呼び出しの1.5nsと比較)
  • プロセス間でのデータ返却時にシリアル化が必要
  • マルチスレッドアプリケーションでは潜在的に危険
  • クラッシュを引き起こさない攻撃を防止できない
  • 子プロセスは親プロセスと同じ権限とメモリへのアクセス権を持つ
  • ミューテックスを保持したままフォークするとデッドロックを引き起こす可能性がある

フォークに関する技術的懸念

システムプログラミングの専門家は、特にマルチスレッドアプリケーションでは、このユースケースにおいて fork() が問題のある API であると強調しています。プロセスがフォークされると、ミューテックスやロックの状態を含む全メモリ状態が複製されます。フォーク時にいずれかのスレッドがロックを保持していた場合、子プロセスはデッドロックを経験する可能性があります。

印刷やメモリ割り当てのような単純な操作でさえ、フォークされたプロセスでフリーズを引き起こす可能性があります。コールバックが完了する前にフラッシュされないユーザースペースバッファは失われます。これらの問題により、mem-isolate は複雑なアプリケーションで潜在的に危険になる可能性があります。

パフォーマンスへの影響

このライブラリは大幅なパフォーマンスオーバーヘッドを導入し、ベンチマークによると execute_in_isolated_process() は直接関数呼び出しの1.5ナノ秒と比較して約1.9ミリ秒かかり、100万倍以上遅くなっています。著者はこの制限を「コードを1ミリ秒遅く実行する」というユーモアのある発言で認めていますが、コミュニティメンバーはこのオーバーヘッドが多くのユースケースでライブラリを実用的でなくすると指摘しています。

多くの開発者はパフォーマンス最適化のために特に安全でないコードを使用するため、そのようなコードを大幅なオーバーヘッドを導入するメカニズムでラップすることは、元の目的を無効にします。あるコメンテーターが指摘したように、このアプローチを広範囲に使用すると、並列処理のためにフォークに大きく依存する Python や Ruby のような言語に対する Rust のパフォーマンス上の利点が無効になる可能性があります。

パフォーマンスベンチマーク:

  • 直接関数呼び出し: 約1.5ナノ秒
  • fork() + wait: 約1.7ミリ秒
  • execute_in_isolated_process(): 約1.9ミリ秒

実用的なアプリケーション

その制限にもかかわらず、一部の開発者は特定のシナリオにおいて mem-isolate に価値を見出しています。このライブラリは、特に C ライブラリとインターフェースする場合など、本質的に安全でない改善できないサードパーティのコードを扱う際に役立つ可能性があります。これらのケースでは、提供される隔離は、特にパフォーマンスが重要でないパスにおいて、安全性を高めるための許容できるトレードオフかもしれません。

しかし、ほとんどのアプリケーションでは、専門家はより堅牢な隔離アプローチを推奨しています。制限された IPC チャネルと OS レベルのサンドボックス API を備えた適切に設計されたマルチプロセスアーキテクチャは、より強力なセキュリティ保証を提供します。Chrome のようなブラウザエンジンは、単純なプロセス隔離ではなく、このアプローチを使用しています。

mem-isolate を巡る議論は、システムプログラミングにおける安全性、パフォーマンス、実用性のバランスをとる継続的な課題を浮き彫りにしています。メモリ安全性に対する革新的なアプローチは Rust エコシステムで歓迎されますが、確立されたベストプラクティスとセキュリティモデルに照らして慎重に評価される必要があります。

参考: mem-isolate: Run unsafe code safely