本記事は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.prototypeやConstructor)の操作を通じて、サンドボックスが制限しているはずのグローバルオブジェクトや関数へアクセスすることで成立します。
【安全な実装と設定】
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つの優先事項:
インベントリ確認: 自社サービスおよび依存ライブラリ内で
SandboxJSが使用されている箇所を特定する。即時アップデート: 修正済みバージョン(または代替のより堅牢な隔離ライブラリ)へ更新し、CI/CDで脆弱性スキャンを強制する。
多層防御の検討: アプリケーション層の隔離だけに頼らず、コンテナレベル・OSレベルの実行制限(AppArmor/Seccomp)を導入する。
参考文献:

