
chrome pwning & v8 pwning を始めるための、適切でよく構造化されたドキュメント
Chrome pwning & v8 pwning を始めるための、適切で構造化されたドキュメント
このドキュメントの整理方法
ブラウザは、今日最も使われているテクノロジーの一つです。どの既製コンピュータでも、プラグアンドプレイするだけでブラウザがインストールされているのを確認できます。そのため、攻撃者と脅威モデルの視点から見ると、攻撃者が悪意あるページを通じてブラウザを侵害できることは非常に価値があります。上記の理由から、私は Google の JavaScript エンジン、特に v8 を研究対象に選びました。
v8 プロジェクトは巨大であるため、出発点としてインタプリタ、すなわち d8 を選びました。d8 についてはすでに広範な研究が行われていますが、少なくとも 1 つのバグを見つけたいと考えています。仮に見つからなくても、v8 はブラウザエクスプロイトで使用される基本的なエクスプロイト開発戦略の入り口を提供するため、ブラウザエクスプロイトの研究を前進させることができます。
もう一つの理由は、v8 が複数のブラウザで使用されていることです。内部を見れば、このエンジンが Microsoft Edge でも使われていることが分かります。そのため、複数のバグバウンティ報奨金の獲得機会があります。基盤となる OS については、研究者は Windows と Linux を組み合わせて使うことになるでしょう。v8 のバグは wasm ページを通じたコード実行を可能にし、特定のプラットフォームに依存しないため、シェル取得に関して制限がないからです。
残念ながら、v8 のバグを悪用するとコード実行にはつながりますが、サンドボックスにより任意のコードは実行できません。つまり、レンダラーコンテキストでのコード実行は得られますが、マシン上でコードを実行することはできません。そのためには、サンドボックス用の別のエクスプロイトが必要であり、システムを攻略するにはフルチェーンが必要になります。
そこで、ブラウザハッキングを始めるために、以下の目標を定義します。
このプロジェクトの最初の段階では、Chrome アーキテクチャと、各コンポーネントが互いにどのように連携するかについての知識をできるだけ多く集める必要があります。これをよりよく理解するために、Chromium プロジェクトを複数のサブコンポーネントに分割して、すべてを分離し、適切に分析できるようにする必要があります。具体的には、以下の各コンポーネントがどのサブコンポーネントに分かれるかです。
最初のステップとして最も理にかなっているのは、Chromium アーキテクチャを理解することです。さて、私たちはブラウザを攻撃したいのですが、ブラウザを最初に起動したときには何が起こるのでしょうか? Chromium の実行ファイルをクリックすると、その実行ファイルがいくつかのプロセスを起動します。
順番と名前は次のとおりです。
最初のプロセスは content プロセスと呼ばれます。このプロセスは何をするのでしょうか?
ここまでで簡単にその役割を把握したので、もう少し深く掘り下げます。

chrome_exe_main_win.cc から取ったもので、コード全体を読みたいのなら chromium/src/chrome/app にあります。実行を追っていくと、MakeMainDllLoader() を呼び出して DLL ローダークラスを呼び出し、その後「ローダー」を起動します。つまり chrome.dll を読み込み、必要に応じて必要なコマンドラインで再起動します。ローダーをさらに分析するには、同じディレクトリにある mail_dll_loader_win.cc というファイルのコードを理解する必要があります。ファイルの一番下までスクロールすると、MakeMainDllLoader の呼び出しがあり、それがお使いのバージョンに応じて ChromeDllLoader または ChromiumDllLoader を呼び出します。
ChromiumDllLoader は MainDllLoader から継承するクラスであることがわかります。定義から、このクラスは cmdline に渡された引数とプロセスタイプに基づいて DLL を読み込むだけであることがわかります。

--no-sandbox がバイナリに渡されたかどうかも確認します。これは基本的に、サンドボックス内で実行しないようにバイナリに指示するものです。これらのいずれかが設定されているかどうかを確認し、いずれかが真であれば、それぞれのオプションを指定してサンドボックスを呼び出します。そして最後に、次の関数に到達します。
chrome_main を呼び出すためのラッパーです。