私は現在、Linux バイナリを互いに分離するサンドボックス ソフトウェアを 14.04 マシンで使用しています (AppArmor とは異なる特殊なタイプの名前空間分離を使用)
現在、サンドボックスを呼び出す方法は次のとおりです。
/usr/local/bin/sandbox /path/to/binary --optional-arguments
私の問題は、特定の任意のバイナリを呼び出してサンドボックス内で実行したいということですそれなし/usr/local/bin/sandbox
シェルコマンドの先頭にその部分を追加する必要があります。つまり:
/usr/local/bin/sandbox /path/to/binary --optional-arguments --> *new process*
次のように変わります:
/path/to/binary --optional-arguments --> *binfmt-misc* --> *new process*
binfmt-misc のおかげで簡単にできると思いましたが、ドキュメントを読んでみると、ファイル自体のマジック ビットまたはファイル拡張子のいずれかを介してインタープリターを要求することしかサポートされていないようです。この特定のケースでは、これらのいずれも実行できないため、サンドボックスで起動したい特定のバイナリに拡張属性を指定できるオプションを binfmt-misc で探しました。これにより、binfmt-misc は、これらのバイナリを/usr/local/bin/sandbox
「インタープリター」で実行する必要があることを判断できます。ただし、そのような機能はまだ見つかっていません。
サンドボックスを自動的に使用して、自分のコンピューターと同じアーキテクチャ用にコンパイルされた、拡張子のない任意の ELF バイナリを起動する方法はありますか?
答え1
binfmt-misc と xattrs を使ってこれを行う方法はわかりませんが、別のアプローチを提案します。試したことはありませんが、なぜ機能しないのかわかりません。
アイデアとしては、ユニオンマウントサンドボックスを呼び出すラッパー スクリプトによって実際のバイナリを非表示にします。上位ディレクトリの読み取りが主に行われ、シャドウされていないファイルへの書き込みが下位ディレクトリに行われるユニオン マウントが必要ですが、これはすべてのユニオン マウント システムでサポートされているわけではありません。特に、これは Linux カーネルに組み込まれている OverlayFS を除外します。
汎用ラッパー スクリプトを記述します。
#!/bin/sh
exec /usr/local/bin/sandbox "${0#/sandboxed}" "$@"
ディレクトリを作成し/sandbox
、ルートファイルシステムをシャドウするユニオンマウントを作成します。アウフス(Ubuntu:aufs-tools
) は残念ながら最近廃止されましたが、もっと良い選択肢があるかもしれません。
mount -t aufs -o br:/,br:/sandbox aufs-sandbox /
サンドボックス化する実行可能ファイルごとに、/sandbox/path/to/foo
ラッパー スクリプトにリンクします (/path/to
の下に必要なディレクトリを作成した後/sandbox
)。