vm2: サンドボックス化されたコードは、Node.jsの共有バッファプールを介して、ホスト側のメモリを読み書きできる。
### 概要
サンドボックス化されたコードは、`Buffer.from`や`Buffer.concat`によって割り当てられた小さなメモリ領域が使用するホスト側のメモリの内容を読み取ることができる。
### 詳細
vm2は、デフォルトでサンドボックス化されたコードに`Buffer`オブジェクトを公開する。小さな[`Buffer`の割り当て](https://nodejs.org/api/buffer.html#static-method-bufferallocunsafesize)(例えば、[Buffer.allocUnsafe()](https://nodejs.org/api/buffer.html#static-method-bufferallocunsafesize)、[Buffer.from(array)](https://nodejs.org/api/buffer.html#static-method-bufferfromarray)、[Buffer.from(string)](https://nodejs.org/api/buffer.html#static-method-bufferfromstring-encoding)、および[Buffer.concat()](https://nodejs.org/api/buffer.html#static-method-bufferconcatlist-totallength))は、同じバッファプールを使用し、このプールはサンドボックスと共有されている。これにより、サンドボックス化されたコードは、上記の関数によって使用されるホスト側のメモリの内容を読み取ることができる。
### 実証コード
`vm2@3.11.5`をNode.jsのREPLでテストした。
```javascript
Buffer.from('host-memory-should-not-leak-to-sandbox')
new (require('vm2').VM)().run(`Buffer.from(Buffer.from([0]).buffer, 0, Buffer.from([0]).buffer.byteLength).toString('ascii')`)
```
<img width="1044" height="104" alt="Screenshot 2026-07-23 at 17 54 15" src="https://github.com/user-attachments/assets/987b860c-6702-4818-bfaa-c77919c777e5" />
### 影響
サンドボックスがホスト側で使用しているArrayBufferを取得できるため、上記の関数を経由する機密データが漏洩する可能性がある。さらに、これらのバッファに書き込むことも可能であり、機密データの漏洩や、最悪の場合、サービス拒否につながる可能性がある。
影響を受けるパッケージ:
- npm (JavaScript) vm2: 影響を受けるバージョンは3.11.6以下、3.11.7で修正済み。