
tough-cookie パッケージのバージョン 4.1.3 より前のバージョンは、rejectPublicSuffixes=false モードで CookieJar を使用する際の Cookie の不適切な処理により、プロトタイプ汚染に対して脆弱です。この問題は、オブジェクトの初期化方法に起因します。
このプロジェクトは、[email protected] のパッチ適用版を提供し、CVE-2023-26136 の脆弱性を排除しつつ、後方互換性を確保することを目的としています。
脆弱性を修正するために、memstore.js を変更し、標準のオブジェクト初期化を Object.create(null) に置き換えることで、プロトタイプ汚染のリスクなしに Cookie をオブジェクトに保存するようにしました。これにより、悪意を持って細工された Cookie 名によるプロトタイプ操作を防ぎます。
tough-cookie/ ディレクトリ内には、tough-cookie のオリジナル版とパッチ適用版を含む 2 つの追加ディレクトリがあります。
Original v2.5.0/) – 脆弱性のある未修正の tough-cookie 2.5.0。v2.5.0-PATCHED/) – CVE-2023-26136 の修正を含む修正版。オリジナルの脆弱なバージョンをインストールするには:
npm install [email protected]
適用されたパッチでは、Cookie の保存方法が変更されています: this.idx = {}; から this.idx = Object.create(null); に変更されました。
これにより、攻撃者がプロトタイプチェーンにプロパティを注入し、脆弱性を悪用することを防ぎます。
tough-cookie (CVE-2023-26136) の脆弱性は、Cookie を保存するためにプレーンな JavaScript オブジェクト {} を使用することに起因します。{} は Object.prototype を継承しているため、proto のようなプロパティを注入することで悪用され、プロトタイプ汚染につながる可能性があります。これにより、攻撃者がアプリケーションの動作を操作したり、セキュリティ問題を引き起こしたりする可能性があります。
これを軽減するために、パッチは {} を Object.create(null) に置き換えます。これにより、プロトタイプを持たないオブジェクト ([[Prototype]]: null) が作成されます。これにより、オブジェクトが Object.prototype からプロパティを継承しないことが保証され、攻撃者が悪意のあるプロパティを注入するのを防ぎます。
Object.create(null) を使用することで、Cookie ストアを意図しないプロトタイプ継承から効果的に隔離し、プロトタイプ汚染攻撃に対してより安全にします。
パッチ適用版をローカルにインストールするには、次の手順に従ってください。
tar -tzf tough-cookie-2.5.0.tgz
必要に応じて、展開します:
tar -xzf tough-cookie-2.5.0.tgz
npm install ./tough-cookie-2.5.0.tgz
node index.js
期待される出力:
EXPLOITED SUCCESSFULLY - オリジナル版の場合
EXPLOIT FAILED - パッチ適用版の場合
パッチ適用版は Node.js 20 (LTS) でテストされ、最新の安定したランタイム環境との互換性を確認しています。
元の tough-cookie リポジトリ (Salesforce) は現在バージョン 5.1.1 です。バージョン 2.5.0 を扱っているため、メインリポジトリから直接フォークすることはできません。代わりに、オリジナル版とパッチ適用版の両方を含む別のリポジトリを作成しました。こちらから見つけることができます:
GitHub Repository - Forked Version
詳細については、公式の CVE ページをご覧ください: CVE-2023-26136 - NVD