Modern Frontend CVEs

対象CVE: CVE-2026-59880

[解説] Immutable.jsに潜在する高深刻度DoS脆弱性 (GHSA-xvcm-6775-5m9r / CVE-2026-59880)

Immutable.jsの`Immutable.Map`と`Immutable.Set`において、ハッシュ衝突を悪用したサービス拒否(DoS)攻撃が可能な高深刻度脆弱性(GHSA-xvcm-6775-5m9r / CVE-2026-59880)が発見されました。ユーザーからの入力データが不適切に処理されると、アプリケーションのパフォーマンスが著しく低下する可能性があります。

はじめに:Immutable.jsとその脆弱性

ReactやVue.jsといったモダンなフロントエンド開発において、状態管理ライブラリなどで広く利用されているImmutable.jsに、高深刻度(High)のサービス拒否(Denial of Service, DoS)脆弱性が報告されました。この脆弱性は、`Immutable.Map`や`Immutable.Set`の内部実装におけるハッシュ衝突の処理に起因します。

特に、ユーザーが制御可能なデータをこれらのImmutableなデータ構造の「キー」として扱うアプリケーション(例えば、サーバーサイドでのAPIリクエストボディのパースや、フロントエンドでのユーザー入力に基づいたMapの構築など)では、CPUリソースの過剰消費により、アプリケーションが応答不能になるリスクがあります。

脆弱性のメカニズム:なぜハッシュ衝突が問題になるのか

`Immutable.Map`や`Immutable.Set`は、効率的なデータアクセスを実現するために、内部でキーのハッシュ値を利用しています。しかし、この脆弱性は、複数の異なるキーが同じ32ビットハッシュ値を持つ「ハッシュ衝突」が発生した場合の処理に問題がありました。

具体的には、Immutable.jsが文字列のハッシュ値を計算するアルゴリズムは公開されており、決定論的です(JVMスタイルの多項式ハッシュ `(31 * hashed + charCode) | 0`)。これにより、攻撃者は意図的に多数の衝突するキーを生成することが可能です。例えば、「"Aa"」と「"BB"」は同じハッシュ値(2112)を持つことが知られています。

通常、ハッシュ衝突は稀にしか発生しないため、線形探索で処理しても問題ありません。しかし、多数の衝突するキーが作成されると、`Immutable.Map`や`Immutable.Set`へのキーの挿入やルックアップ操作の計算量が、通常の償却O(1)からO(n)に悪化します。さらに、セット全体の構築や読み取りはO(n²)という非効率な計算量となり、パフォーマンスが劇的に低下します。

概念実証(PoC)では、約8,000個の衝突キーの挿入と読み取りに約0.7秒から0.6秒を要し、キーの数が倍になるごとに時間が4倍に増加することが示されています。16,000個のキーでは数秒を超え、Node.jsのようなシングルスレッドのランタイムでは、イベントループが長時間ブロックされ、サービス全体の停止につながる可能性があります。

影響範囲と具体的なシナリオ

この脆弱性の影響は、アプリケーションが攻撃者によって制御されるオブジェクトの「キー」をImmutable構造に格納する場合に限定されます。例えば、以下のようなケースが挙げられます。

<ul><li>`Immutable.Map(req.body)`: サーバーサイドでAPIリクエストのボディ(JSONなど)を直接Immutable.Mapに変換している場合。</li><li>`Immutable.fromJS(req.body)`: ネストされたオブジェクトを含むユーザー入力をImmutable構造に変換している場合。</li><li>`state.merge(userObject)` / `mergeDeep(...)`: ユーザーオブジェクトを既存のImmutableな状態にマージしている場合。</li></ul>

反対に、攻撃者からの入力を「値」として固定されたキーの下に格納するだけであれば、この脆弱性の影響は受けません。

影響を受けるバージョンとパッチ

この脆弱性は、Immutable.jsのバージョン`5.1.7`までのすべてのバージョンに存在します。4.x系からこの決定論的な文字列ハッシュと線形衝突バケットの設計が引き継がれていました。

この問題は、バージョン`5.1.8`で修正されました。修正内容は、大規模な衝突バケットにおいて、プロセスごとにシードされたセカンダリハッシュを導入することで、線形に近いパフォーマンスを回復するというものです。既存の公開`hash()`メソッドは変更されていないため、互換性が損なわれることはありません。

フロントエンドエンジニアが取るべき対策と回避策

最も効果的な対策は、Immutable.jsを**バージョン`5.1.8`以降**にアップデートすることです。プロジェクトの依存関係を確認し、速やかに更新してください。

直ちにアップデートが難しい場合は、以下の回避策を検討してください。

まとめ

Immutable.jsのハッシュ衝突によるDoS脆弱性は、一見するとシンプルな問題に見えますが、その影響はアプリケーションの停止という深刻な結果につながる可能性があります。特に、Next.jsのAPI Routesやサーバーサイドレンダリング(SSR)環境のように、Node.js上で動作するアプリケーションでは、イベントループがブロックされることで広範囲な影響を及ぼす恐れがあります。

この脆弱性は、ライブラリの内部実装の深い部分に潜んでおり、改めて

の重要性を私たちに教えてくれます。セキュリティ意識を持って、安全なフロントエンド開発を心がけましょう。

← ブログ一覧に戻る