top of page

CVE-2026-92947:vm2の共有Bufferプール問題が示す、JavaScriptサンドボックスの所有権境界

6 日前
読了時間: 7分

CVE-2026-92947は、npmパッケージvm2のBuffer公開処理に関する問題です。GitHub Advisory Databaseでは、vm2の3.11.6以下が影響を受け、CVE固有の最低修正版は3.11.7と記録されています。


論点はJavaScriptのコンテキスト分離だけではありません。サンドボックス側で利用されるBufferが、ホスト側データを含み得る共有バックストアを参照し得たことにあります。


更新は必要ですが、それだけで隔離設計の論点が消えるわけではありません。信頼できないJavaScriptへの実行経路、高価値データとの同居、ネットワーク・ファイル・資源の制限を分けて評価する必要があります。


影響範囲:CVSSと実際の到達性を分けて評価する


GitHub Advisory Databaseは、本件をGHSA-fcqc-726x-5wfcおよびCVE-2026-92947に対応付けています。影響開始版は公開資料から特定できませんが、3.11.6以下が影響範囲として記録され、最低修正版は3.11.7です。同データベースに記録されたCVSS v3.1の基本値は10.0で、ベクターはAV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:Lです。


ただし、AV:Nは、vm2を依存関係に含むすべてのアプリケーションが直ちにインターネットから攻撃可能であることを意味しません。実際の到達性は、外部の利用者がvm2内で任意、または十分に柔軟なJavaScriptを実行できる設計かどうかに左右されます。


利用者作成プラグイン、ルールエンジン、テンプレート式、教育用コード実行、スクリプト実行機能などは、コード実行経路の棚卸し対象になり得ます。さらに、同じNode.jsプロセスに認証情報、復号済みデータ、内部API応答、一時データなどがある構成では、情報開示時の業務上の影響を個別に評価する必要があります。


  • 優先確認:外部入力からvm2のコード実行へ到達できるか

  • 優先確認:信頼できないコードと秘密情報が同一Node.jsプロセスにあるか

  • 確認対象:直接依存だけでなく、ロックファイル上の推移的依存にvm2が含まれるか

  • 判断の原則:CVSSだけでなく、実行経路と同居データに基づいて優先順位を決める


何が壊れたのか:realmの境界とバックストアの境界


Node.jsの公式文書によれば、一定サイズ以下のBuffer.allocUnsafe、Buffer.from(string)、Buffer.from(array)、Buffer.concatなどは、内部の共有メモリプールを利用し得ます。また、ArrayBufferから作成するBufferは、基礎ArrayBufferをコピーせず共有する仕様です。これらは性能上の一般的な仕組みであり、それ自体が脆弱性というわけではありません。


本件では、vm2がデフォルトでBufferをサンドボックスへ公開する際、信頼度の異なる領域が共有するバックストアへの意図しないアクセスが成立し得る状態になりました。公開説明では、同じ共有プールに配置されたホスト側の小規模Bufferについて、内容の開示や変更が起こり得るとされています。


重要なのは、コンテキストやProxyによる言語レベルの隔離と、基礎メモリの所有権が別問題である点です。サンドボックス側から扱える値が、ホスト所有のより大きなバックストアへのビューであれば、その値は想定以上の能力を持ち得ます。


公開資料で確認できる直接的な影響は、共有プール内のホスト側Bufferに関する情報開示、改変、および改変に起因するサービス妨害の可能性です。任意のプロセスメモリ全域の読み取りや、ネイティブコード実行まで可能であるとは、確認済み資料からは断定できません。


  • 設計上の確認点:Bufferのlengthだけでなく、byteOffsetと基礎ArrayBufferのbyteLengthを確認する

  • 誤解しやすい点:問題はBufferプールそのものではなく、信頼境界を越えたバックストア共有にある

  • レビュー対象:サンドボックス側のBuffer生成経路と、ホスト由来の値をsandboxへ注入する経路を分けて確認する


3.11.7の修正:Bufferファクトリ経路のバックストアを分離する


修正コミット4f2508aは、サンドボックス側のBufferファクトリが生成する対象Bufferについて、byteOffsetが0であり、基礎ArrayBufferのbyteLengthとBufferのlengthが一致するという不変条件を実装しています。この条件は、対象Bufferがビュー外のデータを含むバックストアを参照しないことを確認するためのものです。


共有プールを利用する対象Bufferについては、独立した非プールBufferへコピーする設計が採用されています。修正対象には、非ArrayBuffer系のBuffer.from、concat、of、copyBytesFromのほか、旧式のBuffer()/new Buffer()経路が含まれます。


一方で、Buffer.from(arrayBuffer|sharedArrayBuffer, byteOffset, length)が持つ共有メモリの契約まで削除されたわけではありません。パッチの狙いは、その契約を維持しながら、修正対象のBuffer生成経路からホストの共有プール全体を再公開しないことにあります。


