Acronisの「ngscan」アンチマルウェアスキャンドライバは、フィルタ通信ポートに設定された不適切/不正なアクセス制御に起因する脆弱性を抱えています。 このミニフィルタドライバは、以下の悪用可能な機能をサポートしています。
ngscan.sysドライバの解析は、Ida Proでドライバを逆コンパイルすることから始めました。研究者は、デバイスオブジェクトは作成されるものの、DeviceIoControlを使用してドライバと対話するためのシンボリックリンクは作成されないことに注目しました。
そのため、解析はフィルタ通信ポートの機能を観察することで続けられました。
初期化中、ドライバは5つの通信ポートを作成し、他のプロセスからの対話をサポートします。

図1: 最大5つのフィルタ通信ポート(FCP)の作成をサポートするルーチン
この関数が呼び出され、5つのFCPそれぞれがデフォルトのDACLで初期化され、最後のFCPがNULL DACLで作成されることが確認されました。

図2: デフォルト/NULL DACLでのFCP作成
解析は、フィルタドライバによって指定されたCreateNotifyCallbackおよびMessageNotifyCallback関数の観察に移りました。 これらのコールバック関数は、プロセスが接続を開き、通信ポートにメッセージを送信するたびに呼び出されます。

MessageNotifyCallbackの最初の検査では、受信メッセージのバッファが以下の要件を満たす必要があることが示されました。
これらのチェックを通過すると、InputBufferから関数番号が解析され、以下のswitchケースで指定された関数を選択して、提供された入力で実行します。

図3: MessageNotifyCallbackでサポートされる関数のサブセット
サポートされている各関数を検査すると、任意のファイル読み取りにつながる悪用の可能性がある2つの関数が注目されました。

図4: スキャンコンテキストを作成し、スキャンコンテキストのファイルハンドルを返す関数(Line 206, 233)
「スキャンコンテキスト」の正確な機能は完全にはわかっていませんが、解析により、ユーザーのInputBufferで指定された任意のファイルに対してファイルスキャンコンテキストを作成できることが示されました。 スキャンコンテキストが作成されると、スキャンコンテキストIDが出力バッファを介してユーザーに返されます。

図5: スキャンコンテキストデータをユーザーに返すCreate Scan Contextルーチン

図6: 保護されたSAMレジストリファイル(\??\C:\Windows\System32\config\SAM)へのアクセスを要求してミニフィルタドライバに送信されたデータ

図7: スキャンコンテキストID(0x3aaf)を含むミニフィルタドライバからの応答
スキャンコンテキストが作成され、IDが取得されると、再度通信ポートにメッセージを送信することで、要求元アプリケーションでスキャンコンテキストが作成されたファイルへのハンドルを開くことができます。

図8: 作成されたスキャンコンテキストのファイルハンドル取得
CreateFileReturnHandle0として指定された関数は、前の関数SearchScanContextsByIDが有効なスキャンコンテキストを返した場合にのみ呼び出されました。
例えば、要求元プロセスが前述のスキャン作成関数を呼び出して以前に作成された有効なコンテキストIDを提供した場合のみです。
要求元プログラムは、図8(図4、Line 233)で指定された関数にスキャンコンテキストIDを提供することで、特権ファイルへのハンドルを正常に開きました。

図9: SAMファイルのファイルハンドル取得成功
processhackerを使用して、要求元プロセスのハンドルを表示することで、ファイルハンドルへのアクセスが確認されました。

図10: SAMファイルへのハンドルを含むプロセス

図11: 取得したハンドルに読み取りアクセスが許可されている
サポートされている関数のさらなる調査により、コード実行を獲得するために悪用される可能性がある3つのレジストリキーの制御が示されました。

図12: レジストリキーへのハンドルを開くことをサポートする関数

図13: プロセスに注入するフックモニターDLLを指定するレジストリキーを開く

図14: ユーザー制御データでレジストリキーを変更する機能を示すOpenKey関数
AcronisスイートによるフックのためのDLLインジェクションの状況は特定されませんでしたが、フック監視が有効になっている場合、x64HookLibおよびx86HookLibレジストリキーで指定されたDLLが、指定されたプロセスに注入されると考えられます。

図15: フックDLL C:\ProgramData\Acronis\NGMP\shared\acr_protect.x64.dll を指定するx64HookLibKey
スキャンコンテキストを開くプロセスは、任意ファイル読み取りの解析では事前に許可されています。
プロセスは、スキャンコンテキストを作成する代わりに、GetScanContextByID関数にリクエストを繰り返し発行し、ContextID値をループして1つ以上の有効なスキャンコンテキストが見つかるまでブルートフォースすることができます。