SandboxJSにおけるCVSS 10.0の脆弱性:サンドボックス脱獄とRCEへの緊急対応

Tech

[META] { “criticality”: “CRITICAL”, “cvss_score”: “10.0”, “affected_component”: “SandboxJS”, “vulnerability_type”: “Sandbox Escape / Remote Code Execution”, “remediation_status”: “Patch Available” } [/META]

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

SandboxJSにおけるCVSS 10.0の脆弱性:サンドボックス脱獄とRCEへの緊急対応

【脅威の概要と背景】

SandboxJSにおいて、隔離環境を完全に回避してホストOS上で任意コード実行(RCE)を可能にする、CVSSv3.1スコア10.0の脆弱性4件が報告されました。攻撃者は細工したJavaScriptを流し込むことで、制限をバイパスし、システムの最高権限を奪取する恐れがあります。

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

攻撃者がSandboxJSのプロトタイプ汚染やProxyオブジェクトの不備を悪用し、ホスト環境のプロセス(processchild_process)にアクセスする流れを以下に示します。

graph TD
    A["攻撃者: 悪意あるJSコードの送信"] -->|入力フォーム/API経由| B["SandboxJS インスタンス"]
    B -->|脆弱性悪用: Prototype Pollution等| C["サンドボックス境界の突破"]
    C -->|ホストのGlobalオブジェクトへアクセス| D["ホストOSのシェル/プロセス制御"]
    D -->|任意コマンド実行| E["データ窃取・システム破壊"]

【安全な実装と設定】

SandboxJSなどの動的コード実行ライブラリを使用する際、信頼できない入力をそのまま評価することは極めて危険です。

1. 誤用例:脆弱なコード(直接実行)

攻撃者が this.constructor.constructor('return process')().mainModule.require('child_process').execSync('id') のようなペイロードを渡した場合、容易にRCEが成立します。

// 脆弱な例: 入力値の検証なしにサンドボックス内で実行
const Sandbox = require('sandboxjs');
const s = new Sandbox();

const untrustedInput = "this.constructor.constructor('return process')().exit()"; // 悪意ある入力
s.run(untrustedInput, (err, result) => {
    console.log(result);
});

2. 安全な代替案:多層防御の実装

最新パッチの適用に加え、実行環境そのものを低権限化し、入力を厳格に制限します。

// 対策例: 入力バリデーションと隔離レベルの強化
const Sandbox = require('sandboxjs'); // 必ず最新版にアップデート
const s = new Sandbox();

// 1. ホワイトリストによる入力制限 (静的解析)
function isSafe(code) {
    const forbiddenKeywords = ['constructor', 'process', 'require', 'module', '__proto__'];
    return !forbiddenKeywords.some(keyword => code.includes(keyword));
}

const untrustedInput = "console.log('Safe code')"; 

if (isSafe(untrustedInput)) {
    // 2. タイムアウト設定とリソース制限の付与
    s.run(untrustedInput, { timeout: 500 }, (err, result) => {
        if (err) throw err;
        console.log(result);
    });
} else {
    console.error("Malicious code detected");
}

【検出と緩和策】

検出ポイント

  • EDR/SIEM: Node.jsプロセスから予期しない子プロセス(sh, cmd.exe, curl, wget等)が生成されていないかを監視。

  • WAF: HTTPリクエストに含まれるJSプロトタイプ操作(__proto__, constructor)をシグネチャベースで遮断。

応急的な緩和策(Workaround)

  • 利用の一時停止: パッチ適用が完了するまで、信頼できないユーザーからのスクリプト実行機能を無効化する。

  • コンテナ隔離: Node.jsプロセスを読み取り専用のファイルシステムを持つ非特権コンテナ(Docker/Podman等)内で実行し、ネットワークアクセスを制限する。

【実務上の落とし穴】

  • 可用性への影響: 厳格すぎるキーワード制限(バリデーション)は、正当なスクリプト実行を妨げ、サービスの可用性を低下させる可能性があります。

  • 依存関係の盲点: 直接的なSandboxJSの呼び出しだけでなく、依存ライブラリ(間接的な依存関係)に含まれている場合、npm audit等で明示的に確認しない限り見落とされるリスクがあります。

【まとめ】

組織として直ちに実施すべき3つの優先事項:

  1. 資産の特定: プロジェクト内の全リポジトリで sandboxjs の使用箇所とバージョンを特定する。

  2. 緊急アップデート: 公式からリリースされた修正版へ即時アップデートし、再ビルド・デプロイを行う。

  3. ランタイム監視の強化: サーバー上での異常なプロセス生成を検知するアラートを有効化し、インシデント対応体制を確認する。

参考文献

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

コメント

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