[注意喚起] deepmerge-tsにおける再帰オブジェクトによるスタックオーバーフローの脆弱性 (CVE-2026-40345)
はじめに:`deepmerge-ts` とは
JavaScript開発において、複数のオブジェクトを深くマージする(結合する)操作は頻繁に発生します。特に設定ファイルのマージや状態管理において、ネストされたオブジェクト構造を扱う際には、浅いマージでは不十分なケースが多くあります。`deepmerge-ts` は、このような深いオブジェクトのマージを効率的に行うための人気の高いライブラリです。
しかし、この `deepmerge-ts` に、特定の条件下でアプリケーションをクラッシュさせる可能性のある深刻度の高い脆弱性(GHSA-ggr8-5vv4-36mx / CVE-2026-40345)が発見されました。本記事では、この脆弱性の詳細、影響、そしてフロントエンドエンジニアが取るべき対策について解説します。
脆弱性の概要 (CVE-2026-40345)
この脆弱性は、`deepmerge-ts` ライブラリの `deepmerge()` および `deepmergeInto()` 関数において発生する「スタック枯渇(Stack exhaustion)」、いわゆるスタックオーバーフローです。攻撃者が制御する再帰的なオブジェクトグラフをこれらの関数に渡すことで、Node.js環境で実行されているアプリケーションを同期的にクラッシュさせることが可能になります。
**深刻度:** High
**影響を受けるライブラリ:** `deepmerge-ts`
何が問題なのか? (技術的詳細)
`deepmerge-ts` は、オブジェクトを再帰的にマージする際、マージ中のオブジェクトの訪問履歴やサイクル検出のメカニズムを持っていません。このため、もしマージしようとしている2つのオブジェクトが、同じプロパティパスを介して互いを参照するような「自己参照ループ」を含む構造を持っていた場合、ライブラリは無限に再帰を続けてしまいます。
結果として、JavaScriptエンジンのコールスタックが限界に達し、Node.jsでは `RangeError: Maximum call stack size exceeded` というエラーが発生してプロセスが異常終了します。この現象は、以下の `deepmerge-ts` の主要なAPIを通じて発生する可能性があります。
* `deepmerge(...)`
* `deepmergeCustom(...)(...)`
* `deepmergeInto(target, ...)`
* `deepmergeIntoCustom(...)(target, ...)`
重要な点として、この問題は「再帰的なオブジェクトグラフ」が入力として提供された場合にのみ発生します。単なるネストされた構造を持つプレーンなJSONデータでは発生しません。
具体的なPoC (概念実証コード) の解説
提供された概念実証 (PoC) コードは、以下のような自己参照ループを持つオブジェクトを作成し、`deepmerge` および `deepmergeInto` 関数に渡すことでスタックオーバーフローを引き起こします。
例えば、`left` というオブジェクトと `right` というオブジェクトをそれぞれ作成し、`left.self = left;` および `right.self = right;` のように、各オブジェクトの `self` プロパティが自分自身を参照するようにします。この状態で `deepmerge(left, right)` を実行すると、`deepmerge` 関数は `left.self` と `right.self` をマージしようとし、そのマージ処理の中で再び `left` と `right` のマージを試み、無限ループに陥ります。これによりコールスタックが枯渇し、`RangeError` が発生します。
同様に、`deepmergeInto` 関数を使用した場合でも、ターゲットとソースの両方に自己参照ループが含まれていると同じ問題が発生します。
この脆弱性が与える影響
この脆弱性が悪用された場合、Node.jsで動作するアプリケーションに深刻な影響を及ぼす可能性があります。具体的には、攻撃者が細工した再帰的なオブジェクトグラフをサービスに送り込むことで、そのサービスを強制的にクラッシュさせることができます。
* **サービス停止:** アプリケーションプロセスが終了し、リクエスト処理が停止します。
* **DDoS攻撃:** 悪意のある入力が繰り返し送られることで、ワーカープロセスが何度も再起動を繰り返し、サービスが継続的に利用できない状態に陥る可能性があります。
フロントエンドエンジニアの皆さんが直接ユーザー入力から `deepmerge-ts` に再帰的なオブジェクトを渡すケースは少ないかもしれませんが、サーバーサイドレンダリング (SSR) を行うNext.jsやNuxt.jsのようなフレームワーク、あるいはビルドツールやAPIゲートウェイなどで `deepmerge-ts` が使用されている場合、間接的に影響を受ける可能性があります。特に、外部APIからのレスポンスやユーザーからの入力をマージする処理がある場合は注意が必要です。
フロントエンドエンジニアが取るべき対策
この脆弱性から身を守るために、以下の対策を速やかに講じることを推奨します。
1. **ライブラリのアップデート:** `deepmerge-ts` を使用している場合、この脆弱性が修正された最新バージョンに速やかにアップデートしてください。通常、セキュリティ修正は新しいパッチバージョンで提供されます。
2. **入力値の検証:** ユーザーからの入力や信頼できない外部ソースからのデータを `deepmerge-ts` に渡す前に、必ず入力値のバリデーションを実施し、自己参照ループなどの再帰的な構造が含まれていないかチェックする仕組みを導入することを検討してください。ただし、この検証を厳密に行うのは困難な場合もあります。
3. **依存関係の監視:** DependabotやSnykなどの依存関係スキャンツールを活用し、プロジェクトが使用しているライブラリに新たな脆弱性が発見されていないかを常に監視する体制を整えましょう。
4. **最小権限の原則:** もし `deepmerge-ts` を使用するサービスが特権的な環境で動作している場合、可能な限り権限を制限することで、万が一の悪用時に被害を最小限に抑えることができます。
まとめ
`deepmerge-ts` の再帰オブジェクトによるスタックオーバーフローの脆弱性は、Node.js環境で動作するアプリケーションにサービス停止をもたらす可能性がある深刻な問題です。直接フロントエンドコードで悪用されるケースは稀かもしれませんが、バックエンド連携やビルドプロセスなどを通じて影響が及ぶ可能性も考慮し、早急な対策が求められます。
セキュリティは、ソフトウェア開発における継続的な取り組みです。常に最新の脆弱性情報をチェックし、使用しているライブラリを適切に管理することで、安全なサービス提供に努めましょう。