このコミットの修正範囲を、ホストとサンドボックスの間で受け渡されるすべてのBufferに対する包括的な保証として扱うべきではありません。更新後も、ホストからsandboxへ渡す値がコピーかビューか、基礎ストレージを共有するかを個別に確認する必要があります。


  • CVE-2026-92947の最低修正版:vm2 3.11.7

  • 対象経路で確認する不変条件:byteOffsetが0であること

  • 対象経路で確認する不変条件:基礎ArrayBufferのbyteLengthとBufferのlengthが一致すること

  • 限定事項:3.11.7の修正範囲を、すべてのBuffer受け渡し経路へ一般化しない


実務対応:CVEの最低修正版と運用上の更新方針を分ける


CVE-2026-92947に限れば、3.11.7が最低修正版です。ただし、運用上は最低修正版へ固定するだけでなく、評価時点で利用可能な保守版を検証して更新する方針が必要です。2026年10月10日時点でnpmパッケージページが表示していた公開最新版は3.12.2でした。最新版表示は変動するため、更新判断時にあらためて確認してください。


v3.11.7は本件を含む20件のアドバイザリを閉じるリリースであり、API変更なしとされる一方、観測可能な挙動変更についてUpgrade Notesの確認が案内されています。更新後は、NodeVMのbuiltin許可、require設定、CLI、WebAssemblyなど、自組織で有効にしている機能を対象に回帰試験を行うことが適切です。


次に、vm2の生成箇所、実行コードの流入元、ホスト値のsandbox注入、外部通信やファイル操作の許可設定を関連付けて記録します。依存関係の有無だけでなく、外部入力が実行に至る経路を把握することで、一時停止や入力制限が可能な機能を判断しやすくなります。


中長期的には、信頼できないコードを高価値の秘密と同じNode.jsプロセスで実行しない設計を検討します。vm2のパッケージページも、プロセス内サンドボックスには継続的な回避リスクがあると注意を促し、ネットワーク分離、ファイルシステム制限、リソース制限などの追加レイヤーを勧めています。


  • 短期:CVE-2026-92947の是正として少なくとも3.11.7へ更新し、保守版への更新を評価する

  • 短期:ロックファイルと実行成果物を照合し、旧版が残っていないことを確認する

  • 短期:外部入力がvm2の実行コードへ到達する機能を一時停止または制限できるか確認する

  • 中期:信頼できない実行を低権限の別プロセスへ移し、明示的なIPCで連携する

  • 長期:ネットワーク、ファイルシステム、CPU、メモリを個別に制限する多層隔離を設計する

  • IPCの確認点:秘密情報、不要なホストBuffer、広い権限を実行側へ渡さない


日付情報の扱い:表示日とデータベース掲載日を混同しない


本件では、公開元ごとに記録される日付が異なります。メンテナーのSecurity Advisory画面とv3.11.7リリース画面は2026年8月24日を表示しています。一方、GitHub Advisory Databaseの正規JSONとOSVは、2026年10月5日22時34分35秒UTCをpublishedとして記録しています。


これらの日付が発見、修正、公開、データベース同期のどのイベントに当たるかは、確認済みの公開資料だけでは一意に確定できません。運用記録では、表示元と日付の意味を分けて記録する必要があります。


発見日や、最初に影響を受けたリリース・コミットの時点も、確認済みの公開資料からは確定できません。対処の優先順位は、日付の解釈ではなく、自組織における実行経路と同居データに基づいて決めるべきです。


  • 日時の記録では、メンテナー画面の表示日、修正版リリース日、データベース掲載日を混用しない

  • 発見日や影響開始日が不明な場合は、推測で補わない

  • 優先順位は、外部到達性と同一プロセスにあるデータの価値で判断する


まとめ


CVE-2026-92947は、サンドボックス内で何を禁止するかだけでなく、サンドボックス側で扱うデータがどのバックストアを参照するかを問う問題です。vm2 3.11.6以下を利用している場合、CVE固有の最低是正として3.11.7への更新が必要です。


ただし、最低修正版への更新と、運用上採用する保守版の判断は分ける必要があります。外部からのコード実行経路を棚卸しし、信頼できないJavaScriptと秘密情報を同一プロセスに置かず、ネットワーク、ファイル、CPU、メモリの制限を重ねることで、単一のプロセス内サンドボックスに依存しない隔離設計へ近づけます。


参考資料


  • https://raw.githubusercontent.com/github/advisory-database/main/advisories/github-reviewed/2026/10/GHSA-fcqc-726x-5wfc/GHSA-fcqc-726x-5wfc.json

  • https://github.com/patriksimek/vm2/security/advisories/GHSA-fcqc-726x-5wfc

  • https://github.com/patriksimek/vm2/commit/4f2508abeb252aa86eb6761c78b3b000248fb089

  • https://github.com/patriksimek/vm2/releases/tag/v3.11.7

  • https://nodejs.org/api/buffer.html

  • https://www.npmjs.com/package/vm2

  • https://osv.dev/vulnerability/GHSA-fcqc-726x-5wfc

bottom of page