JVMおよびCLR上のプログラムは危険な操作にデフォルトでアクセスできるため、スタック検査が必要です。したがって、災害を防ぐために何かを行う必要があります。たとえば、信頼できないプログラムはI / Oライブラリを参照して呼び出すことができます。
using IO;
...
IO.DeleteFile("/home/foo/bla");
したがって、危険な操作が行われるたびに、それが許可されているかどうかを確認する必要があります。スタック検査では、誰が何にアクセスできるかを理解することは一般に複雑です。また、インライン化や末尾呼び出しなどの最適化も困難になります。
優れたメカニズムは、そもそも各プログラムに危険な操作への自動アクセスを与えないことです。このモデルでは、IOライブラリをインポートする方法はありません。IOライブラリにアクセスする唯一の方法は、他の誰かがあなたにそれを与えた場合です。これは機能セキュリティと呼ばれます。概要はここにあります。
代わりに、前のプログラムを次のように記述します。
Main(IOLibrary IO){
IO.DeleteFile("/home/foo/bla");
}
IOライブラリはプログラムのエントリポイントへのパラメータであり、これは機能と呼ばれます(この場合、IOを実行するために何らかの機能を使用するため)。このプログラムを実行できるようにするには、自分でIO機能にアクセスし、を呼び出してプログラムを実行する必要がありますMain(ourIOlibrary)
。信頼されていないプログラムを実行している場合は、ファイルを削除するためにそのライブラリを使用する可能性があるため、IOライブラリを渡さないだけです。場合によっては、信頼できないプログラムにファイルシステムへの限定的なアクセスを許可する必要があります。その場合、特定のディレクトリへのアクセスのみを許可する独自のIOライブラリの周りにラッパーを作成し、それを完全なIOライブラリではなく信頼できないプログラムに渡します
したがって、IO機能を必要とするプログラムを呼び出すためにIO機能が必要な場合、それは、プログラムを呼び出すものすべてが、それを提供できるようにIO機能にアクセスする必要があることを意味します。では、IO機能はどこから来たのでしょうか。さて、やがてコンピュータを操作している人間がプログラムを呼び出したところがあります。この人間はすべてのシステム機能にアクセスできるため、IO機能を渡すことができました。この人間が実行しているプログラムを信頼していない場合、IO機能は渡されません。
おそらく他の種類の機能を簡単に想像できます。インターネットアクセス、画面上に描画するものへのアクセスなど。たとえば、セキュリティで保護されたブラウザプラグインシステムは、定義済みの四角形にグラフィックスを描画することのみを許可する信頼できないプラグインにグラフィックス機能を与える場合があります。ページ上。