8

Let's say there is a server on the internet that one can send a piece of code to for evaluation. At some point server takes all code that has been submitted, and starts running and evaluating it. However, at some point it will definitely bump into "os.system('rm -rf *')" sent by some evil programmer. Apart from "rm -rf" you could expect people try using the server to send spam or dos someone, or fool around with "while True: pass" kind of things.

Is there a way to coop with such unfriendly/untrusted code? In particular I'm interested in a solution for python. However if you have info for any other language, please share.

4

7 に答える 7

6

CPython の実装に特化していない場合は、これらの目的でPyPy [wiki]を参照することを検討してください。この Python の方言により、透過的なコード サンドボックスが可能になります。

それ以外の場合は、またはに対応するグローバル/ローカル引数で偽の__builtin__およびを提供できます。__builtins__execeval

さらに、実際の辞書の代わりに辞書のようなオブジェクトを提供し、信頼できないコードがその名前空間で何をするかを追跡できます。

さらに、実際にそのコードをトレースすることができます (sys.settrace()他のコードが実行される前に、制限された環境内で発行されます)。

chrootどの解決策も受け入れられない場合は、OS レベルのサンドボックスunionfs( multiprocess.

于 2010-10-12T00:03:04.470 に答える
2

それを行うpysandboxを確認できますが、余裕があればVMルートの方がおそらく安全です。

于 2010-10-12T00:32:03.273 に答える
2

このようなものを実行する環境を仮想化することを真剣に検討します。これにより、実装するメカニズムが何であれ、仮想マシンの構成によってもう一度ファイアウォールで保護できるようになります。

ユーザー数と、テスト/実行する予定のコードの種類は、選択肢にかなりの影響を与えます。ファイルやデータベースへのリンクや計算負荷の高いタスクの実行が想定されておらず、プレッシャーが非常に低い場合は、ファイル アクセスを完全に防止し、プロセスが強制終了される前にプロセスに時間制限を課すだけで、ほぼ問題ありません。送信に高すぎるまたは悪意があるとフラグが付けられました。

テストするコードが任意の Django 拡張機能またはページである場合、おそらく多くの作業が必要になります。

于 2010-10-11T23:43:17.237 に答える
2

「悪い」の定義を明確にするのは非常に難しいため、これに対する絶対的な解決策を提供することは不可能です。

ファイルを開いて書き込むことは悪いことですか、それとも良いことですか? そのファイルが /dev/ram の場合はどうなりますか?

行動の特徴をプロファイリングしたり、悪い可能性のあるものをブロックしたりできますが、決して勝つことはできません. Javascript はその良い例です。人々は自分のコンピューターで常に任意の JavaScript コードを実行しています。サンドボックス化されているはずですが、あらゆる種類のセキュリティの問題やエッジ条件が発生します。

挑戦するなと言っているのではありません。プロセスから多くのことを学ぶことができます。

多くの企業は、「悪いコード」を検出する方法を理解するために何百万ドルも費やしました (Intel は McAffee に数十億ドルを費やしました)。そして、McAffe アンチウイルスを実行しているマシンは毎日ウイルスに感染しています。Python コードは C ほど危険ではありません。システム コールを実行したり、C ライブラリにバインドしたりできます。

于 2010-10-11T22:37:54.387 に答える
1

SydboxGentoo のサンドボックスなどの一般的な sanbox を試すことができます。それらは Python 固有のものではありません。

どちらも、一部のディレクトリへの読み取り/書き込みを制限するように構成できます。Sydbox はソケットをサンドボックス化することさえできます。

于 2010-10-11T21:56:42.227 に答える
0

私が間違っていない限り(そして私は間違いないかもしれませんが)、これがGoogleがAppEngine用にPythonを変更した方法の背後にある理由の多くです。あなたは彼らのサーバーでPythonコードを実行していますが、彼らはファイルに書き込む機能を削除しました。すべてのデータは「nosql」データベースに保存されます。

これはあなたの質問に対する直接の答えではありませんが、この問題が特定の状況でどのように処理されたかの例です。

于 2010-10-12T00:22:06.490 に答える
0

このような修正は非常に難しいと思います。仮想環境でのプログラミングの利点について出席した講義を思い出します。あなたが事実上それをやっているなら、彼らがそれを盗聴するならそれはクールです. しばらく解決しません True: パスしますが、 rm -rf / は関係ありません。

于 2010-10-12T00:14:01.907 に答える