[緊急] js-cookieに深刻な脆弱性 (CVE-2026-46625) が判明!プロトタイプ汚染によるセッションハイジャックのリスク
はじめに:あなたのアプリケーションは安全ですか?
日本のフロントエンドエンジニアの皆さん、こんにちは。今回は、JavaScriptで広く利用されているクッキー操作ライブラリ「js-cookie」に発見された、非常に危険な脆弱性 (GHSA-qjx8-664m-686j / CVE-2026-46625) について緊急でお伝えします。この脆弱性を放置すると、ユーザーのセッションが乗っ取られるなど、アプリケーション全体に甚大な被害が及ぶ可能性があります。影響範囲と対策について、技術的な側面から詳しく見ていきましょう。
脆弱性の概要:何が問題なのか?
この脆弱性は、js-cookieライブラリが内部でクッキー属性を処理する際に発生します。攻撃者が巧妙に細工したデータを利用することで、本来開発者が意図しないクッキーのセキュリティ設定(例:ドメイン、Secure属性、SameSite属性、有効期限、パスなど)を、クライアント側で変更できてしまう可能性があります。これにより、攻撃者はアプリケーションのセキュリティ境界を突破し、ユーザーのセッション情報を窃取したり、不正なリクエストを送信したりすることが可能になります。
深刻度は「高 (High)」と評価されており、迅速な対応が求められます。
技術的詳細:プロトタイプ汚染 (Per-instance prototype hijack) とは?
この脆弱性の根本原因は、「プロトタイプ汚染(Prototype Pollution)」の一種である「Per-instance prototype hijack」と呼ばれる問題です。JavaScriptのオブジェクトは、プロトタイプチェーンを通じてプロパティやメソッドを継承します。
js-cookieライブラリの内部で使用されている `assign()` 関数は、オブジェクトのプロパティをコピーする際に `for...in` ループを用いています。ここで問題となるのは、もしコピー元のオブジェクトが `JSON.parse()` などで生成されたもので、攻撃者が意図的に `"__proto__"` という特殊な名前のプロパティを含ませていた場合です。`for...in` ループは、この `"__proto__"` プロパティもコピーの対象としてしまいます。
結果として、コピー先のオブジェクト、ひいては `Cookies.set()` 関数が利用するオブジェクトのプロトタイプが、攻撃者が指定した内容に一時的に書き換えられてしまいます。この改ざんされたプロトタイプを通じて、`Set-Cookie` ヘッダーに不正なクッキー属性(例:`domain=evil.com`、`secure=false`、`samesite=None`)が注入されてしまうのです。
特に影響を受けるシナリオ
特にこの脆弱性の影響を受けやすいのは、以下のようなアプリケーションです。
バックエンドAPIから取得したJSONデータを、そのまま `js-cookie` の `Cookies.set()` や `Cookies.withAttributes()` 関数(の `attributes` 引数)に渡しているケースです。攻撃者は、APIレスポンスに悪意のある `"__proto__"` プロパティを含むペイロードを仕込むことで、クッキーの挙動をコントロールできます。
リスク:セッションハイジャック、CSRF攻撃の助長
攻撃者がクッキーの属性を操作できると、以下のような深刻なセキュリティリスクにつながります。
1. **セッションハイジャック:** 攻撃者はクッキーの `domain` 属性を操作し、別の悪意のあるドメインからユーザーのセッションクッキーを読み取ったり、正規のドメインのクッキーを上書きしたりすることが可能になります。これにより、ユーザーとしてログイン状態を乗っ取られてしまう危険性があります。
2. **セキュリティポリシーの無効化:** `Secure` 属性や `SameSite` 属性を `false` や `None` に変更されることで、HTTPS通信を強制するはずのクッキーがHTTP経由で送信されたり、クロスサイトリクエスト保護が無効化されたりし、中間者攻撃 (MITM) やクロスサイトリクエストフォージェリ (CSRF) 攻撃を助長する可能性があります。
緊急対応!推奨される対策
この脆弱性への対応は必須です。以下の対策を速やかに実施してください。
最も確実で推奨される対応策は、公式でパッチが適用された最新バージョンの `js-cookie` にアップデートすることです。新しいバージョンでは、プロトタイプ汚染を防ぐための修正が施されています。npmやyarnを使用している場合は、以下のコマンドでアップデートしてください。
`npm update js-cookie` または `yarn upgrade js-cookie`
何らかの理由で直ちにアップデートが難しい場合は、以下の応急処置を検討してください。ただし、これはあくまで一時的な対策であり、最終的にはライブラリのアップデートが必要です。
外部から受け取ったオブジェクト(特にAPIレスポンスなど)を `Cookies.set()` や `Cookies.withAttributes()` の `attributes` 引数として直接使用しないでください。代わりに、必要な属性のみを安全な方法でコピーしてから渡すようにします。例えば、`Object.keys()` を使ってオブジェクト自身のプロパティだけを列挙し、新しいオブジェクトにコピーすることで、プロトタイプチェーン上の不要なプロパティが含まれるのを防ぎます。
特に `__proto__`、`constructor`、`prototype` などの予約語に注意し、これらのプロパティがコピー対象に含まれないように厳重にチェックすることが重要です。
例(擬似コード):
`const safeAttributes = {};`
`const allowedKeys = ['expires', 'path', 'domain', 'secure', 'samesite']; // 許可する属性のみを列挙`
`for (const key of allowedKeys) {`
` if (Object.prototype.hasOwnProperty.call(unsafeReceivedObject, key)) {`
` safeAttributes[key] = unsafeReceivedObject[key];`
` }`
`}`
`Cookies.set('my_cookie', 'value', safeAttributes);`
まとめ
js-cookieライブラリのプロトタイプ汚染脆弱性 (CVE-2026-46625) は、非常に深刻なリスクをはらんでいます。フロントエンドエンジニアの皆さんは、ご自身のプロジェクトで `js-cookie` を利用している場合、速やかに最新バージョンへのアップデートを実施してください。セキュリティは常に最新の状態を保つことが肝心です。
この情報を参考に、皆さんのアプリケーションがより安全になることを願っています。