アプリケーションを複数のプロセスで実現する際、プロセス間通信(IPC)が有用です。今回、ホスト内部での通信で生じるセキュリティ上のリスクを減らすためにどのような仕組みが用意されているかについて調べました。
1つのマシン上で動作する複数のプロセスが通信する際、通信のピア同士にプロセスとして親子関係がある場合は比較的扱いやすいです。そうでない一般の場合には IPC の形態と OS に依存してまちまちです。
Unix 環境ではホスト内部向けの通信のための方法として Unix domain socket があります。これに対し "Secure interprocess communication" という記事があり、getpeereid
という関数をカーネルが提供するべきと提案しています。これによって、通信のピアとなるプロセスの credential を取得できるようになります。
実際、この関数は FreeBSD や Mac OS X といった BSD ライクな OS に存在します。
同名の関数がない Linux ではどうかというと、やはり Unix domain socket 前提でこれに代わる仕組みが用意されています。getsockopt(2) で SO_PEERCRED
というソケットオプションを指定するとピアの credential を取得できます。
ではそもそも Unix domain socket のない Windows ではどうでしょうか。MSDN の "Interprocess Communications (Windows)" に紹介されているさまざまな IPC の形態のうち、ホスト内部向けでアクセスを制御することができる仕組みを持つものとして
が挙げられています。アクセス制御は Access Control Model に基づくものです。特に File mapping は効率的で、通信するデータをプロセスのメモリのブロックとして扱うため柔軟と言えそうです。
参考