パロアルトネットワークス、Microsoft IISとSQL Serverを標的とする新たな攻撃手法の研究結果をBlack Hat Asia 2021で発表

By , , and

Category: Unit 42

Tags: , , , , , ,

A conceptual image representing an adversary. The new attack surface discussed here is an example of what can be possible for an adversary able to perform remote attacks.

This post is also available in: English (英語)

概要

Unit 42は先日のBlack Hat Asia 2021に登壇し、Microsoft Internet Information Services(IIS)とSQL Serverを標的とする新たな攻撃対象領域に関する情報を発表しました。今回の発表で私たちは、IISおよびSQL Serverのリモートデータベース上で、SQLインジェクションまたはアドホックシナリオによりSQLクエリを実行する、これまで公開されたことのないテクニックについて紹介しました。また3ヶ月間で発見した約100件のJetの脆弱性の中から代表的な事例を3つ取り上げて紹介しました。本稿では、Microsoft Jet Database Engineの脆弱性を利用して脅威攻撃者がIISやSQL Serverをリモートから攻撃し、SYSTEM権限を奪取する手法の詳細について解説します。

この研究結果を受け、Microsoftは攻撃対象領域を緩和する複合的なセキュリティ更新プログラムをリリースしました。ただしこのセキュリティ更新プログラムはデフォルトでは無効なので、ほとんどのJetの脆弱性には修正が適用されていません。弊社のお客様は、レジストリでリモートテーブルアクセスを無効にする緩和策を積極的に有効化することにより、この種の攻撃に注意されることを強くお勧めします。くわえて、Access Connectivity Engine(ACE)の攻撃対象領域に対する緩和策はまだ不完全です。このため弊社は、MS JetおよびACEの両方に対する完全なセキュリティ更新をリリースするべく、Microsoftと協力してこれに取り組んでいます。

パロアルトネットワークスの次世代ファイアウォールをご利用のお客様は、App-IDと脅威防御セキュリティサブスクリプションを使うことでこれらの攻撃を緩和することができます。

攻撃対象領域

この新たな攻撃対象領域は、MS Jet Red (Jet Red Database Engine)やACE (Access Connectivity Engine)を含むMicrosoft Jet Database Engineがサポートするリモートデータベースアクセスに起因しています。リモートデータベースアクセスは実用的な機能ですが、セキュリティ上の問題が生じる可能性もあります。この機能が悪用されると、リモートの攻撃者は、自身がコントロールするサーバー上にある、完全にコントロールされたデータベースファイルに対し、SQLクエリを実行できるようになります。リモートの正規データベースファイルが不正データベースファイルに置き換えられてその上でSQLクエリが実行された場合、Microsoft Jet/ACEの求めるコードの前提条件や仮定が成り立たなくなり、多くのJetコンポーネントの脆弱性につながる可能性があります。

これらのJetの脆弱性によるセキュリティ境界全体への影響や綻びの程度は、SQLクエリがどこで実行されるかによって変わってきます。典型的な攻撃シナリオとしては、SQLインジェクションによるものとアドホックによるものがあげられます。これら2つのシナリオでは、攻撃者はIISやSQL Serverの不正データベースに対し、任意のSQLクエリを実行できます。この結果生じたJetの脆弱性がIISやSQL Serverに影響を与えることになります。具体的には、テーブルに対してSQLクエリを発行する際、ACEであればaddlinkedserverを、MS Jet であればOPENDATASOURCE OPENROWSETを使い、そのテーブルの前にデータベースパスを追加することで、ユーザーはリモートデータベースを割り当てることができます(図1参照)。

この図に示すように、テーブルにSQLクエリを発行する際、ACEであればaddlinkedserverを、MS JetであればOPENDATASOURCE、OPENROWSETを使ってそのテーブルの前にデータベースパスを追加すれば、ユーザーはリモートデータベースを割り当てることができる。
図1 Access、SQL ServerのリモートデータベースアクセスSQL

