Microsoft Edge Japan

Microsoft Edge と Internet Explorer に関する情報をお届けします。

Microsoft Edge での任意のネイティブコード実行の影響の緩和

この記事はマイクロソフト米国本社の Edge 開発チームのブログ Microsoft Edge Dev blog の記事、「Mitigating arbitrary native code execution in Microsoft Edge」 (2017/2/23) の記事の抄訳です。 この記事についてのご質問、ご意見は元記事のほうへお願いいたします。
その他についてはこちらの記事をご参照ください。
Microsoft Edge Dev Blog の翻訳記事を Microsoft Edge Japan ブログで公開します。

最新の web ブラウザーで最も重要なセキュリティ機能の一部は Web を閲覧するときには実際に目にすることはないものです。これらのセキュリティ機能はバックグラウンドで動作し、ハッカーがデバイスや個人データを侵害する可能性があるブラウザベースの脆弱性からお客様を守ります。

以前のブログの記事プレゼンテーションでは、この領域で Windows 10 とMicrosoft Edge に加えられた最近の改善点について説明しました。今回は、脆弱性対策戦略を説明する 2 部構成のブログ記事を公開し、Windows 10 Creators Update で Microsoft Edge に提供される主要なセキュリティ強化について技術的な深い知識を提供します。

脆弱性軽減戦略の枠組み

Edge に提供される主要なセキュリティ強化について深く掘り下げる前に、Web ブラウザの脆弱性の問題に対するアプローチの概要について説明します。Microsoft Edge セキュリティ チームは、脆弱性を悪用する際に攻撃者がフォローするキルチェインに沿った重要なポイントに投資を重点を置く、階層型のデータドリブンの防御戦略を採用しています。

Table illustrating the Edge vulnerability mitigation strategy. The Strategy row reads:

まず、この戦略では、攻撃面を減らし、特定の脆弱性のパターンを発見または緩和することによって、
脆弱性のクラスを排除する方法を紹介します。(use after free の問題などは、MemGC を参照してください)
このようにして、攻撃者と守備側の古典的な非対称性に対抗しようとします。例えば 攻撃者に必要なのは攻撃に有効なセキュリティの問題を見つけることだけですが、防御側はセキュリティ的な問題がないことを保障する必要があります。

依然、我々はすべての脆弱性を排除することができないと仮定してたるため、攻撃者がそれらを悪用するために使用できるテクニックを破る方法を探します。これは、攻撃者が脆弱性をデバイス上でコードを実行する方法に変換しようとする際に好まれるレシピを台無しにするのに役立ちます。これは、脆弱性が悪用される可能性のある基本的な原材料とプリミティブを削除することによって、非対称性にさらに対抗します。我々はすべての攻撃を破ることができないだろうと仮定しているので、脆弱性が悪用された場合、デバイス上のダメージを封じ込め永続性を防ぐ方法を探します。

我々は、これまでの2つの戦術を再度適用していましたが、今回は Microsoft Edge のブラウザー サンド ボックス内で実行されているコードからアクセス可能な攻撃面を管理します。これにより、攻撃者の能力を制限し、さらに目的達成コストを増大させることができます。

最後に、他のすべてが失敗したと仮定して、効果的なツールとプロセスを適切な場所に配置することで、攻撃者が
脆弱性を悪用する機会を制限します。プロセス側では、Microsoft Security Response Center (MSRC) のセキュリティインシデント対応プロセスを活用しています。ツール側では、我々はWindows Defender や SmartScreen のようなテクノロジーにより、悪意のある URL からの攻撃をブロックし、Windows Update を迅速に展開し、セキュアアップデートをインストールします。

我々は、これらのすべての面でセキュリティの改善に投資し続けており、この記事の残りの部分では、最新のブラウザでー最も一般的な種類のセキュリティ問題を悪用するために使用されるテクニックを破るために行った投資に焦点を当てます: メモリ安全性の脆弱性。 具体的には、次のセクションでは、任意のネイティブコードの実行を緩和するために構築したテクノロジを紹介します。

透明性

ブラウザのセキュリティは困難な問題空間です。すべてのブラウザベンダの最善の努力にもかかわらず、脆弱性が存在し、潜在的に悪用される可能性があります。Microsoft が現在、Microsoft Edge の脆弱性に対するバグ特典を最大 $15,000 ドル、迂回バイパスおよび防御バウンティの一環としての斬新な軽減バイパスおよび防御のために$ 200,000 ドルを提供しています。これらのバウンティプログラムは、脆弱性緩和戦略へのコミットメントを強化し、世界中のセキュリティ研究者の大きな仕事に報いる手助けをします。

任意のネイティブコード実行の問題を緩和する

