0

私は Node.js を学んでおり (-awesome-)、それを使用して次世代の MUD (オンライン テキスト ベースのゲーム) を作成するというアイデアをいじっています。このようなゲームでは、さまざまなコマンド、スキル、呪文などを使用して悪者を倒し、何百もの部屋や場所を走り回って探索します。一般的に言えば、これらの機能はかなり静的です。通常、新しい呪文を作成したり、新しい部屋を構築したりすることはできません。ただし、スペルや部屋などを定義するコードをユーザーが編集できる MUD を作成したいと考えています。

これには明らかなセキュリティ上の懸念があります。悪意のあるユーザーは、たとえば、子プロセス「rm -r /」をフォークする JS をアップロードする可能性があります。私はゲームの内部を保護することにはあまり関心がありません (可能な限りセキュリティを確保していますが、すべてが公開されている言語でできることは限られています)。私は常にコードの変更を wiki スタイルで追跡し、サーバーをクラッシュさせたり、9000 を超えるパワーを上げたりするユーザーを罰することができます。しかし、サーバーの OS をしっかりと保護したいと考えています。

私は同様の質問に対する他の SO の回答を調べましたが、ほとんどの人はサンドボックス バージョンの Node.js を実行することを提案しています。ファイルシステム、システムコマンド、機密性の高いコアモジュールなどと対話する必要があるMUDのエンジンと対話するためにユーザー定義のJSが必要なため、これは私の状況では機能しません(少なくともうまくいきません)。仮説的には、これらすべてのトランザクションをエンジンで JSON エンコードし、サンドボックス化されたプロセスに送信して処理し、JSON 経由でエンジンに返すことができます。別のプロセスに渡されます。同期であることは言うまでもありませんが、これは避けたいと思います。

したがって、単一の Node モジュールを「サンドボックス化」する方法があるかどうか疑問に思っています。私の考えでは、そのようなサンドボックスは単に「require」機能を無効にする必要があり、すべてが至福になるでしょう。それで、Google/SO で何も見つからなかったので、自分で質問することにしました。

4

1 に答える 1

1

さて、今日はもう少し考えてみたところ、基本的な戦略ができたと思います。

var require = function(module) {
    throw "Uh-oh, untrusted code tried to load module '" + module + "'";
}
var module = null;
// use similar strategy for anything else susceptible

var loadUntrusted = function() {
    eval(code);
}

基本的に、ローカル スコープで変数を使用してノード API を評価済みコードから隠し、コードを実行します。脆弱性のもう 1 つのポイントは、信頼されていないコードに渡される Node API からのオブジェクトです。たとえば、バッファが信頼できないオブジェクト/関数に渡された場合、そのオブジェクト/関数はプロトタイプ チェーンを上っていき、キー バッファ関数を独自の悪意のあるバージョンに置き換えることができます。これにより、ファイル IO やシステム コマンドのパイプなどに使用されるすべてのバッファがインジェクションに対して脆弱になります。

したがって、これを成功させるには、信頼できないオブジェクトを独自の世界に分割する必要があります。外部の世界はそのオブジェクトのメソッドを呼び出すことができますが、外部の世界のメソッドを呼び出すことはできません。もちろん、この戦略に関して他に考えられるセキュリティ上の脆弱性があれば、誰でも気軽に教えてください。

于 2013-07-10T01:06:23.230 に答える