このプロジェクトは、tough-cookie 4.1.3 以前のバージョンに存在する重大なプロトタイプ汚染(prototype pollution)脆弱性である CVE-2023-26136 に対処するものです。この脆弱性は、クッキー処理に [email protected] を使用している Penguin Software Inc. のWebアプリケーションに影響を及ぼします。
CVE-2023-26136 は、CookieJar を rejectPublicSuffixes=false で使用した場合に発生するプロトタイプ汚染の脆弱性です。この問題は MemoryCookieStore クラスにおける不適切なオブジェクト初期化に起因し、攻撃者が悪意を持って細工したクッキードメインを通じて Object.prototype にプロパティを注入することを可能にします。
脆弱性は、クッキーがプレーンなJavaScriptオブジェクト({})を使用して保存される lib/memstore.js に存在します。これらのオブジェクトは Object.prototype を継承するため、攻撃者は __proto__、constructor、prototype などのドメインを持つクッキーを設定することでこれを悪用し、プロトタイプ汚染を引き起こす可能性があります。
この修正は、MemoryCookieStore クラス内のすべての {} を Object.create(null) に置き換えます:
// Before (vulnerable)
this.idx = {};
// After (fixed)
this.idx = Object.create(null);
この変更により、プロトタイプチェーンを持たないオブジェクトを作成してプロトタイプ汚染を防ぎ、クッキーストレージを意図しない継承から効果的に分離します。
lib/memstore.js: オブジェクト初期化を Object.create(null) を使用するよう更新├── README.md # This file
├── changes.diff # Git-compatible diff file
├── test-cve-2023-26136.js # Unit test for the fix
├── tough-cookie/
│ ├── index.js # Exploit demonstration
│ ├── Original v2.5.0/ # Original vulnerable version
│ ├── v2.5.0-PATCHED/ # Patched version
│ │ └── tough-cookie-2.5.0.tgz # Packed version
│ └── package.json
└── mission.txt # Original mission requirements
パッチ適用版は tough-cookie/v2.5.0-PATCHED/tough-cookie-2.5.0.tgz として利用可能です。
インストールするには:
npm install ./tough-cookie/v2.5.0-PATCHED/tough-cookie-2.5.0.tgz
元の tough-cookie テストスイートはパスするはずです。テストを実行するには:
cd tough-cookie/v2.5.0-PATCHED
npm install
npm test
注記: 元の tough-cookie 2.5.0 にはこの配布物にテストディレクトリが含まれていませんが、パッチ適用版は元のAPIとの完全な互換性を維持しています。
修正を検証するためのカスタムユニットテストを実行します:
node test-cve-2023-26136.js
期待される出力:
Testing CVE-2023-26136 fix...
✅ CVE-2023-26136 fix verified: No prototype pollution detected
✅ Test passed: The vulnerability has been successfully patched
プロジェクトには tough-cookie/index.js にエクスプロイトのデモンストレーションが含まれています:
cd tough-cookie
node index.js
これにより、元の脆弱なバージョンとパッチ適用版の両方がテストされ、次の結果が表示されます:
EXPLOITED SUCCESSFULLYEXPLOIT FAILEDchanges.diff ファイルには、次を使用して適用できる git互換のdiffが含まれています:
git apply changes.diff
このdiffには、脆弱性の修正に必要な変更のみが含まれており、意図しない変更は一切含まれていません。
エクスプロイトは次の手順で動作します:
rejectPublicSuffixes: false で CookieJar を作成する__proto__ を持つ悪意のあるクッキーを設定するObject.prototype チェーンが汚染される潜在的な被害:
✅ Node.js 20(LTS) でテストおよび検証済み
GitHubリポジトリ: フォークされた tough-cookie リポジトリ
Gitタグ: v2.5.0-patched-cve-2023-26136-fix
GitHub Actions - エキスパートレベル
Jenkins - アドバンスレベル
Travis CI - インターミディエイトレベル
CircleCI - インターミディエイトレベル
GitLab CI/CD - アドバンスレベル
このプロジェクトは、セキュリティ修正を追加しながら、元の tough-cookie ライセンス(BSD-3-Clause)を維持しています。
注記: これは、CVE-2023-26136 の脆弱性を排除しながら完全な後方互換性を維持する、セキュリティに焦点を当てたパッチです。