最新のブラウザーへの攻撃では、メモリ安全性の脆弱性をターゲット デバイス上で任意のネイティブ コードを実行するメソッドに変換しようと試みます。この手法は、攻撃の各段階を柔軟かつ均一に実行できるようにすることで、攻撃者にとって最も抵抗の少ない経路を提供するため一般的です。防御側にとっては、脆弱性の事前知識を必要とせずに攻撃者の自由の範囲を実質的に制限する可能性があるため、任意のネイティブコードの実行を防止することが望ましい。この目的のために、Windows 10 Creators Update の Microsoft Edgeは、Code Integrity Guard(CIG)とArbitrary Code Guard (ACG)を活用して、最新のWebブラウザエクスプロイトで見られる最も普遍的なプリミティブを破るのに役立ちます。: 悪質なコードをメモリにロードする。

ハッカーもまた、開発者です

一般的な Web ブラウザの悪用チェーンは、次の3つの部分から成ります :

  1. ターゲットデバイス上でネイティブコードを実行するために使用されるリモートコード実行(RCE)脆弱性の悪用
  2. 特権を増やし、サンドボックスをエスケープするために使用される特権の昇格 (eop) の脆弱性を悪用する
  3. 取得したアクセスを活用して攻撃者の目的を達成するペイロード (例: ransomware, implant, recon, etc).

これらの部品は、攻撃者がターゲットに基づいて異なる RCE, EOP,、およびペイロードの組み合わせを選択できるようにするためのモジュール設計に自然に変換されます。結果として、現代の悪用は普遍的、悪用の第 2、第 3 の各ステージを実行するために任意のネイティブ コードを実行するのに依存します。チェーン内のこの重要なリンクを壊すことによって、攻撃者のソフトウェア設計の前提を無効にし、リファクタリングコストを強制することによって、悪用経済(原文 exploit economics )に影響を与えることができます。

悪質なネイティブコードのロードを防止する

アプリケーションは次のどちらかによってメモリに悪意あるネイティブ コードを直接読み込むことができます。
1) 悪意のあるDLL / EXEをディスクからロードするか、
2) メモリ内のコードを動的に生成/変更します。
CIGは、Microsoft EdgeのDLLコード署名要件を有効にすることで、最初の方法を防止します。これにより、適切に署名された DLL のみがプロセスによってロードされるようになります。ACGは、署名されたコードページが不変であり、新しい符号なしコードページを作成できないことを保証することによってこれを補完します。

CIG : 正しく署名された画像だけを読み込むことを許可する

CIG は、Windows 10 1511 更新プログラムからマイクロソフトの Edge のために有効になっていました。以前のブログ記事では、Microsoft、Windows ストア、または WHQL-signed の DLL を必要とする Microsoft Edge コンテンツプロセスで、カーネル強制ユーザーモードコードの整合性 (UMCI) ポリシーが有効になっている方法を説明しました。このポリシーを適用すると、カーネルは適切に署名されていない DLL をロードしようとしても失敗します。実際には、攻撃は通常、ディスクから DLL の読み込みに依存しませんが、いくつかの悪用によって使用されており、我々 の目標を達成し、包括的なソリューションを提供するために対処する必要があります。Windows 10 1511 リリース以来、我々は、CIG を強化するために追加の改善を行ってきました:

  1. 子プロセスの作成を防止する  (Windows 10 1607) : UMCI ポリシーはプロセスごとに適用されるため、攻撃者がより弱いまたは存在しない UMCI ポリシーを使用して新しいプロセスを起動することを防ぐことも重要です。Windows 10 1607 では、子プロセスが作成できないことを保証するコンテンツプロセスの子プロセスの緩和ポリシーが有効になっています。このポリシーは、コンテンツプロセスのトークンのプロパティとして現在強制されており、直接 (例: calling WinExec) および間接 (例: out-of-process COM server) プロセスの起動をブロックします。
  2. CIG ポリシーを早期に有効化 (Windows 10 Creators Update) : UMCI ポリシーの有効化は、プロセスの初期化時ではなく、プロセス作成時に移動されました。これは、不適切に署名された DLL をローカルのコンテンツプロセスに注入するプロセスの起動時間のギャップを排除することによって、さらに信頼性を向上させるために行われました。これは、UpdateProcThreadAttribute API を利用して、起動するプロセスのコード署名ポリシーを指定することによって実現されました。

ACG: コードを動的に生成または変更することはできません

CIG は、適切に署名された DLL のみをディスクからロードできるという強力な保証を提供しますが、メモリまたは動的に生成されたコードページにマップされた後のイメージコードページの状態については保証しません。これは、攻撃者は、CIG が有効になっている場合でも、新しいコードページを作成したり、既存のものを変更したりすることで、悪意のあるコードを読み込むことができることを意味しています。実際には、ほとんどの近代的な Web ブラウザの悪用は、最終的に VirtualAlloc や VirtualProtect のような API の呼び出しに依存します。攻撃者が新しいコードページを作成したあとにネイティブコードペイロードをメモリにコピーして実行します。

