脆弱性CVE-2023-26136の調査
パッケージ tough-cookie のバージョン4.1.3より前のバージョンは、CookieJarをrejectPublicSuffixes=falseモードで使用する際のCookieの不適切な処理により、プロトタイプ汚染に対して脆弱です。この問題は、オブジェクトの初期化方法に起因します。
https://nvd.nist.gov/vuln/detail/CVE-2023-26136
JavaScriptにはオブジェクトという概念があり、これはある種の辞書に似ています。オブジェクトは異なる型(例:文字列、ブーリアン、整数など)の変数のセットを保持できます。辞書とオブジェクトの類推を続けると、変数名がキー、その値が値となります。より正確には、オブジェクトは辞書データ構造そのものに類似し、各変数はキーと値のペアに類似します。オブジェクトには__proto__というキーワードもあり、プロトタイプを変更することでオブジェクトに追加の変数を追加できます。プロトタイプ汚染とは、攻撃者が__proto__キーワードを介してオブジェクトに追加の変数を追加し、そのオブジェクトを汚染する攻撃です。以下はブラウザのコンソールとのやり取りで、この攻撃を示しています。
ご覧の通り、admin1とuser1の2人のユーザがいます。admin1オブジェクトにはブーリアン変数「isAdmin」があり、trueに設定されています。user1にはこの変数がまったくありません。7行目で、user1のプロトタイプにisAdmin変数を追加します。10行目からはuser1オブジェクト自体に変数が追加されていないことが明らかですが、今回はuser1.isAdminの値を確認すると、コンソールは肯定的に応答します。これはuser1がそのプロトタイプのプロパティを継承しているためです。
また、プロトタイプ自体もオブジェクトであり、さらにそのプロトタイプからプロパティやメソッドを継承し、プロトタイプチェーンを形成していることも言及する価値があります。チェーンはnullプロトタイプで終了するため、プロトタイプ汚染を防ぐ合理的なアプローチは、操作しているオブジェクトが明示的にnullプロトタイプから継承するようにすることです。
Cookie(インターネットCookieとも呼ばれる)は、ユーザー名やパスワードのような小さなデータを含むテキストファイルであり、ネットワークを使用する際にコンピュータを識別するために使用されます。特定のCookieは特定のユーザーを識別し、Webブラウジング体験を向上させるために使用されます。
Kaspersky提供:https://www.kaspersky.com/resource-center/definitions/cookies
CookieJarはCookieを保存するためのオブジェクトです。
脆弱性の説明によると、これはTough-CookieがCookieを初期化する方法に起因します。Cookieはオブジェクトであるため、少なくとも理論的にはプロトタイプ汚染に対して脆弱です。
攻撃者はオブジェクトのプロトタイプを介してオブジェクト、特にCookieを改ざんできるようになることで、許可されていないデータへのアクセス、リモートコードの実行、サービス拒否の引き起こし、Webサイトがセッション管理にCookieに依存している場合のセッションハイジャック、Cookie自体からの機密データの抽出を行う可能性があります。
パッチはファイルmemstore.jsに行われました。問題追跡とバージョン4.1.3で導入されたパッチによると、脆弱性を修正するには、Cookieをマップに保存するか、this.idxオブジェクトを作成する必要があります。this.idx = Object.create(null);を使用してthis.idxを作成し、this.idx = {}の代わりにすることで、はじめにで提案したプロトタイプ汚染防止方法(nullプロトタイプから継承し、プロトタイプチェーンを切断する)を実践しています。
Snykは、議論された脆弱性に関する概念実証(PoC)を公開しています。私はその上にindex.jsを構築しました。例外が発生した場合に捕捉するためtry-catchロジックでラップし、テストの進行状況を追跡するために追加の出力を加え、必要な出力(例:「EXPLOITED SUCCESSFULLY」または「EXPLOITED FAILED」)を得られるようにしました。 コマンドを実行すると: npm install [email protected] && node index.js 次の出力が得られます:
コマンドを実行すると: npm install ./tough-cookie-2.5.0-PATCHED.tgz && node index.js 次の出力が得られます:
どちらのシナリオ(公開されている2.5.0バージョンで実行、およびパッチを適用したバージョンで実行)でも、通常のCookieと悪用されたCookieの両方を設定できましたが、パッチを適用したバージョンでは悪用されたCookieにアクセスできませんでした。
この課題では、プロトタイプ汚染攻撃について学び、JavaScriptのオブジェクトについて学び、Tough-Cookieパッケージについて紹介されました。