SandboxJS: サンドボックスの完全性エスケープ
プラットフォーム
nodejs
コンポーネント
@nyariv/sandboxjs
修正バージョン
0.8.36
### 概要 SandboxJSは、グローバルオブジェクトへの直接代入(例:`Math.random = ...`)をブロックしますが、この保護は、公開されている呼び出し可能なコンストラクタパス `this.constructor.call(target, attackerObject)` を介してバイパスできます。`this.constructor` は内部の `SandboxGlobal` 関数に解決され、`Function.prototype.call` が許可されているため、攻撃者は任意のプロパティをホストのグローバルオブジェクトに書き込み、同じプロセス内のサンドボックスインスタンス間でそれらの変更を永続化できます。 ### 詳細 意図された安全モデルは、代入操作における書き込み時のチェックに依存しています。`assignCheck` では、書き込み先がグローバルとしてマークされている場合(`obj.isGlobal`)、書き込みが拒否されます。これにより、`Math.random = () => 1` のような単純なペイロードは正しくブロックされます。 参照: [`src/executor.ts#L215-L218`](https://github.com/nyariv/SandboxJS/blob/cc8f20b4928afed5478d5ad3d1737ef2dcfaac29/src/executor.ts#L215-L218) ```ts if (obj.isGlobal) { throw new SandboxAccessError( `Cannot ${op} property '${obj.prop.toString()}' of a global object`, ); } ``` バイパスが機能するのは、危険な書き込みが代入オペコードによって実行されないためです。代わりに、攻撃者のコードは、書き込みを実行するホストの呼び出し可能オブジェクトに到達します。
修正方法
公式パッチはありません。回避策を確認するか、アップデートを監視してください。