SandboxJSにおけるCVSS 10.0脆弱性:サンドボックス脱出とRCEの脅威と対策

Tech

  • 専門家レベルの語彙(EDR, SIEM, サンドボックス脱出, プロトタイプ汚染など)を適切に使用する。

  • 箇条書きを多用し、視覚的なスキャンニングを容易にする。

  • 各セクションは結論から先に述べる。

  • 具体的なコード例を含め、開発者が即座にアクションを取れるようにする。

本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。

SandboxJSにおけるCVSS 10.0脆弱性:サンドボックス脱出とRCEの脅威と対策

【脅威の概要と背景】

SandboxJSにおいて、プロトタイプ汚染等を利用してサンドボックスを脱出し、ホストOS上で任意コード実行(RCE)を可能にするCVSS 10.0の脆弱性が4件報告されました(2024年)。

【攻撃シナリオの可視化】

攻撃者が悪意のあるスクリプトを注入し、サンドボックスの制限をバイパスしてホストのリソースにアクセスするプロセスは以下の通りです。

graph TD
    A["攻撃者"] -->|悪意のあるJSコードを送信| B("SandboxJS実行環境")
    B -->|プロトタイプ汚染/グローバルオブジェクト改ざん| C{"サンドボックス脱出"}
    C -->|制限をバイパス| D["ホストOSのprocess/fs等にアクセス"]
    D -->|任意コード実行| E["システム完全制圧/情報漏洩"]

この攻撃は、Node.jsのオブジェクト継承の仕組みを悪用し、サンドボックス外の constructorprocess オブジェクトを奪取することで発生します。

【安全な実装と設定】

サンドボックス環境を利用する際の脆弱なコード例と、推奨される安全な代替案を提示します。

1. 脆弱な実装(アンチパターン)

ユーザー入力をそのままサンドボックスに渡す構成は、エスケープの起点となります。

// 脆弱な例: SandboxJS等の脆弱なライブラリをそのまま使用
const Sandbox = require('sandboxjs-distorted'); // 例示用
const s = new Sandbox();

// ユーザー入力が直接実行されるため、プロトタイプ汚染によりホストのprocessを奪取される
s.run(userInputFromRequest); 

2. 安全な代替案(ハードニング)

Node.jsの vm モジュール(標準)ではなく、より強力な分離を提供する isolated-vm の使用や、プロセスレベルでの隔離を検討してください。

// 推奨例: isolated-vm を使用した強力な隔離
const ivm = require('isolated-vm');
const isolate = new ivm.Isolate({ memoryLimit: 128 });

async function safeExecute(userInput) {
    const context = await isolate.createContext();
    const jail = context.global;

    // 外部からアクセス可能な関数を厳格に制限
    await jail.set('log', new ivm.Reference(console.log));

    const script = await isolate.compileScript(userInput);
    return await script.run(context, { timeout: 1000 });
}

3. 運用上の保護策

  • 最小権限の原則: サンドボックスを実行するプロセスは、非特権ユーザー(nodeuser等)で実行し、書き込み権限を限定する。

  • リソース制限: CPU時間、メモリ使用量、ネットワークアクセスをOSレベル(cgroups/Docker)で制限する。

【検出と緩和策】

脆弱性が修正されるまでの間、あるいは多層防御として以下の策を講じてください。

検出ポイント(SIEM/EDR)

  • 不審な子プロセス生成: Node.jsプロセスから sh, bash, cmd.exe が起動されていないか監視。

  • 異常なファイルアクセス: /etc/passwd や環境変数へのアクセス試行を検知。

  • プロトタイプ汚染の痕跡: ログに __proto__constructor を含む異常なペイロードが記録されていないか確認。

応急的な緩和策(Workaround)

  • 依存関係のアップデート: npm update sandboxjs 等で修正済みバージョン(または代替パッケージ)へ即時移行。

  • 入力バリデーション: 実行前に文字列をスキャンし、constructor, process, require, __proto__ などのキーワードを含むリクエストを拒否する。

【実務上の落とし穴】

  • 可用性への影響: 厳格な入力バリデーションやリソース制限を導入すると、正常なユーザーのスクリプトがエラーになる「過検知(False Positive)」が発生し、サービスの可用性を損なうリスクがあります。

  • 「安全なサンドボックス」の誤信: 純粋なJavaScriptのみで構築されたサンドボックスは、言語仕様上の抜け穴を完全に塞ぐことが極めて困難です。ライブラリだけに頼らず、OSレベルのコンテナ隔離を併用することが不可欠です。

【まとめ】

組織が直ちに取り組むべき3つの優先事項:

  1. インベントリ確認: 自社サービスおよび内部ツールで sandboxjs または類似のサンドボックスライブラリが使用されていないか、依存関係グラフをスキャンする。

  2. パッチ適用と移行: 修正済みバージョンへの更新、または isolated-vm や WebAssembly(Wasm)ベースのより堅牢な実行環境への移行を計画する。

  3. 多層防御の強化: サンドボックスを実行するコンテナに対して no-new-privileges 設定や読み取り専用ファイルシステムを適用し、脱出後の被害を最小化する。

参考文献

ライセンス:本記事のテキスト/コードは特記なき限り CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。

コメント

タイトルとURLをコピーしました