2

コンパイルされたプログラムを実行するためのサンドボックス仮想マシンを作成したいと思います。私の目標は、そのプログラムを他のオペレーティングシステムから分離し、その実行を制御して、ホストコンピューターに有害なことを何もできないようにすることです。

私はそれを仮定します:

  • 実行されたプログラムはPortableExecutable形式にコンパイルされ、マシンコードであり、バイトコードやCLR用ではありません。
  • 実行されたプログラムは、プリンター、スキャナーなどの周辺機器との通信を許可されておらず、GUIを使用していません。
  • 実行されたプログラムの主なタスクは、ローカルファイルに保存されているデータ(計算など)を処理し、その結果を別のローカルファイルに入れることです。
  • 実行されたプログラムはオペレーティングシステムと直接通信できないようにする必要があります。すべての要求は仮想マシンで処理する必要があり、オペレーティングシステムに損傷を与える可能性のある要求はすべてブロックする必要があります。

サンドボックス仮想マシンのアーキテクチャと操作の私の概念:

  • アプリケーションは、プロセッサ、メモリ、ファイルのI / O操作、
  • コンパイルされたファイルを読み取り、実行可能コードを仮想メモリにロードするモジュールがあります。
  • 次に、仮想プロセッサは最初のバイトから処理を開始し、オペコード、引数を読み取り、必要に応じてメモリからロードし、コマンドを実行して結果を適切な場所に配置し、必要に応じて仮想フラグを設定し、プログラムが実行されるまで次のコマンドを読み取ります最後まで。

あなたはどう思いますか:それは良いコンセプトですか?それを改善するために何を変えますか?

4

3 に答える 3

1

完全なマシンをシミュレートすることは、ネイティブコードを実行するための非常に遅い方法のように思えます。単一のネイティブ命令に対して、ロード、ルックアップ、実行、保存などの多くの操作。

少なくともいくつかのコードブロックをネイティブに実行しようとします。次のコードを考えてみてください。

int sum = 0;
for (int i = 0; i < 10; i++)
{
    sum += i;
}

このコードは、仮想マシンでネイティブに実行しても完全に安全です。仮想マシンコードにリターンコールを挿入することを確認してください。

しかし、私はさらに一歩進んで、library/os呼び出しを除くすべてのコードをネイティブに実行しようとしました。サンドボックス化されたアプリケーションをロードする前に、ファイルをスキャンして、すべての「危険な」呼び出しを仮想マシンのハンドラーの呼び出しに置き換えます。
コード

printf("Hello World\n");

ライブラリへの呼び出しに置き換えられます

myVM_printf("Hello World\n");

その後、プログラム全体をネイティブの速度で実行し、仮想マシン内のすべての危険なコードを処理できます。

于 2010-10-30T07:45:52.830 に答える
1

プロセスの権利を調整するだけで、多くのことを達成できます。少なくともWinNTの下では、かなりきめ細かいプロセス権限があります。また、Chromeで使用されているGoogleのサンドボックスはオープンソースであると思います。

于 2010-10-30T16:34:44.210 に答える
0

これは、SELinuxやMicrosoftのApp-Vなどの既存のサンドボクシングで実現できるようです。

また、周辺機器へのアクセスが問題になる可能性があります。周辺機器が部屋のカメラまたはマイクの場合はどうなりますか?ハッカーが終わりのない物語を虹のテキストで印刷してお金を無駄にしたい場合はどうなりますか?

于 2010-10-30T00:07:08.343 に答える