[緊急] probe-image-sizeライブラリにおけるDoS脆弱性 (CVE-2026-104861) と対策
はじめに:Node.jsアプリケーションの新たな脅威
日本のフロントエンドエンジニアの皆さん、こんにちは。Node.jsは、Next.jsのAPI Routes、各種ビルドスクリプト、バックエンドサービスなど、私たちの開発において非常に広範に利用されています。そのNode.jsアプリケーションにおいて、画像のサイズ取得に広く利用されている`probe-image-size`ライブラリに、深刻なサービス拒否(DoS)脆弱性(GHSA-gjj5-9665-rwrc / CVE-2026-104861)が発見されました。この脆弱性は、悪意あるSVGファイルによってNode.jsサーバーが完全に機能停止に陥る可能性があり、緊急の対応が求められます。
脆弱性の概要:なぜサービスが停止するのか?
この脆弱性は「高(high)」深刻度と評価されており、`probe-image-size`ライブラリがSVG画像ファイルのサイズを解析する際に発生します。特定の不正なSVGデータが入力されると、Node.jsサーバーのCPUを長時間100%占有し、結果的にサービス拒否(Denial of Service; DoS)を引き起こします。
特に、外部URLからの画像読み込みを行っているサービスでは、攻撃者が巧妙に作成したSVGファイルへのリンクを提供するだけで、容易に攻撃を仕掛けることができてしまいます。CPUが占有されると、Node.jsのイベントループが完全にブロックされ、他の全てのリクエスト処理が停止するため、システム全体が機能不全に陥ります。
脆弱性のメカニズム:正規表現の落とし穴(ReDoS)
この脆弱性の核心は、SVG解析に使用される正規表現の脆弱性、いわゆる「ReDoS(Regular expression Denial of Service)」にあります。`probe-image-size`ライブラリ内のSVG解析用の正規表現が、多数の`<`文字を含むものの`>`文字を含まないような特殊なSVGデータが入力された場合に問題を引き起こします。
正規表現エンジンは`<`を見つけるたびに、対応する`>`が見つかるまで(または入力の最後まで)何度もスキャンを繰り返してしまいます。この非効率な処理により、処理時間は入力データのサイズの「二乗」に比例して増大します。これは、入力データが少し増えるだけで、処理時間が指数関数的に増加するということを意味します。わずかなサイズの悪意あるSVGデータでも、サーバーのCPUを長時間占有し続け、サービスを停止させることが可能になってしまうのです。
具体的な影響範囲と攻撃シナリオ
`probe-image-size`ライブラリの以下のSVGを解析する全てのメソッドが影響を受けます:
<ul><li>`probe.sync()`: 同期的に画像を解析するメソッド</li><li>`probe(stream)`: ストリームとして画像を解析するメソッド</li><li>`probe(url)`: 外部URLから画像を読み込んで解析するメソッド</li></ul>
中でも、リモートのURLから画像を取得する`probe(url)`は最も危険です。攻撃者は、単に悪意のあるSVGファイルへのリンクを提供するだけで、脆弱なサーバーに対して容易にDoS攻撃を仕掛けることができます。
具体的には、以下のようなNode.jsベースのサービスが影響を受ける可能性があります:
<ul><li>ユーザーが画像をアップロードする際のバリデーション(サイズチェックなど)</li><li>画像のプロキシサービス(外部画像をサーバー経由で提供するサービス)</li><li>リンク展開サービス(SNSなどでURLを投稿した際に表示されるOGP画像などの情報を取得するサービス)</li></ul>
これらのサービスで、たった数個の悪意あるリクエストが同時に処理されるだけで、システム全体が機能停止に陥る可能性があります。Node.jsはシングルスレッドで動作するため、一つの重い処理がイベントループをブロックすると、他の全ての処理が停止してしまいます。
技術的な深掘り:同期とストリーム処理の挙動
この脆弱性は、処理の種類によって異なる挙動を見せます。
1. **同期処理 (`probe.sync()`):**
入力データ全体をメモリに読み込み、サイズ制限なしに正規表現を適用します。そのため、入力データが大きければ大きいほど、処理時間が「線形」ではなく「二乗」で増加し、爆発的に遅延します。
2. **ストリーム処理 (`probe(stream)`):**
累積するデータ量に上限を設けていても、データがチャンク(断片)として届くたびに、それまでに蓄積された全てのデータに対して正規表現処理を繰り返してしまいます。もし入力データが悪意を持って多数の小さなチャンクに分割されて送られてくると、この非効率な処理が何度も実行され、結果的に同期処理よりもさらに深刻な遅延を引き起こす可能性があります。
今すぐ実施すべき対策
この脆弱性は、`probe-image-size`ライブラリのバージョン1.2.4で修正されています。サービスへの影響を避けるため、使用している`probe-image-size`ライブラリを速やかに最新バージョン(1.2.4以上)にアップデートしてください。これは最も簡単で確実な対策です。
npmやYarnを使っている場合、以下のコマンドでアップデートできます。
<code>npm install probe-image-size@latest<br># または<br>yarn upgrade probe-image-size@latest</code>
もし、何らかの理由でライブラリのアップデートがすぐに困難な場合は、以下の代替策を検討する必要がありますが、これらは一時的な対応であり、最終的にはバージョンアップが最も推奨されます。
<ul><li>**SVG画像の処理見直し:** 外部からのSVG入力データを信頼しない設計を徹底し、可能であればSVG画像の処理自体をサンドボックス化する。</li><li>**入力サイズに厳格な制限:** SVGファイルを含む、画像アップロードの最大サイズに非常に厳格な制限を設ける。しかし、ReDoS攻撃は比較的小さなデータでも発生するため、完全な防御にはなりません。</li><li>**WAF/CDNによる対策:** Web Application Firewall (WAF) やCDNサービスで、不審なSVGファイルへのリクエストをブロックするルールを設定する。</li></ul>
まとめ
Node.jsを利用したアプリケーションにおいて、画像処理は一般的な機能でありながら、今回のような脆弱性が潜んでいる可能性があります。`probe-image-size`のReDoS脆弱性は、悪意あるSVGによって簡単にサービス停止を引き起こすため、速やかなライブラリのアップデートが不可欠です。
皆さんのサービスを守るため、今すぐにでも利用状況を確認し、適切な対応をお願いいたします。セキュリティは日々のアップデートと注意によって保たれるものです。