ACG を有効にすると、Windows カーネルは、次のポリシーを適用することにより、コンテンツプロセスがメモリ内のコードページを作成および変更することを防ぎます :

  1. コードページは不変です。既存のコード ページは、書き込み可能にすることはできません、したがって常に意図されたコンテンツがあります。これは、コードページが書き込み可能になったり、プロセス自体によって変更されないようにするために、メモリマネージャの追加のチェックで適用されます。たとえば、VirtualProtect を使用してイメージコードページを PAGE_EXECUTE_READWRITE にすることはできなくなりました。
  2. 新しい符号なしコード ページを作成できません。たとえば、VirtualAlloc を使用して新しい PAGE_EXECUTE_READWRITE コードページを作成することはできなくなりました。

組み合わせると、ACGとCIGによって課せられた制限により、プロセスは署名されたコードページのみをメモリに直接マップすることができることが確認できます。これはセキュリティに最適ですが、ACG は深刻な合併症をもたらします: 最新の Web ブラウザは、ジャストインタイム (JIT) コンパイラに最適なパフォーマンスを期待します。どのように我々 は両方のニーズを満たすことができるでしょうか?

ジャストインタイム (JIT) コンパイラのサポート

最新の Web ブラウザでは、JavaScript やその他の高級言語をネイティブコードに変換することで、優れたパフォーマンスを実現します。その結果、本質的には、コンテンツプロセス内で未署名の若干の量のネイティブコードを生み出す能力に依存しています。JIT コンパイラが ACG 対応で機能するようにすることは、些細なエンジニアリングタスクですが、Windows 10 Creator Update で Microsoft Edge に対して行った投資です。これをサポートするために、我々は独自の分離サンドボックスで実行される別のプロセスにチャクラの JIT 機能を移動しました。JIT プロセスは、JavaScript をネイティブコードにコンパイルし、それを要求してくるコンテンツプロセスにマッピングします。このようにして、コンテンツ・プロセス自体は、それ自体のJITコード・ページを直接マップまたは変更することは決してできません。

攻撃者への影響

CIG と ACG は、Webブラウザの脆弱性を悪用する際に普遍的に使用される基本的なプリミティブに対して強力な保護を提供します。これは、攻撃者が悪用の段階を連鎖させる新しい方法を開発しなければならないことを意味します。

Windows 10 Creators Updateでは、Microsoft EdgeのデフォルトでCIGが有効になっていますが、これらのシナリオで互換性のない拡張機能 (IME など) が存在するシナリオを除き、CIG と ACG は現在デフォルトで無効になっています。

互換性の理由から、ACG は現在、WDDM 2.2ドライバ (Windows 10 Anniversary Update でリリースされたドライバーモデル) を実行するプライマリ GPU を搭載した 64 ビットデスクトップデバイス、またはソフトウェアレンダリングが使用されている場合にのみ適用されます。実験目的のために、ソフトウェアのレンダリングは、コントロールパネル->インターネットオプション ->”Advanced” を介して強制的にすることができます。現在の Microsoft デバイス (Surface Book, Surface Pro 4, and Surface Studio) と、ACG と互換性があることがわかっている GPU ドライバを備えた他の既存のデスクトップシステムのいくつかは、ACG 適用を選択しています。私たちは、顧客からのテレメトリとフィードバックを評価する際に、ACG GPU オプトインリストの適用範囲と精度を改善するつもりです。

CIG と ACG の制限の1つは、攻撃者が意図しない方法で有効な署名済みコードページを活用することを妨げないということです。たとえば、攻撃者は return-oriented programming (rop) のような既知のテクニックを使用して、悪意のあるコードをメモリに読み込むことに依存しない完全なペイロードを構築することができます。Microsoft Edgeは、署名付きコードを実行時に “on the rails” に維持するために、間接呼び出しに制御フロー整合性ポリシーを適用するCFG(Control Flow Guard)を利用します。将来的には、intel の制御フロー執行技術 (Control-flow Enforcement Technology : CET) を活用して、スタック上のリターンアドレスを保護するなど、制御フローハイジャックをさらに軽減することを願っています。

最後に、Edgeでの CIG および ACG の使用は、システム上で実行されている特権コードが、署名されていないネイティブコードをコンテンツプロセスに挿入することを完全に防ぐことを目的としていないことに注意してください。むしろ、これらの機能は、コンテンツプロセス自体が悪意のあるネイティブコードを読み込もうとしているシナリオを防ぐためのものです。

次へ

今後の記事では、Windows 10 Creators UpdateでMicrosoft Edge の隔離と分離を強化するために行われた主な改善点のいくつかに焦点を当てて説明します。これらの改良点は、Webブラウザの脆弱性があなたのデバイスや個人データを侵害するのを防ぐために、次の防衛策を提供しています。

Matt Miller, Principal Security Software Engineer, MSRC

Updated February 23, 2017 10:04 am