[緊急注意] @fastify/busboyのDoS脆弱性(GHSA-x8mw-p69m-v3mx)を解説!フロントエンドからバックエンドまで安全な開発のために
はじめに:`@fastify/busboy`の深刻なDoS脆弱性
日頃からWebアプリケーション開発に携わる日本のフロントエンドエンジニアの皆さん、こんにちは。今回は、バックエンド、特にNode.jsアプリケーションにおける深刻な脆弱性情報をお届けします。HTTPリクエストの`multipart/form-data`を処理する人気のライブラリ`@fastify/busboy`に、サービス拒否(Denial of Service, DoS)を引き起こす可能性のある脆弱性(GHSA-x8mw-p69m-v3mx / CVE-2026-19481)が発見されました。この脆弱性は、適切な対策を講じなければ、アプリケーションの停止に繋がる恐れがあります。
`@fastify/busboy`とは?そしてなぜフロントエンドエンジニアも知るべきか?
`@fastify/busboy`は、Fastifyフレームワークと連携して、主にファイルアップロードなどで使用される`multipart/form-data`形式のリクエストボディを効率的に解析するためのライブラリです。Fastifyは高速なWebフレームワークとして知られており、多くのNode.jsバックエンドで利用されています。フロントエンドエンジニアの皆さんも、ファイルアップロード機能を持つWebアプリケーションを開発する際に、バックエンドとの連携でこの形式を扱うことが多いでしょう。そのため、このライブラリの脆弱性は、皆さんが開発に関わるシステムの安定性に直接影響を及ぼす可能性があります。
脆弱性の詳細:`__proto__`が引き起こすDoS攻撃
この脆弱性は、`@fastify/busboy`のmultipartヘッダーパーサーが、リクエストヘッダー名を内部のJavaScriptオブジェクトに保存する際に発生します。具体的には、悪意のある攻撃者が`__proto__`や`constructor`といった、JavaScriptのプロトタイプチェーンに関連する予約語をmultipart partヘッダー名として送信した場合に問題が生じます。
通常、ヘッダーパーサーはヘッダー値を配列として扱おうとします。しかし、`__proto__`や`constructor`のような名前が来ると、JavaScriptのオブジェクトが持つプロトタイプチェーン上の値(例えば、`Object.prototype`など)を参照してしまいます。このとき参照される値は配列ではないため、「`TypeError: this.header[h].push is not a function`」というエラーが発生し、処理が中断されます。
このエラーが捕捉されずに発生した場合、Node.jsプロセス自体がクラッシュし、Fastifyアプリケーションが停止してしまう可能性があります。さらに深刻なのは、このパーサー処理はアプリケーションのミドルウェアが実行されるよりも前に行われるため、認証されていないクライアントでも、悪意のある`multipart/form-data`リクエストを送信するだけで攻撃が成功してしまう点です。これにより、容易にサービス拒否攻撃が可能になります。
影響を受けるバージョンとシステム
この脆弱性の影響を受けるのは、`@fastify/busboy`のバージョン1.0.0から3.2.0までのすべてです。もし皆さんのプロジェクトでFastifyを使い、これらのバージョンの`@fastify/busboy`(またはその依存として導入されているもの)を利用している場合は、速やかな対応が必要です。
対策:サービスを安全に保つために
幸いなことに、この脆弱性は既に修正されており、対策は非常に明確です。
`@fastify/busboy`のバージョンを **3.2.1以上** にアップグレードしてください。このバージョンには脆弱性を修正するためのパッチが含まれており、根本的な解決策となります。`package.json`の依存関係を確認し、バージョンを更新後、`npm install`または`yarn install`を実行してビルドし直してください。
直ちにバージョンアップが難しい場合のために、以下の回避策が提供されています。ただし、これらはあくまで一時的なものであり、最終的にはバージョンアップを行うべきです。
<ul><li><strong>Busboyストリームにエラーリスナーをアタッチする:</strong> `req.pipe(busboy)`のようにBusboyストリームを使用している場合、`error`イベントにリスナーをアタッチして、パーサーのエラーがプロセスをクラッシュさせるのではなく、適切に処理されるようにします。</li></ul><pre><code class="language-javascript">busboy.on('error', (err) => { console.error('Busboy parsing error:', err); // エラー処理(例: 500エラーをクライアントに返すなど) }); </code></pre><ul><li><strong>直接の`write()`/`end()`呼び出しを`try/catch`で囲む:</strong> Busboyを直接`write()`や`end()`メソッドで利用している場合は、これらの呼び出しを`try/catch`ブロックで囲み、同期的にスローされる`TypeError`を捕捉してプロセスが終了しないようにします。</li></ul>
まとめ:迅速な対応でアプリケーションを守ろう
`@fastify/busboy`のDoS脆弱性は、認証されていない攻撃者によって容易にNode.jsアプリケーションが停止させられる深刻な問題です。フロントエンドエンジニアの皆さんも、ご自身の開発しているWebアプリケーションのバックエンドがこの影響を受けていないか、改めて確認することが重要です。
開発チーム内で情報を共有し、**`@fastify/busboy`をバージョン3.2.1以上に速やかにアップグレード**してください。これにより、ユーザーに安全で安定したサービスを提供し続けることができます。セキュリティは常に開発の最優先事項です。