Steffenの答えから1点拡大します。信頼できない入力を消費し、エクスプロイトリスクと見なされるコードがある場合は常に-信頼できないソースからのファイルを消費するイメージライブラリなど-そのコードのサンドボックス化を検討する必要があります。これを行うにはいくつかの方法があり、言語、OS、CPUアーキテクチャなどによって異なりますが、最も一般的な方法をいくつか次に示します。
- 特別な低特権のユーザーアカウントとしてコードを実行します。このユーザーアカウントは、ジョブの実行に必要なもの以外には、読み取りまたは書き込みアクセス権がありません。最近のすべての汎用オペレーティングシステムがこれをサポートしていますが、そのようなユーザーを十分に制限されたアクセスでセットアップし、ファイルなどを安全に引き渡すのは簡単ではありません。また、他のほとんどのオプションよりも、このような手法によって公開される攻撃面が多くなります。
- 他のプログラムとの制御された相互作用を可能にしながら、有害な動作を防止するOS提供の低い特権のサンドボックスでコードを実行します。これは非常にOS固有のものですが、最近のほとんどのOSは何らかの形でサポートしています。 Windows 8以降でAppContainers(「モダン」Windowsストアアプリで使用されるものなど)を使用できます。OSXでアプリサンドボックスを使用できます。Linuxやその他のUnixライクなOSでコンテナーを使用できます。jailを使用できます。これは通常、* BSDなどでサポートされます。これは、最も単純で最もサポートされているオプションの1つであり(Windows、Mac、Android、およびiOS開発ツールはすべて、開発者の労力をほとんど必要とせずに、このようなサンドボックスの作成をサポートします)、優れたパフォーマンスを発揮しますが、プラットフォーム固有です。 Windows 7などでは機能しません。
- SELinuxやAppArmor(どちらもLinuxの場合)、chroot(ほとんどのUnixライクなOSで利用可能)、CreateRestrictedToken(Windows API)に加えて、次のような他のWindowsセキュリティ機能などのアクセス制限機能を使用して、このようなサンドボックスを手動で作成することもできます。必須の完全性管理。このアプローチは、真に安全に行うには多くの作業であり、依然としてプラットフォーム固有ですが、単にアクセスが制限されたユーザーアカウントを使用するよりもセキュリティが強化された非常に幅広いオペレーティングシステムで機能するように設定できます。 。これは、さまざまなシステムで多くのセキュリティを必要とするが、ChromeやIE7 +など)のように優れたパフォーマンスを必要とする一部のアプリがサンドボックス化される方法です。
- ホストへのアクセスが最小限でリソースが制限されている仮想マシンでコードを実行します。コードがVMを完全に引き継いでも、ホストはそのインスタンスを強制終了し、クリーンなイメージから新しいインスタンスを開始できます。これは、コンピューティングリソースは比較的高価ですが、セットアップが非常に簡単で、非常に優れたセキュリティを提供します。
- 言語レベルのサンドボックスを利用します。たとえば、Javaランタイムでは、コードで実行できることを制限する「SecurityManager」を作成できます。これにより、Javaアプレットサンドボックスが実装されます。 Javaアプレットのセキュリティの歴史を知っている人なら誰でもわかるように、実行されているコードがアクティブに悪意のある場合-システムを攻撃する方法が多すぎる場合は安全ではありませんすでにメモリセーフなJava言語で記述された悪意のないコードである場合、それは、コードが次のようなことを引き起こす可能性がある論理エラーから保護するためのまともな追加の多層防御です。攻撃者が選択した場所にファイルを書き込む。