Modern Frontend CVEs

対象CVE: CVE-2026-104845

[緊急解説] Serovalにおけるメモリ枯渇の脆弱性(CVE-2026-104845) - フロントエンド開発者のための注意点

SerovalのJSONデシリアライゼーション機能に、悪意あるペイロードによって大量のメモリを消費させ、サービスを停止させる可能性のある脆弱性(CVE-2026-104845)が発見されました。フロントエンドでSerovalを使用している場合は早急な対応が求められます。

はじめに:Serovalとその脆弱性

日本のフロントエンドエンジニアの皆さん、こんにちは。今回は、Serovalというライブラリに発見された深刻なメモリ枯渇の脆弱性(GHSA-jp82-f5mq-hwhp / CVE-2026-104845)について解説します。Serovalは、JavaScriptのオブジェクトを効率的にシリアライズ・デシリアライズするために利用されることがあり、特にNext.jsなどのフレームワークや、Web Workers間のメッセージング、IndexedDBへの保存などで活用されるケースがあります。この脆弱性は、適切に対処しないとサービス停止につながる可能性のある`High`レベルの脅威とされており、使用しているプロジェクトでは早急な対応が必要です。

脆弱性の概要:なぜメモリ枯渇が発生するのか

この脆弱性の核心は、Serovalの`deserializeTypedArray`関数における`TypedArray`のデシリアライゼーション処理にあります。通常、`TypedArray`(`Int8Array`, `Uint8Array`など)をデシリアライズする際には、ソースデータが正当な`ArrayBuffer`であるか、そして確保するメモリサイズが適切であるかをチェックする必要があります。しかし、脆弱性のあるバージョンでは、このチェックが不十分でした。

具体的には、`deserializeTypedArray`関数は、入力されたソースノードを`ArrayBuffer`であるかのようにキャストして扱います。問題は、このキャストの前に**厳密な型チェックが行われていない**こと、そして**要素数の上限が設けられていない**ことにあります。攻撃者は、`length`プロパティを持つ一般的なJavaScriptオブジェクトを悪意のあるJSONペイロードとしてSerovalのデシリアライザー(`fromJSON`や`fromCrossJSON`など)に渡すことができます。このオブジェクトが`TypedArray`のコンストラクタに渡されると、その`length`プロパティの値に基づいて、**指定された長さ分の巨大なメモリ領域を確保しようとします。**

技術的詳細:TypedArrayと悪用メカニズム

JavaScriptの`TypedArray`は、固定長のバイナリデータを効率的に扱うための配列ライクなオブジェクトです。その実体は通常`ArrayBuffer`というメモリ領域の上に構築されます。`TypedArray`のコンストラクタは、`length`引数を渡すとその長さの要素を持つ`TypedArray`インスタンスを作成します。

本脆弱性では、`deserializeTypedArray`内の`offset`ガードが機能しませんでした。これは、攻撃者が渡すプレーンなオブジェクトには`byteLength`プロパティが定義されていないため、`source.byteLength`が`undefined`となり、`offset`チェックの条件が常に偽となってしまうためです。

結果として、攻撃者はJSONペイロード内にたった1つの整数値として`length`を指定するだけで、数ギガバイト、あるいはそれ以上のメモリ確保を要求することが可能です。Serovalの`fromJSON`や`fromCrossJSON`のようなデシリアライゼーション関数は同期的に実行されるため、この大量のメモリ確保処理はJavaScriptのイベントループをブロックし、サーバープロセスやWeb Workersを完全に停止させてしまいます。これは、CPUとメモリを枯渇させる**サービス拒否(DoS)攻撃**に直結します。

影響とリスク:フロントエンド開発者が注意すべき点

この脆弱性が悪用された場合、以下のような影響が考えられます。

1. **サービス拒否(DoS)**: バックエンドでSerovalを用いてユーザーからのデータをデシリアライズしている場合、悪意あるリクエストによってサーバーがクラッシュし、サービスが停止する可能性があります。

2. **Web Workerの停止**: Webアプリケーション内でSerovalを使ってWeb Workers間でデータを交換している場合、悪意あるデータによってWorkerが停止し、アプリケーションの機能が損なわれる可能性があります。

3. **未認証での攻撃可能性**: 報告によると、この攻撃は「認証されていないCPU/メモリ枯渇」であるとされています。つまり、認証を必要としない公開されたエンドポイントや、誰でもアクセスできるクライアントサイドの処理にSerovalが使われている場合、誰でも攻撃を仕掛けることができます。

ただし、この脆弱性による機密性の漏洩やデータの改ざん(完全性への影響)は報告されていません。攻撃の主目的は、リソースを枯渇させてサービスの可用性を奪うことにあります。

対策:どのように対応すべきか

この脆弱性に対する最も効果的な対策は、**Serovalを修正済みのバージョンにアップデートすること**です。公式のアナウンスやGitHubリポジトリを確認し、修正が適用された最新バージョンへと速やかにアップグレードしてください。

一般的に、信頼できないソースから受け取ったデータをデシリアライズする際は、常に以下の点に注意することが重要です。

1. **入力値の検証**: デシリアライズを行う前に、入力データの形式、構造、およびサイズを厳格に検証する。

2. **サイズ制限の設定**: メモリを大量に消費する可能性のあるオブジェクト(例: `TypedArray`や大きな配列)のデシリアライゼーションにおいて、許容される最大サイズを明確に設定する。

3. **型チェックの徹底**: デシリアライズ時に、予期しない型へのキャストが行われないよう、ランタイムでの厳密な型チェック(例: `instanceof`演算子)を行う。

Serovalの根本的な修正案としては、`instanceof ArrayBuffer`のようなランタイムチェックを追加し、さらにデシリアライズされるオブジェクトのサイズに上限を設けることが挙げられています。

まとめ

Serovalの`GHSA-jp82-f5mq-hwhp` / `CVE-2026-104845`脆弱性は、小さなJSONペイロードから大きなメモリ枯渇を引き起こし、サービス停止に至る可能性のある深刻な問題です。Serovalをあなたのプロジェクトで使用している場合は、速やかにライブラリのバージョンを確認し、修正済みのバージョンへのアップデートを強く推奨します。セキュリティ情報の継続的なチェックと、セキュアなコーディングプラクティスの実践を心がけましょう。

← ブログ一覧に戻る