** 本記事は、‘AuKill’ EDR killer malware abuses Process Explorer driver の翻訳です。最新の情報は英語記事をご覧ください。**
Sophos X-Ops は過去数ヶ月間にわたって、攻撃者が AuKill と命名した防御機能を回避する新しいツールによって、EDR クライアントを無効化する複数のインシデントを調査しました。AuKill ツールは、マイクロソフトのユーティリティである Process Explorer のバージョン 16.32 で使用されていた古いバージョンのドライバを悪用し、標的システムにバックドアやランサムウェアを展開する前に、EDR プロセスを無効化します。
AuKill ツールは、2023 年の初めから少なくとも 3 件のランサムウェアインシデントにおいて、標的の保護機能を妨害し、ランサムウェアを展開するために使用されています。1 月と 2 月には、攻撃者がこの EDR 妨害ツールを使用した後に Medusa Locker ランサムウェアを展開し、2 月には、Lockbit ランサムウェアを展開する直前に使用しています。
複数のサイバー攻撃グループが、コンピュータを保護している EDR エージェントを妨害するためのソフトウェアを同時に展開していることが報告されたのは今回が初めてではなく、ソフォスや他のベンダーが過去にも同じ攻撃を報告しています。2022 年 12 月に、ソフォス、マイクロソフト、Mandiant、SentinelOne は、攻撃者が独自に作成したドライバを使用して、EDR 製品を無効化していることを報告しています。
対照的に、今回の AuKill ツールでは、旧式で脆弱な正規のドライバが悪用されています。この手法は一般的に「BYOVD 攻撃」(脆弱なドライバの持ち込み)と呼ばれます。
Process Explorer のドライバを悪用して EDR システムを回避する方法は目新しいものではなく、2021 年 6 月に初めてその存在が明らかになったオープンソースツールの「Backstab」でも実装されています。実際、ソフォスなどのセキュリティベンダーは、Backstab やこのドライバのバージョンのいずれかが攻撃に使用された複数のインシデントを過去に報告しています。
たとえば、昨年 11 月に Sophos X-Ops は、LockBit ランサムウェアグループの攻撃者が Backstab を使用して、感染したマシンの EDR プロセスを無効化したことを報告しています。その 3 カ月後に Sentinel One は、MalVirt と呼ばれるツールに関するレポートを発表しました。このツールは、Process Explorer の同じドライバを使用して、セキュリティ製品を無効化してから、標的のマシンに最終的なペイロードを展開します。
ソフォスは、分析と脅威ハンティングを通じて、AuKill マルウェアの 6 つの亜種を収集し、オープンソースのツール「Backstab」と「AuKill」にいくつもの類似性があることを突き止めました。たとえば、特徴的なデバッグ文字列や、ドライバとやりとりするためのコードフローの論理がほぼ一致しています。
AuKill の作成者は、Backstab で導入された手法を応用しながら、複数のコードスニペットを使用し、マルウェアを構築した可能性があります。
正規のドライバの悪用と Procexp.sys
脆弱性のあるドライバを悪用して、セキュリティツールを無効化するサイバー攻撃者が増えています。ドライバは、カーネルメモリにある重要なセキュリティ構造体にアクセスできる下位レベルのシステムコンポーネントです。Windows では、デフォルトで「ドライバ署名の強制 (DSE)」と呼ばれる保護機能を採用しており、カーネルモードドライバが有効なコード署名機関によって署名されていることを確認してからその実行を許可します。この署名は、信頼の証となっており、ソフトウェアの ID を確認し、ユーザーのシステムを保護するために使用されます。
このセキュリティ対策を回避するために、サイバー攻撃者は、12 月のソフォスの調査で説明したように、信頼できる証明書で署名された悪意のあるドライバを入手する方法を考案するか、BYOVD 攻撃を仕掛けて、目的を達成するために正規の商用ソフトウェアのドライバを悪用する必要があります。
今回のケースでは、マイクロソフトが作成および署名したドライバが利用されました。Process Explorer ドライバは、Windows Sysinternals チームが制作した管理ツールの 1 つであり、実行中のプロセスとやりとりするためのさまざまな機能を実装しています。
AuKill は、PROCEXP.SYS という名前のドライバ (Process Explorer のリリースバージョン 16.32) を C:\Windows\System32\drivers にドロップします。正規の Process Explorer ドライバは通常、PROCEXP152.sys という名前で同じディレクトリに保存されています。Process Explorer のコピーが実行されているマシンでは、両方のドライバが存在することになります。また、AuKill のインストーラは、System32 または TEMP ディレクトリに実行可能な自身のコピーをドロップし、サービスとして実行します。
たとえば、ユーザーモードアプリケーションから IO 制御コード IOCTL_CLOSE_HANDLE を受け取り、保護されているプロセスハンドルを終了するようにドライバに命令し、結果としてプロセスを終了させることができます。
このプロセスを悪用するには、攻撃者がシステムで管理者権限を使用する必要があります。通常、攻撃者が管理者権限を取得すれば、マシンを完全に掌握できます。
しかし、エンドポイントクライアントなどの Windows の重要なプロセスは、攻撃者が権限を昇格して場合でも、無効化されることがないように、追加の保護機能を備えています。追加保護機能の例として、Windows 8.1 では「マルウェア対策サービスの保護 (Protected Antimalware Services)」の概念が導入されています。
攻撃者がこのような追加の保護機能を回避するためには、もう一段階踏み込んで、カーネルモードでドライバを実行しなければなりません。今回のケースでは、AuKill は Process Explorer が使用する正規のドライバを悪用し、これらの機能を無効化しています。
AuKill ツールを実行するには、管理者権限が必要ですが、このツールが攻撃者に管理者権限を付与することはできません。AuKill を使用しているサイバー攻撃者は、他の方法で権限を奪取し、その特権を利用しています。
AuKill の技術的な進化の分析
ソフォスはこの 3 ヶ月間、6 種類の異なるバージョンを収集し、各バージョンの機能の変化を追跡しました。分かりやすく説明するため、マルウェアのバージョンを古い順から AuKill V1 ~AuKill V6 と命名しています。
注意すべき点は、コンパイラと標的となるセキュリティコンポーネントが変更されていることです。図 1 に、以下のイベントを時系列で示します。
- AuKill の各バージョンがコンパイルされた日付のタイムスタンプ。たとえば、最初のイベントとして、AuKill V1 のバイナリがコンパイルされたタイムスタンプが 2022 年 11 月 13 日であることが表示されています。
- このバージョンに対応する検体がソフォスのシステムで初めてスキャンされた日付。たとえば、2022 年 11 月 17 日に、初めて AuKill V1 がソフォスの社内システムで検出されています。
- また、各バージョンを相関するために、このマルウェアが特定のランサムウェア攻撃で使用された日付のタイムスタンプを追加しました。2023 年 1 月 18 日に Medusa Locker のインシデントで使用された AuKill の検体は入手できませんでした。しかし、2023 年 2 月 14 日には、 Medusa Locker を展開しようとしていた別のインシデントで AuKill V1 が使用されていることを特定できました。
PE ファイルがコンパイルされた日付のタイムスタンプは改変される可能性がありますが、ファイルがコンパイルされた日時からソフォスのシステムで最初に検出されるまでに経過した時間を考慮すれば、コンパイルのタイムスタンプは正確である可能性が高いと思われます。
コンパイルのタイムスタンプ | SHA1 | バージョン | 標的ベンダー |
2022-11-13 09:07:47 | f7b0369169dff3f10e974b9a10ec15f7a81dec54 | V1 | ソフォス |
2022-11-29 05:58:14 | 23b531ae8ca72420c5b21b1a68ff85524f36203a | V2 | ソフォス |
2022-12-14 10:19:33 | 7f93f934b570c8168940715b1d9836721021fd41 | V3 | ElasticSearch、ソフォス |
2023-02-06 18:09:19 | ff11360f6ad22ba2629489ac286b6fdf4190846e | V4 | マイクロソフト、 ソフォス、Splashtop (リモートアクセスツール) |
2023-02-10 21:59:47 | fdfc977c1e679da8147cbbab037e523aa3fe65ef | V5 | マイクロソフト、ソフォス、Aladdin HASP Software |
2023-02-11 13:43:12 | bbfe4487f7fd02a085b83a10884487ad01cf62f7 | V6 | マイクロソフト、ソフォス、Splashtop (リモートアクセスツール) |
解析した各バージョンのコンパイルのタイムスタンプ、ハッシュ、標的ベンダー
今回は、AuKill V1 と AuKill V6 の検体を中心に分析しました。V1 は多くのインシデントで検出されていますが、AuKill V6 は試行錯誤を取り入れた実験的なバージョンのようです。以降のセクションでは、V6 をデバッグ (実験) バージョンと呼びます(このマルウェアの詳細な IoC (セキュリティ侵害の痕跡) は SophosLabs Github で公開されています)。
これらの 2 つのバージョンを比較することで、今後のアップデートの方向性に関する知見を得ることができます。
フェーズ 1:サービスのインストール
マルウェアが実行されると、最初に管理者権限があるかどうかを確認します。また、攻撃者がコマンドラインの最初の引数にキーワード (またはパスワード) を指定してファイルを実行するように求めます。これらの要件のいずれかが満たされない場合、実行は中止されます (攻撃者は、このツールを実行する前に管理者権限を取得する必要があります)。
この分析のセクションで取り上げた両方の検体 (および IoC に記載した 6 つのすべての検体) で、攻撃者は文字列「startkey」を最初のコマンドライン引数として渡す必要があります。
このマルウェアは、簡易な計算を使用してパスワードとキーワードを検証します。各文字の ASCII コードの 10 進数を導き、その値を 2 倍にして、次の文字の 10 進数に加算し、さらに 2 倍にするという処理を繰り返します。
計算が終わると、合計の結果が返され、ハードコードされている期待値 (この場合は 57502 (16 進数値 0xE09E) ) と比較されます。このアルゴリズムを python で実装したコードを以下に示します。
pwd = "startkey" # val end result = 0xE09E val = 0x0 for ch in pwd: val += ord(ch) val *= 2
図 4:パスワードチェックアルゴリズムの Python 擬似コード
検体が SYSTEM 権限で実行されていない場合、TrustedInstaller.exe のセキュリティコンテキストになりすまして、権限を昇格しようとします。
最初に、AuKill は TrustedInstaller サービスを開始します。次に、DuplicateTokenW WINAPI 関数を使って TrustedInstaller.exe のトークンを複製し、トークンを CreateProcessWithTokenW に渡し、プロセスを再起動して、自身を SYSTEM 権限に昇格します。/p>
最後に、C:\Windows\system32 に自身をコピーし、サービスとしてインストールし、サービスを開始します。
フェーズ 2:セキュリティの無効化
マルウェアは、サービスエントリを作成して常駐化し、procexp.sys をディスクにドロップします。このドライバは AuKill にリソースとして組み込まれています。この分析の対象となった両方のバージョンはいずれも、procexp.sys を C:\Windows\System32\drivers にドロップします。下図は V1 を逆コンパイルしたコードです。このコードでは、マルウェアがリソースから procexp.sys を読み取り、ディスクに書き込んでいます。
また、デバッグバージョンでは、procexp.sys のドロップとロードに失敗した場合の代替手段として、WindowsKernelExplorer.sys という名前のドライバへの接続を試行します。ただし、この代替のドライバは procexp.sys のようにリソースには埋め込まれておらず、このドライバが、System32\drivers フォルダにすでにあることを前提としています。
この時点では、リンク先のリポジトリにあるドライバが、悪用されているドライバであることは確認できません。
AuKill がサービスの再起動を防止する
EDR クライアントは通常、連携して動作するいくつかのコンポーネントから構成されています。たとえば、コンポーネントはインストールされるサービスや実行中のプロセスである場合がありますが、各コンポーネントには独自の機能が設定されてます。そのため、コンポーネントの 1 つがクラッシュまたは終了する場合、できるだけ早く再起動しようとします。
AuKill は、これらのコンポーネントの再起動を防ぐため、いくつかのスレッドを起動し、これらの EDR プロセスやサービスが必ず無効のままの状態になるように維持します。各スレッドは異なるコンポーネントを標的に攻撃し、対象のプロセスやサービスが実行されているかどうかを継続的に調査します。実行されているプロセスやサービスが 1 つでもあれば、AuKill は無効化または終了させます。これらのスレッドを初期化するコードを、図 6 に示します。
標的のベンダーやサービスは、検体によって異なります。図 6 以降では、リバースエンジニアリングによって特定できた EDR コンポーネントを無効化するさまざまな機能の分析結果について説明します。
1 – Procexp によるプロセスの終了
最初のタイプの関数は、プロセス名のリストを入力として受け取ります。上の画像ではこの関数は、TerminateViaProcexp と呼ばれています。
この関数は、実行中のすべてのプロセスについて繰り返し実行します。プロセス名がリストに含まれている場合、AuKill は procexp.sys に IO 制御コード IOCTL_CLOSE_HANDLE を送り、プロセスハンドルを終了します。これにより、対象となるプロセスを終了させます。
AuKill V6 では、この関数を実行する 2 つのスレッドが起動します。最初のスレッドではマイクロソフト関連のセキュリティプロセスのリスト、2番目のスレッドでは各ベンダーのリストを対象としています。これらの多くのプロセス名は、セキュリティベンダーのプロセスに関連しています。しかし、作成者は、標的プロセスのリストにリモートアクセスツールの名前も追加しています。
2 – 強制的な終了
2 つ目のタイプの関数は、セキュリティベンダー関連のプロセス名のリストを引数として受け取り、再び別のスレッドで実行します。AuKill は実行中のすべてのプロセスについてこの処理を繰り返し、リストにプロセス名が含まれている場合、TerminateProcess によってそのプロセスを強制的に終了します。
このスレッドはデバッグバージョンでは削除されていますが、AuKill のバージョン V2 など他のバージョンには含まれています。
3 – サービスの無効化
3 つ目の関数タイプは、上の画像で DisableServices と呼ばれています。この関数は、ハードコードされたサービス名のリストを入力として受け取ります。
AuKill は、リスト内の各サービス名について、その存在をチェックし、存在する場合は ChangeServiceConfigW を呼び出して dwStartType に SERVICE_DISABLED を渡して、無効化します。
AuKill V6 でも、この機能を実行する 2 つのスレッドが組み込まれていることが確認されています。
4 – ドライバのアンロード
最後の関数タイプは、図 6 に示すように「Unload Driver」と呼ばれており、ハードコードされたドライバ名のリストを入力として受け取ります。
AuKill は、各ドライバ名について NtUnloadDriver を呼び出し、ハイブ System\CurrentControlSet\Services\[DRIVER_NAME] にある対応するレジストリキーを削除してアンロードしようとします。
この機能は AuKill V6 でしか確認されていません。
2023 年になってドライバの悪用が増加している
<p防御メカニズムを無効化しようとするサイバー攻撃者は、ドライバを使用して EDR クライアントを無効化しようとしています。このような攻撃では、正規のドライバが利用されることも、悪意のある目的でドライバが持ち込まれることもあります。また、窃取されたあるいは漏洩した証明書でドライバが署名されている場合もあります。
昨年、セキュリティ業界では、悪意のある目的のためにドライバを武器化したインシデントが複数報告されています。このようなツールが発見されていることから、サイバー攻撃者がドライバを武器化して悪用する攻撃が継続することが予測され、今後、このような攻撃はさらに進化する恐れがあります。
検出について
現在、ソフォスは AuKill の亜種を ATK/BackStab-D として検出しています。さらに、この記事で説明した攻撃シナリオに対して、挙動検知 (Priv_5a の挙動ルールなど) の方法で顧客を保護しています。これらの保護対策では、ユーザーは Process Explorer の正規のコピーを引き続き実行できます。ソフォス製品は Process Explorer の正規のドライバが通常の目的で使用されるときには、検出や削除は行いません。
ソフォスは、この廃止予定の Process Explorer ドライバが悪用されていることをマイクロソフトに通知しています。
最後に、企業やエンドユーザーは、所有および使用しているコンピュータをドライバの不正使用から保護するために、以下の追加の対策を講じることが推奨されます。
- エンドポイントセキュリティ製品に改ざん防止機能が搭載されているかどうかを確認しましょう。このような改ざん防止機能は、これらの攻撃に対して強力な保護レイヤーになります。ソフォス製品を使用しており、改ざん防止機能を有効にしていない場合には、今すぐに有効にしてください。
- Windows セキュリティロールを適切に管理してください。この攻撃は、攻撃者が権限を昇格するか、管理者権限を奪取できる場合にのみ可能です。ユーザー権限と管理者権限を適切に分離し、最小権限の原則を適用することで、攻撃者は簡単にドライバをロードできなくなります。
- システムは常にアップデートして最新の状態を維持してください。12 月の調査でも報告していますが、Windows は、マイクロソフトが証明書を失効させているドライバや、過去に悪用されたことがあり廃止予定のドライバのリストを管理しており、Windows Update を通じてこれらのリストを更新しています。
- また、オペレーティングシステムだけでなく、アプリケーションや他のツールも更新されているかどうかを定期的に確認し、不要になったツールは削除することも重要です。
- 正規のドライバが悪用される場合もあります。この問題は、脆弱なドライバがすでにシステムに存在している場合に発生します。強力な脆弱性管理プログラムは、このような弱点を解消するのに役立ちます。
この記事で参照されているファイルの IoC は、SophosLabs の Github で公開されています。
謝辞
SophosLabs は、このブログに関する技術的な検証に協力した Michael Wood と Felix Weyne に感謝します。