信頼できないjavascriptコードをLinux+node.jsでサンドボックスモジュールを使用して実行しようとしていますが、壊れています。必要なのは、ユーザーがテキストを出力するjavascriptプログラムを作成できるようにすることだけです。他のI/Oは許可されておらず、プレーンなjavascriptのみが使用され、他のノードモジュールは使用されません。それが本当に不可能な場合、この種のタスクのために他にどのような言語を提案しますか?必要な最小限の機能セットは、いくつかの数学、正規表現、文字列操作、および基本的なJSON関数です。スクリプトは、たとえば5秒間実行された後、プロセスが強制終了されます。どうすればそれを達成できますか?
9 に答える
サンドボックスの基本的な考え方は、何かを行うにはグローバルとして事前定義された変数が必要であるため、スクリプトを設定解除するか、制御されたものに置き換えることでスクリプトを拒否すると、エスケープできなくなります。何も忘れない限り。
最初に deny require() を置き換えるか、制御されたものに置き換えます。プロセスと「グローバル」別名「ルート」を忘れないでください。難しいのは、何も忘れないことです。そのため、サンドボックスを構築した他の誰かに頼るのは良いことです;-)
パフォーマンス ヒットを許容できる場合は、適切な CPU とメモリ制限を備えた使い捨ての仮想マシンで JS を実行できます。
もちろん、VM ソリューションのセキュリティを信頼していることになります。通常の JS サンドボックスと併用することで、2 層のセキュリティを確保できます。
追加のレイヤーとして、サンドボックスをメイン アプリとは別の物理マシンに配置します。
私は現在、同様の問題に直面しており、サンドボックス モジュールについて悪いことしか読んでいません。
ノード環境に特別なものが必要ない場合は、PhantomJS や Chimera などのヘッドレス ブラウザを使用してサンドボックス環境として使用するのが最善の方法だと思います。
次の質問を自問してください。
- あなたは地球上で最も賢い人の一人ですか?
- Google、Mozilla、Kaspersky Labによる求人は退屈になるため、定期的に断りますか?
- 「信頼できないコード」は、あなたと同じ会社で働いている人々から来たのですか、それとも世界中の犯罪者や退屈なコンピューターの子供たちから来たのですか?
- node.jsに、サンドボックスからリークする可能性のあるセキュリティホールがないことを確認しますか?
- 完璧な100%エラーのないコードを書くことができますか?
- JavaScriptについてすべて知っていますか?
サンドボックスモジュールを使った実験ですでに知っているように、独自のサンドボックスを作成するのは簡単ではありません。サンドボックスの主な問題は、すべてを正しく行う必要があることです。1つの間違いがセキュリティを完全に台無しにするので、ブラウザ開発者は世界中のクラッカーと絶え間なく戦います。
とは言うものの、単純なサンドボックスは非常に簡単に実行できます。eval()
まず、 andのためにnode.jsからのものを使用できないため、独自のJavaScriptインタープリターを作成する必要がありますrequire()
(どちらもクラッカーがサンドボックスから脱出できるようにします)。
インタプリタは、解釈されたコードが、提供されたいくつかのグローバルシンボル以外のものにアクセスできないことを確認する必要があります。eval()
これは、たとえば関数が存在できないことを意味します(または、この関数が独自のJavaScriptインタープリターのコンテキストでのみ評価されることを確認する必要があります)。
このアプローチの欠点:多くの作業が必要であり、通訳を間違えると、クラッカーがサンドボックスを離れることがあります。
もう1つのアプローチは、コードをクリーンアップして、node.jsで実行することeval()
です。/eval\s*[(]//g
悪意のあるコード部分を削除するように、正規表現を大量に実行することで、既存のコードをクリーンアップできます。
このアプローチの欠点:間違いを犯しやすく、攻撃を受けやすくなります。たとえば、regexpとnode.jsが「空白」と見なすものとの間に不一致がある可能性があります。一部のあいまいなUnicode空白は、インタプリタによって受け入れられる可能性がありますが、攻撃者が実行できるようにする正規表現によっては受け入れられない可能性がありますeval()
。
私の提案:サンドボックスモジュールがどのように壊れているかを示す小さなデモテストケースを書いて、それを修正してもらいます。それはあなたに多くの時間と労力を節約し、サンドボックスにバグがある場合、それはあなたのせいではありません(まあ、少なくとも完全にではありません)。