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

Tech

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

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

【脅威の概要と背景】

SandboxJSにおいて、サンドボックスを完全に回避しホスト側で任意のコードを実行可能にする、CVSS v3.1スコア10.0の脆弱性4件(CVE-2024-52317他)が報告されました。攻撃者はプロトタイプ汚染等を通じて環境を脱出し、基盤OSの制御を奪取する恐れがあります。

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

graph TD
A["攻撃者: 悪意あるJSコードを送信"] -->|脆弱なSandboxJSインスタンス| B("プロトタイプ汚染/Proxy悪用")
B -->|サンドボックス境界の消失| C{"ホスト環境へのエスケープ"}
C -->|process/child_processへのアクセス| D["任意OSコマンドの実行: RCE"]
D -->|特権奪取・横展開| E["機密データの窃取・システム破壊"]

この攻撃は、Node.jsの組み込みオブジェクト(Object.prototypeConstructor)の操作を通じて、サンドボックスが制限しているはずのグローバルオブジェクトや関数へアクセスすることで成立します。

【安全な実装と設定】

1. 誤用例:脆弱なコード

信頼できない入力を直接サンドボックスで実行し、かつライブラリが最新でない状態。

const { Sandbox } = require('sandboxjs'); // 脆弱なバージョン
const sb = new Sandbox();

// 攻撃者からの入力(例:プロトタイプを遡ってprocessオブジェクトを取得するコード)
const untrustedInput = `
  const foreignConstructor = ({}).constructor.constructor;
  const process = foreignConstructor('return process')();
  process.mainModule.require('child_process').execSync('rm -rf /');
`;

sb.run(untrustedInput); // ホスト側のファイルが削除されるリスク

2. 安全な代替案:多層防御の適用

ライブラリのアップデートに加え、OSレベルの隔離を併用します。

// 1. 最新バージョンへのアップデート
// npm install sandboxjs@latest

// 2. 入力のバリデーションと隔離の強化
const { Sandbox } = require('sandboxjs');

function safeExecute(userInput) {
    // 入力に対する基本的なサニタイズ(ブラックリスト形式は不完全なため補助的)
    if (userInput.includes('constructor') || userInput.includes('__proto__')) {
        throw new Error('Security Violation');
    }

    const sb = new Sandbox({
        timeout: 500, // 実行時間制限
        memory: 128   // メモリ制限
    });

    return sb.run(userInput);
}

// 3. 実行環境自体の隔離 (推奨)
// アプリケーションを読み取り専用のDockerコンテナや
// gVisor, Firecracker等のセキュアなランタイム上で動作させる。

【検出と緩和策】

EDR/SIEMでの検知ポイント

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

  • システムコール監視: サンドボックス実行プロセスによる execve やネットワークソケットの作成を異常として検知。

緊急緩和策(Workaround)

  • ライブラリのパッチ適用: 修正済みバージョンへの強制アップグレード。

  • 機能の一時停止: 修正が完了するまで、エンドユーザーによる動的スクリプト実行機能を無効化。

  • WAFでのブロック: constructor.constructor などの一般的なサンドボックス回避パターンを含むリクエストをWAFで遮断。

【実務上の落とし穴】

  • 可用性への影響: サンドボックスの制限を厳しくしすぎると、正当なスクリプト(複雑な計算や特定のライブラリ依存)が動作しなくなる「誤検知(False Positive)」が発生します。

  • パフォーマンス劣化: gVisor等のセキュアランタイム導入は、システムコールのオーバーヘッドによりスループットが低下する可能性があります。セキュリティ要件と性能要件のトレードオフを検討してください。

【まとめ】

組織として今すぐ実施すべき3つの優先事項:

  1. インベントリ確認: 自社サービスおよび依存ライブラリ内で SandboxJS が使用されている箇所を特定する。

  2. 即時アップデート: 修正済みバージョン(または代替のより堅牢な隔離ライブラリ)へ更新し、CI/CDで脆弱性スキャンを強制する。

  3. 多層防御の検討: アプリケーション層の隔離だけに頼らず、コンテナレベル・OSレベルの実行制限(AppArmor/Seccomp)を導入する。


参考文献:

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

コメント

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