SandboxJSにおけるサンドボックス脱出の脆弱性(CVSS 10.0)への緊急対応ガイド

Tech

[style_prompt: technical_advisory_v1.2]

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

SandboxJSにおけるサンドボックス脱出の脆弱性(CVSS 10.0)への緊急対応ガイド

【脅威の概要と背景】 信頼できないコードを実行するSandboxJSにおいて、ホスト権限奪取を可能にする4件のCVSS 10.0脆弱性が報告。プロトタイプ汚染等を悪用し、サンドボックス隔離を完全に無効化する攻撃が確認されています。

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

graph TD
    Attacker["攻撃者"] -->|悪意のあるJSコードを注入| Input["入力フォーム/API"]
    Input -->|未検証のコード実行| Sandbox["SandboxJS実行環境"]
    Sandbox -->|プロトタイプ汚染 / Proxy悪用| Escape{"サンドボックス脱出"}
    Escape -->|ホストOSの権限取得| RCE["任意コード実行 / OSコマンド発行"]
    RCE -->|機密情報窃取 / 破壊行為| Damage["ビジネスインパクト"]

【安全な実装と設定】

JavaScriptサンドボックスライブラリの多くは、Node.jsの内部オブジェクト(processconstructor)へのアクセスを制限することで隔離を実現していますが、言語仕様の隙を突いたアクセス手法により、容易に隔離壁を突破されるリスクがあります。

1. 誤用例:脆弱な実行コード(Node.js環境) ユーザーから受け取った入力を直接サンドボックスに渡す実装は、最新の脱出手法(Bypass)に対して無力です。

// ❌ 危険な実装例
const Sandbox = require('sandbox');
const s = new Sandbox();

// 攻撃者は "__proto__" や "constructor" を介してグローバルオブジェクトにアクセス可能
s.run(userInput, (res) => {
    console.log(res);
});

2. 安全な代替案:多層防御(Defense in Depth) ライブラリのアップデートに加え、OSレベルでの隔離(Containerization)と、より堅牢な隔離エンジン(v8 isolate等)への移行を検討してください。

// ✅ 改善案: isolated-vm を使用したリソース分離と制約付与
const ivm = require('isolated-vm');
const isolate = new ivm.Isolate({ memoryLimit: 128 });
const context = isolate.createContextSync();

// グローバルオブジェクトを完全に排除し、必要最小限の関数のみをブリッジする
const jail = context.global;
jail.setSync('global', jail.derefInto());

const script = isolate.compileScriptSync(safeUserInput);
script.runSync(context, { timeout: 1000 });

【検出と緩和策】

  • EDR/SIEMでの検知ポイント:

    • Node.jsプロセス(node)が、通常では発生し得ない子プロセス(sh, cmd.exe, curl 等)を生成したログを検知する。

    • アプリケーションログにおいて、__proto__, constructor, prototype といったキーワードを含む異常に長い文字列の入力を監査する。

  • 応急的な緩和策(Workaround):

    • 入力のサニタイズ: 実行前に AST (Abstract Syntax Tree) 解析を行い、危険なプロパティアクセスやグローバル変数への参照を静的に拒否する。

    • 実行環境の隔離: サンドボックスを実行するコンテナを読み取り専用(Read-only Rootfs)にし、ネットワークアクセスを完全に遮断(--network none)する。

【実務上の落とし穴】

  • 可用性への影響: セキュリティを優先して isolated-vm 等へ移行する場合、コンテキスト間のデータ受け渡しにシリアライズが必要となり、従来の「オブジェクトをそのまま渡す」実装ではパフォーマンスが大幅に低下したり、既存のロジックが動作しなくなったりするリスクがあります。

  • 誤検知のリスク: 正常なコードでも高度なメタプログラミングを行っている場合、WAFやIPSが「プロトタイプ汚染攻撃」と誤認して遮断する可能性があります。

【まとめ:今すぐ実施すべき3つの優先事項】

  1. 依存関係の即時更新: npm audit を実行し、SandboxJS(または関連する vm2 等のライブラリ)のバージョンを確認。修正版へのアップデートまたは、開発終了(EOL)したライブラリからの移行を決定する。

  2. OSレベルの権限制限: サンドボックスを実行しているプロセスが root 権限で動作していないか確認し、最小権限(Non-root user)での実行を徹底する。

  3. 攻撃対象領域の棚卸し: そもそも「動的なJS実行」が業務要件として不可欠か再考し、可能な限り静的なロジックや DSL (Domain Specific Language) への置き換えを検討する。


参考文献:

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

コメント

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