Modern Frontend CVEs

対象CVE: CVE-2026-59724

[緊急解説] Engine.IOの深刻なDoS脆弱性 (GHSA-gr94-w7qr-f4j3 / CVE-2026-59724) と対策

Engine.IO v6.5.0〜v6.6.6に、WebTransportが有効な場合にリモートからサーバーをクラッシュさせ、サービス停止を引き起こすDoS脆弱性が発見されました。日本のフロントエンドエンジニア向けにその詳細と対策を解説します。

はじめに

Engine.IOはSocket.IOの基盤となるリアルタイム通信ライブラリであり、多くのNode.jsアプリケーションで利用されています。今回、そのEngine.IOの特定バージョンに深刻度「High」のリモートからのサービス拒否(DoS)脆弱性 (GHSA-gr94-w7qr-f4j3 / CVE-2026-59724) が発見されました。日本のフロントエンドエンジニアの皆さんも、バックエンドの一部としてNode.jsサーバーを扱っている場合、この脆弱性の影響を受ける可能性があります。この記事では、脆弱性の詳細、影響範囲、そして取るべき対策について解説します。

脆弱性の概要:Engine.IO WebTransport SID DoS

この脆弱性は、Engine.IOサーバーでWebTransportプロトコルが有効になっている場合に発生します。悪意のある認証されていないクライアントが、細工されたWebTransportアップグレードリクエストを送信することで、サーバーのNode.jsプロセスをクラッシュさせ、結果としてサービス停止を引き起こす可能性があります。

具体的に何が問題か?攻撃メカニズムの詳細

問題の根源は、セッションID (SID) のルックアップ処理にあります。Engine.IOはクライアントとのセッション管理にSIDを使用しますが、WebTransportアップグレード時のSIDルックアップにおいて、キーがクライアントオブジェクトの「自身のプロパティ (own property)」であるかどうかの検証が不適切でした。

これにより、攻撃者は <code>__proto__</code> のような特殊な文字列をSIDとして含むリクエストを送信できます。サーバーがこのSIDを処理する際、JavaScriptのプロトタイプチェーン上のプロパティに誤って解決してしまい、それが原因で内部処理で <code>TypeError</code> が発生します。

この <code>TypeError</code> は非同期コンテキストで発生するため、Node.jsのバージョンや設定によっては「unhandled Promise rejection」として捕捉されず、Node.jsプロセス全体が終了してしまう可能性があります。これにより、リモートの攻撃者が認証なしにサーバーをクラッシュさせ、DoS攻撃を成功させることが可能になります。

影響を受けるシステムと条件

この脆弱性の影響を受けるのは、以下の条件を<b>両方満たす</b>システムです。

<ul><li><code>engine.io</code> のバージョンが <code>6.5.0</code> から <code>6.6.6</code> の範囲である。</li><li>Engine.IOサーバーで <b>WebTransportサポートが明示的に有効になっている</b>。</li></ul>

<b>重要</b>: WebTransportはEngine.IOでデフォルトでは有効になっていません。したがって、明示的にWebTransportを有効にする設定を行っていない限り、この脆弱性の直接的な影響は受けません。しかし、もし将来的に有効にする予定がある、または過去に有効にしていた場合は注意が必要です。

Socket.IOを使用している場合、その内部でEngine.IOが利用されているため、Socket.IOのバージョンによっては間接的にこの脆弱性の影響を受ける可能性があります。

いますぐ取るべき対策

最も推奨される対策は、脆弱性が修正されたバージョンにアップグレードすることです。

<ul><li><code>engine.io</code> を <code>6.6.7</code> またはそれ以降のバージョンにアップグレードしてください。</li></ul>

npmをご利用の場合、以下のコマンドで更新できます。<pre><code>npm install engine.io@latest</code></pre>

Socket.IOを使用している場合は、Engine.IOのパッチバージョンを含むSocket.IOの最新リリースにアップデートすることが推奨されます。Socket.IOの公式リリースノートやGitHubリポジトリを確認し、最新の安定版への更新を検討してください。

すぐにアップグレードできない場合は、WebTransportサポートを無効にすることでこの脆弱性を緩和できます。WebTransportはデフォルトで無効ですが、もし明示的に有効にしている場合は、以下の例のように <code>transports</code> 設定から <code>webtransport</code> を除外してください。

<pre><code>const engine = new Server({ transports: ["polling", "websocket"], // webtransportを含めない });</code></pre>

<ul><li><b>リバースプロキシ/HTTP/3レイヤーでの制限</b>: WebTransportエンドポイントへのアクセスをリバースプロキシやHTTP/3レイヤーで制限することを検討してください。</li><li><b>HTTP/3/WebTransportの無効化</b>: パッチ適用が完了するまで、HTTP/3およびWebTransportサポートを一時的に無効にすることも有効です。</li><li><b>プロセススーパーバイザーの利用</b>: サービスをPM2のようなプロセススーパーバイザーで実行することで、プロセスがクラッシュしても自動的に再起動されるため、完全な解決にはなりませんが、可用性向上には役立ちます。ただし、これは繰り返し攻撃によるクラッシュループを防ぐものではありません。</li></ul>

まとめ

Engine.IOのWebTransportに関するDoS脆弱性は、WebTransportを有効にしているシステムにとって深刻な脅威となります。幸い、対策はシンプルで、バージョンアップまたはWebTransportの無効化によって対応可能です。ご自身のプロジェクトでEngine.IOやSocket.IOを利用しており、特にWebTransportを有効にしている場合は、速やかに影響範囲を確認し、推奨される対策を実施してください。

参考情報

<ul><li>GHSA-gr94-w7qr-f4j3: <a href="https://github.com/advisories/GHSA-gr94-w7qr-f4j3" target="_blank">https://github.com/advisories/GHSA-gr94-w7qr-f4j3</a></li><li>CVE-2026-59724: <a href="https://nvd.nist.gov/vuln/detail/CVE-2026-59724" target="_blank">https://nvd.nist.gov/vuln/detail/CVE-2026-59724</a></li><li>Fix commit: <a href="https://github.com/socketio/socket.io/commit/1fa1f46cd420ac5b57bb4c04c959b58f3c79158c" target="_blank">https://github.com/socketio/socket.io/commit/1fa1f46cd420ac5b57bb4c04c959b58f3c79158c</a></li><li>Engine.IO changelog for <code>6.6.7</code>: <a href="https://github.com/socketio/socket.io/blob/main/packages/engine.io/CHANGELOG.md#667-2026-04-27" target="_blank">https://github.com/socketio/socket.io/blob/main/packages/engine.io/CHANGELOG.md#667-2026-04-27</a></li><li>Engine.IO npm package: <a href="https://www.npmjs.com/package/engine.io" target="_blank">https://www.npmjs.com/package/engine.io</a></li></ul>

← ブログ一覧に戻る