MS JetとACEの内部では、IISとSQL Serverのリモートデータベースファイルを開くためにCreateFileが呼び出されます。リモートデータベースの入力パスはUNCパスであることから、リモートデータベースを開くために、SMB(Server Message Block)とWebDAV(Web-based Distributed Authoring and Versioning)の両方が使用されます(図2参照)。

SMBとWEBDAVを使うIISとSQL Serverに存在するCreateFile(UNC)の隠し機能のスクリーンショット。
図2 IISとSQL Serverに存在するCreateFile(UNC)の隠し機能

SQLインジェクション、アドホックの2つのシナリオは、単に想定される数多の攻撃シナリオのなかの一例に過ぎません。同様に、IISやSQL Serverもまた、潜在的な被害コンポーネントの一例として取り上げたに過ぎません。MS JetとACEでコントロール可能なデータベース上で、ユーザーが任意のクエリを実行可能である限り、Windows上でMS JetとACEをサポートするコンポーネントは脆弱となる可能性があります。

IISおよびSQL Serverの脆弱性

攻撃者はリモートデータベースアクセスによって正規データベースを不正データベースに置き換えることができます。私たちの調査からはデータベースの置き換えはMS JetとACEの脆弱性を見つけるための鍵の1つとなっていることがわかっています。私たちは「MS JetやACEでのコード開発やテストではデータベースが不正な形式であるという状況を想定していない可能性がある」と考え、そこからSQLクエリとデータベースファイルの両方を変異させることを思いつきました。このファジング戦略にしたがって私たちはMS JetとACEに存在する約100件の脆弱性を発見しました(図3参照)。これらのほとんどはSQLインジェクションないしアドホックというシナリオでIISやSQL Serverを攻撃するのに利用可能です。

今回のリサーチで使ったファジング戦略で発見したMS JetとACEの脆弱性一覧
図3 約100件の脆弱性一覧

発表では、データベースファイルを1バイト変更するだけでMS Jetの脆弱性につながることが証明されました(図4参照)。

データベースファイルを1バイト変更するだけでMS Jetの脆弱性につながること示したスクリーンショット
図4 データベースをたった1バイト変異させただけで生まれる威力

マイクロソフトのセキュリティ更新プログラム

2021年5月に公開されたWindowsの月例セキュリティ更新でMicrosoftは私たちの発見にCVE-2021-28455を割り当てて、報告された新たな攻撃対象領域を修正しました。この修正プログラムでは、MS JetコンポーネントおよびACEコンポーネントにおいてユーザーがリモートデータベースアクセスを無効にできるオプションが導入されています。このオプションは、JETの脆弱性を1つ1つ修正するかわりに、IISやAccessなどMS Jetを使用する複数のアプリケーションにおいて、私たちが発表した攻撃対象領域全体を緩和するものです。

図5に示すように、(ebxレジスタで表される)rgtib構造体のオフセット904hにはリモートデータベースアクセス用の新しいフィールドがあります。_ltibAllocate関数ではデフォルトで「1」に設定されており、これはデフォルトで有効であることを意味しています。

rgtib構造体(ebxレジスタで表される)のオフセット「904h」には、ここに示したリモートデータベースアクセスのための新しいフィールドがある。_ltibAllocate関数ではデフォルトで「1」に設定されている。これはデフォルトで有効であることを意味する。
図5 rgtib構造体の新しいフィールドAllowQueryRemoteTablesに設定されたデフォルト値

この後はErrReadRegistry関数内でUtilRegQueryValue2関数が呼び出され、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\enginesレジストリエントリの下にあるレジストリキーAllowQueryRemoteTablesの値を取得します。その後、図6に示すrgtib構造体のAllowQueryRemoteTablesフィールドにこの値を格納します。

レジストリキーの値は、この図で示したrgtib構造体のAllowQueryRemoteTablesフィールドに格納される。
図6 UtilRegQueryValue2関数でレジストリからAllowQueryRemoteTablesフィールドを取得する

その後、図7に示すように、2つの関数(_ErrGetOutputDatabaseId_ErrQEMCompileQuery)が、(ecxレジスタで表される)rgtib構造体のAllowQueryRemoteTablesフィールドをチェックします。

