[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の内部オブジェクト(process や constructor)へのアクセスを制限することで隔離を実現していますが、言語仕様の隙を突いたアクセス手法により、容易に隔離壁を突破されるリスクがあります。
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つの優先事項】
依存関係の即時更新:
npm auditを実行し、SandboxJS(または関連するvm2等のライブラリ)のバージョンを確認。修正版へのアップデートまたは、開発終了(EOL)したライブラリからの移行を決定する。OSレベルの権限制限: サンドボックスを実行しているプロセスが
root権限で動作していないか確認し、最小権限(Non-root user)での実行を徹底する。攻撃対象領域の棚卸し: そもそも「動的なJS実行」が業務要件として不可欠か再考し、可能な限り静的なロジックや DSL (Domain Specific Language) への置き換えを検討する。
参考文献:

