Node.jsでユーザーが送信した(悪意のある)スクリプトを安全に実行するためのオプションは何ですか?つまりコードが機密データやAPIにアクセスできない環境では?
vm.runInNewContext(userScript, {})
は魅力的な出発点です...しかし、そこには 既知の問題 があるようです。
sandbox module は面白そうに見えますが、runInNewContext()
も使用しているので、少し気になります。
信頼できないコードは常に別のプロセスで実行する必要があります。これはまさにサンドボックスモジュールが行うことです。単純な理由は、vm.runInNewContext('while(true){}', {})
がノードをフリーズすることです。
それは別のプロセスを生成することから始まり、後でそのstdoutでJSONにシリアル化された結果を送信します。親プロセスは、子の動作に関係なく実行を継続し、タイムアウトをトリガーできます。
信頼できないコードは、 strict mode でクロージャにラップされます(通常のJavaScriptでは、arguments.callee.caller
を使用してスコープ外のデータにアクセスできます)。最後に、ノードのAPIへのアクセスを防ぐために、非常に制限されたglobal
オブジェクトが渡されます。信頼できないコードは基本的な計算しか実行できず、ファイルやソケットにアクセスできません。
サンドボックスのコードをインスピレーションとして読む必要がありますが、そのまま使用することはお勧めしません。
セキュリティを強化するために、 setuid-sandbox の使用を検討することもできます。これは、タブプロセスがファイルシステムにアクセスするのを防ぐためにGoogle Chromeで使用されるコードです。ネイティブモジュールを作成する必要がありますが、これ 例 は簡単に思えます。
vm2と呼ばれるgithubの新しいモジュール があり、特にNode.JSアプリケーションでこれらの懸念のいくつかに対処します。たぶんそれは私がちょうどしたように、他の何人かがそれを見つけるのを助けるでしょう。
Mediumでこれ article をチェックしてみてください。