web-dev-qa-db-ja.com

node.jsサンドボックスでユーザーが送信したスクリプトを安全に実行するにはどうすればよいですか?

Node.jsでユーザーが送信した(悪意のある)スクリプトを安全に実行するためのオプションは何ですか?つまりコードが機密データやAPIにアクセスできない環境では?

vm.runInNewContext(userScript, {})は魅​​力的な出発点です...しかし、そこには 既知の問題 があるようです。

sandbox module は面白そうに見えますが、runInNewContext()も使用しているので、少し気になります。

43
broofa

信頼できないコードは常に別のプロセスで実行する必要があります。これはまさにサンドボックスモジュールが行うことです。単純な理由は、vm.runInNewContext('while(true){}', {})がノードをフリーズすることです。

それは別のプロセスを生成することから始まり、後でそのstdoutでJSONにシリアル化された結果を送信します。親プロセスは、子の動作に関係なく実行を継続し、タイムアウトをトリガーできます。

信頼できないコードは、 strict mode でクロージャにラップされます(通常のJavaScriptでは、arguments.callee.callerを使用してスコープ外のデータにアクセスできます)。最後に、ノードのAPIへのアクセスを防ぐために、非常に制限されたglobalオブジェクトが渡されます。信頼できないコードは基本的な計算しか実行できず、ファイルやソケットにアクセスできません。

サンドボックスのコードをインスピレーションとして読む必要がありますが、そのまま使用することはお勧めしません。

  • コードは古くなり、7か月間更新されていません。
  • ノードの子プロセスモジュールは、必要な機能のほとんど、特に child_process.fork() をすでに提供しています。
  • Child_process.forkによって提供されるIPCチャネルの方が、おそらくパフォーマンスが優れています。

セキュリティを強化するために、 setuid-sandbox の使用を検討することもできます。これは、タブプロセスがファイルシステムにアクセスするのを防ぐためにGoogle Chromeで使用されるコードです。ネイティブモジュールを作成する必要がありますが、これ は簡単に思えます。

31
Laurent Perrin

vm2と呼ばれるgithubの新しいモジュール があり、特にNode.JSアプリケーションでこれらの懸念のいくつかに対処します。たぶんそれは私がちょうどしたように、他の何人かがそれを見つけるのを助けるでしょう。

12
Alan Mimms

Mediumでこれ article をチェックしてみてください。

0
Pål Thingbø