2

まあ、それは一種のウェブサーバーです。

.dll(.a)ファイルをロードし、プログラムモジュールとして使用します。

私は再帰的にディレクトリを調べ、これらのライブラリの「_main」ファンクタを、特別な「.m」ファイルのメンバーである名前の下のstd::mapに配置します。

メインディレクトリには、ホストごとにいくつかのディレクトリがあります。

問題は、「fopen」またはこのホストディレクトリ外のディレクトリで動作する他のファイルシステム関数の使用を防ぐ必要があることです。

私がそれを見ることができる唯一の方法-stdio.hのワープを書く(つまり、ファイル名チェックのあるs_stdio.hを書く)。

それはデーモンであり、システムコールをキャッチし、何かを識別する可能性がありますか?

追加

さて、そのような状況についてはどうでしょうか。私はソースのみをアップロードし、チェック後にサーバー上で直接コンパイルしますか?ええと、それが私が見つけた唯一の方法です(1つのアドレス空間内にすべてを保持している)。

4

2 に答える 2

4

C ++は低水準言語であり、DLLはマシンコードにコンパイルされているため、何でも実行できます。標準ライブラリ関数をラップした場合でも、コードはシステムコールを直接実行して、ラップした機能を再実装できます。

おそらく、このようなDLLを効果的にサンドボックス化する唯一の方法は、ある種の仮想化であるため、コードは直接実行されるのではなく、仮想マシンで実行されます。

より簡単な解決策は、サンドボックス化する必要のあるロード可能なモジュールに高級言語を使用することです。一部の高級言語(Lua、Java)はサンドボックス化に優れていますが、その他の言語はそれほど優れていません(たとえば、AFAIKには現在、Python用に実装された公式の制限付き環境はありません)。

于 2010-02-28T17:24:01.337 に答える
1

モジュールをロードしている場合は、コードに対して静的分析を実行して、呼び出しているAPIを確認し、チェックアウトしない場合(つまり、疑わしい呼び出しを行った場合)はリンクを拒否できます。 。

そうは言っても、これを行うのは大変な作業であり、移植性はあまり高くありません。

于 2010-02-28T17:27:33.070 に答える