このリポジトリは、tough-cookie パッケージのバージョン 2.5.0 に、深刻な プロトタイプ汚染 の脆弱性 (CVE-2023-26136) に対応するパッチを適用したものです。この脆弱性により、攻撃者は JavaScript オブジェクトにプロパティを注入することでプロトタイプチェーンを操作できます。これにより、予期しない動作、リモートコード実行などのセキュリティリスク、およびこのパッケージに依存するアプリケーションでの互換性の問題が発生する可能性があります。
tough-cookie パッケージの v4.1.3 より前のバージョンは、rejectPublicSuffixes=false モードで CookieJar を使用する際に プロトタイプ汚染 の影響を受けます。この脆弱性は、特に cookie.domain が __proto__ に設定された場合に、Cookie の不適切な処理に起因します。これにより、攻撃者はコアの Object.prototype オブジェクトを変更でき、アプリケーション全体に広範囲にわたる問題を引き起こす可能性があります。
CVE-2023-26136 の詳細については、以下を参照してください。
プロトタイプ汚染は、以下のような深刻なリスクをもたらす可能性があります。
セキュリティの脆弱性: ベースの Object.prototype を変更することで、攻撃者はオブジェクトの動作を操作し、特権の昇格、機密データへのアクセス、アプリケーションのセキュリティメカニズムの回避を引き起こす可能性があります。
サービス拒否 (DoS): プロトタイプチェーンを汚染すると、システムで予期しない動作が発生し、クラッシュ、無限ループ、リソースの枯渇を引き起こし、正当なユーザーがアプリケーションを使用できなくなる可能性があります。
互換性の問題: Object.prototype を変更すると、他のライブラリやフレームワークとのやり取りでエラーや予期しない動作が発生する可能性があります。プロトタイプチェーンに依存する依存関係が壊れ、統合の問題やアップデート中のアプリケーションの誤動作を引き起こす可能性があります。
予期しないアプリケーション動作: プロトタイプ汚染は、データの破損、セキュリティ侵害、さらなる悪用へのアプリケーションの露出など、不安定なプログラム動作につながる可能性があります。
このパッチでは、MemoryCookieStore クラス、特に putCookie メソッドを変更して、プロトタイプのないオブジェクトを作成することでプロトタイプ汚染を防止します。主な変更点は次のとおりです。
{} の代わりに Object.create(null) を使用して、プロトタイプを持たないオブジェクトを作成する。cookie.domain = __proto__ で Cookie を設定できる脆弱性を修正する。パッチを適用した tough-cookie をインストールするには、次のコマンドを使用します。
npm install ./tough-cookie-2.5.0-PATCHED.tgz
このリポジトリには、プロトタイプ汚染の脆弱性が正常に対処されたことを確認するための単体テストが含まれています。
prototype_pollution_test という名前のテストでは、ドメインが __proto__ の Cookie を設定しても JavaScript のプロトタイプチェーンに影響を与えないことを具体的にチェックします。これにより、プロトタイプ汚染が防止され、アプリケーションの整合性が維持されます。
テストを実行して修正を確認するには、次のコマンドを実行します。
npm test
オリジナルバージョンとパッチ版の両方でエクスプロイトを実証するには、次の手順に従います。
脆弱なバージョンの tough-cookie をインストールします。
npm install [email protected] && node index.js
期待される出力:
Polluted object: {
Slonser: Cookie="Slonser=polluted; Domain=__proto__; Path=/notauth; hostOnly=false; aAge=5ms; cAge=5ms",
Auth: Cookie="Auth=Lol; Domain=google.com; Path=/notauth; hostOnly=false; aAge=5ms; cAge=5ms"
} EXPLOITED SUCCESSFULLY
これは、オブジェクトのプロトタイプが汚染されたことを示しており、元のバージョンに脆弱性が存在することが確認されます。
npm install ./tough-cookie-2.5.0-PATCHED.tgz && node index.js
期待される出力:
EXPLOIT FAILED
これは、エクスプロイトが正常にブロックされたことを示しており、プロトタイプ汚染の脆弱性が修正されたことが確認されます。
tough-cookie v2.5.0 の プロトタイプ汚染 脆弱性に対処するプロセスは、修正が徹底的かつ効果的であることを保証するために、いくつかの系統的な手順を踏みました。以下は私が従ったアプローチの概要です。
まず プロトタイプ汚染 (CVE-2023-26136) について調査し、その影響を理解することから始めました。この脆弱性により、攻撃者は cookie.domain プロパティを介してプロトタイプチェーンにプロパティを注入でき、リモートコード実行などのセキュリティリスクを引き起こす可能性があります。
脆弱性に関する GitHub の問題や議論を調査しました。これには、Object.create(null) を使用してプロトタイプ汚染を防止する tough-cookie v4.1.3 の修正も含まれます。これにより、v2.5.0 を修正するために必要な変更を特定できました。
v2.5.0 と v4.1.3 を比較して違いを理解し、必要な変更を特定しました。主な変更点は、プロトタイプフリーのオブジェクトを使用して悪用を防止することでした。
MemoryCookieStore クラスを更新して、{} の代わりに Object.create(null) を使用し、プロトタイプ汚染が発生しないようにしました。
修正を検証するための単体テストを作成し、エクスプロイトの実証スクリプト (index.js) を作成して、パッチ版で脆弱性がどのように防止されるかを示しました。
最後に、インストールおよびテスト手順を含む修正を文書化し、パッチ版 (tough-cookie-2.5.0-PATCHED.tgz) を簡単に配布できるようにパッケージ化しました。
v2.5.0 から追加/編集されたファイル
index.js: 脆弱性と修正を実証するメインスクリプト。lib/memstore.js: プロトタイプ汚染を防止するために変更された MemoryCookieStore クラス。test/ietf_data/parser.json: テストデータの古い日付を更新するために編集。test/prototype_pollution_test.js: プロトタイプ汚染が修正されたことを確認する単体テスト。tough-cookie-2.5.0-PATCHED.tgz: tough-cookie パッケージのパッチ版。