この図に示すように2つの関数がrgtib構造体のAllowQueryRemoteTablesフィールドをチェックする
図7 rgtib構造体のAllowQueryRemoteTablesフィールドをチェックする

図8からわかるようにAllowQueryRemoteTablesフィールドが「0」に設定されている場合、データベースファイルがリモートであるかローカルであるかにかかわらず、_ErrGetOutputDatabaseId関数はエラーを返し、データベースファイルを開くためにErrTryOpenDatabase関数が呼び出されることはありません。これによリ、実質的にリモートデータベースアクセスの攻撃対象領域を緩和しています。

この図で示すように、AllowQueryRemoteTablesフィールドが「0」に設定されている場合、_ErrGetOutputDatabaseId関数がエラーを返し、データベースファイルを開くためにErrTryOpenDatabase関数は呼び出されなくなる。したがってリモートデータベースアクセスの攻撃対象領域は実質的に緩和される
図8 ErrGetOutputDatabaseId関数のAllowQueryRemoteTablesフィールドのチェック

ただしこの機能はデフォルトでは有効になっていません。リモートデータベースアクセスを無効にするには、こちらのMicrosoftの文書に説明されている対応レジストリにAllowQueryRemoteTablesという名前のレジストリを追加してdword値を「0」に設定する必要があります。

次世代ファイアウォールでの緩和策(CVE-2021-28455)

パロアルトネットワークスの次世代ファイアウォール(NGFW)をご利用のお客様は、セキュリティポリシールールの設定でWebDAVトラフィックがtrustゾーンからuntrustゾーンへまたがらせないようブロックすることによりCVE-2021-28455関連の攻撃から組織を保護することができます。

App-IDを設定してWebDAVのパケットをドロップする方法

ステップ 1: セキュリティポリシールールを作成します。

1. POLICIES > セキュリティの順に選択し、追加をクリックして新しいルールを作成します。

2. 名前にルール名を記入し、オプションで内容を追加します。

次世代ファイアウォールApp-IDセキュリティポリシールールの記入例
図9 セキュリティポリシールールを設定する

3. 送信元タブに移動して送信元ゾーンに「trust」を追加します。

セキュリティポリシールールの設定で送信元ゾーンに「trust」を追加
図10 送信元ゾーンの設定

4. 宛先タブに移動して宛先ゾーンに「untrust」を追加します。

セキュリティポリシールールの設定で宛先ゾーンに「untrust」を追加
図11 宛先ゾーンの設定

5. アプリケーションタブに移動してアプリケーションに「webdav」を追加します。

セキュリティポリシールール以下のアプリケーションタブに「webdav」を追加
図12 アプリケーションの設定

6. アクションタブに移動してアクション設定として「Drop」を設定します。

セキュリティポリシールールのアクションを選択
図13 アクションを設定

7. OKをクリックします。

ステップ 2: 変更をコミットします。

結論

IISやSQL Serverは、Microsoftのエコシステムにおける基本コンポーネントの例で、これらは多くのプロダクションシステムやサービスに広く導入されています。MS JetおよびACEを含むMicrosoft Jet Database Engineは20年以上前の製品で、Jetモジュールの大半が容易に悪用可能であることがわかっています。これはエクスプロイトからの緩和策が限られているためです。リモートデータベースアクセス機能は、IISやSQL ServerのコンポーネントとJetの脆弱性を結びつけることによってこれらのコンポーネントのセキュリティをJet Database Engineと同じレベルにまで引き下げてしまいます。攻撃者がこの機能を悪用してIISやSQL Serverを攻撃すれば、たった1つのSQLインジェクションでリモートからSYSTEM権限を奪取できる可能性があります。

パロアルトネットワークスは、すべてのお客様に、Microsoftのガイダンスに従ってこの深刻な攻撃対象領域の緩和のためにリモートデータベースアクセスを無効にすることをお勧めします。これにより攻撃者がJetの脆弱性を利用してIISやSQL Serverを侵害することを防ぎやすくなります。パロアルトネットワークスの次世代ファイアウォールをご利用のお客様は、App-IDと脅威防御セキュリティサブスクリプションを使ってこれらの攻撃を緩和できます。