poortry
脅威の調査

攻撃ツールのアップデートにより Windows コンピュータに障害が発生

Sophos X-Ops が 3 年間追跡してきた EDR キラーが、ランサムウェア攻撃に狙われる組織を悩ませ続けています。

** 本記事は、Attack tool update impairs Windows computers の翻訳です。最新の情報は英語記事をご覧ください。**

2022 年と 2023 年に、Sophos X-Ops はエンドポイント保護ソフトウェアの機能を妨害するツールセットに関する調査結果を発表しました。このツールセットは、複数の主要なランサムウェアグループにより共同で開発され、使用されていました。Mandiant が以前、ツール本体を Poortry、そのローダーアプリケーションを Stonestop と命名しています。

Poortry ツールの作成者は、Microsoft の認証署名プロセスを通じて、悪意のあるカスタムカーネルレベルドライバーに署名することに成功しています。ソフォスが調査結果を公表し、Microsoft がこれらのドライバーに署名させる抜け穴を塞いだ後も、ツール製作者の活動は停止しませんでした。攻撃者は検出を回避し、EDR とエンドポイント保護ソフトウェアを無効化する新しい方法を見つけようと、Poortry ドライバーに機能を追加し続けています。

Poortry の新機能を説明するために、ドライバーが OS とどのように相互作用するのか、そしてこの EDR キラーの開発者が時間をかけてどのようにツールを進化させてきたのかをおさらいしましょう。

Windows ドライバーが保護を妨害する方法

ほとんどの EDR キラーは、OS のカーネルにロードされるデバイスドライバーに依存しています。カーネルにロードされることにより、低レベルの機能へのアクセスを取得し、さまざまな種類の保護ソフトウェアを停止・終了できるようになります。

多数の周辺機器や接続されたコンポーネントをサポートする Windows では、カーネルモードドライバーはこの種の低レベル機能に対して大きな権限を与えられています。通常の状況下では、これらのドライバーは他社や他メーカーのソフトウェアやハードウェアと相互作用することはありませんが、そうでない場合も存在します。したがって、署名された正規のドライバーが、自身と相互作用するプロセスを適切に検証しない場合、EDR キラーはその機能の一部を悪用してデバイスの保護を停止できます。

Microsoft は、ドライバーのロードを OS から制御できるように、さまざまな方法を開発してきました。その一例が「ドライバー署名の強制」メカニズムです。このメカニズムでは、ロードされるドライバーは Microsoft が信頼するソフトウェアパブリッシャーによってデジタル署名されている必要があります。

EDR キラーの開発者は、この信頼メカニズムの抜け穴を悪用します。攻撃者は、以前に正規のソフトウェア会社によって発行された、悪用されやすいドライバーを使用するかもしれません。あるいは、正規のコード署名証明書 (盗まれた証明書や流出した証明書を入手する多くの方法があります) を使用して、独自のドライバーに署名するかもしれません。

一般的に、EDR キラーの開発者がコードの署名を悪用する方法は 3 通りあります。

流出した証明書の悪用

この方法は最も単純明快です。正規の組織から流出した、窃取された、あるいは侵害されたコード署名証明書を入手し、その証明書を用いて自身のドライバーに署名します (あるいはルート認証局を騙して証明書を発行させます) 。

Microsoft は、Windows 10 バージョン 1607 以降に公開されたすべてのバージョンの Windows におけるカーネルモードドライバーのサードパーティ開発者全員に対し、Microsoft の開発者ポータルにドライバーを提出し、Microsoft によるクロス署名を取得することを要求しています。ただし、Microsoft によって署名されていないクロス署名ドライバーでも、以下のいずれかを満たす場合はロードが許可されます。

  • PC が Windows の以前のリリースから Windows 10 バージョン 1607 にアップグレードされたものである場合
  • システム BIOS でセキュアブートがオフになっている場合
  • ドライバーが 2015 年 7 月 29 日より前に発行され、クロス署名 CA に紐づけられたエンドエンティティ証明で署名されている場合

アップデートにより、侵害された証明書によって署名されたクロス署名ドライバーの危険性が低減されたとはいえ、3 つ目の条件は、攻撃者に対して第 2 の方法を可能にする抜け穴を形成しています。

署名タイムスタンプの偽造

古いドライバーとの互換性を維持するため、Windows は「2015 年 7 月 29 日以前に発行され、サポートされているクロス署名 CA に紐づけられたエンドエンティティ証明書」で署名されたドライバーのロードを許可します。

カーネルドライバーに署名する際、Microsoft はソフトウェアの発行者に signtool.exe というツールを提供します。
このツールは提供されたファイルに署名するだけでなく、提供された証明書が有効であることを確認します。証明書の確認には、関数などが用いられます。

攻撃者は、OS 内部の低レベル API コールに一連のフックをかけることで署名プロセスを変更し、ツールによる有効性のチェックを回避して独自のカーネルドライバーに署名します。この手法でフックされる関数の1つが GetLocalTime です。この関数は signtool.exe のチェックを通過するための偽造タイムスタンプを返します。

Microsoft の認証署名プロセスを回避

最後の方法は、Microsoft の認証署名プロセスを通り抜けて、カーネルドライバーに Microsoft から直接署名してもらうことです。おそらくは達成するのが最も難しい方法ですが、デジタル署名の「聖杯」とも言える、Microsoft 自身が発行した強力な WHQL 証明書を署名に利用できます。

このプロセスを悪用するためには、以下の要件が必要です。

  • 有効な EV 証明書
  • Microsoft 開発者ポータルへのアクセス

これらの要件を満たせば、ドライバー本体を含む CAB ファイルを作成し、EV 証明書で署名し、ダッシュボードに提出できます。

提出されたドライバーは、悪意のあるものでないことを確認するためにいくつかのチェックを受けます。これらのテストに合格したドライバーには、「Microsoft Windows Hardware Compatibility Publisher」の署名が付与されます。

an attestation signed driver
2022-2023 年の攻撃に使用された WHQL 署名入りドライバーの内の 1 つ

2022 年以来の脅威である Poortry と Stonestop

Poortry (BurntCigarとも) は、Stonestop (このツールの存在を最初に報告した Mandiant により命名) というローダーと共に使用される悪意のあるカーネルドライバーです。このドライバーは、上述の 3 つの手法のいずれかを使用することで、ドライバー署名の強制メカニズムを回避します。カーネルドライバーおよびローダーのどちらも、VMProtect、Themida、ASMGuard などの商用またはオープンソースのパッカーにより大きく難読化されています。

2022 年末から 2023 年半ばにかけて、Poortry の亜種には Microsoft WHQL 証明書が添付されていました。しかし、Sophos X-Ops と Microsoft の共同作業により、この証明書で署名されたサンプルのほとんどが発見され、Microsoft はこれらのドライバーに署名するために悪用されたアカウントを無効化しました。

Poortry の製作者たちはその後すぐに、署名タイムスタンプの偽造や侵害された有効な証明書の入手に攻撃手法を切り替えました。

昨年 1 年間で、少なくとも以下 5 組の主要なランサムウェアグループが関与する攻撃において Poortry の使用が確認されました。

  • CUBA
  • BlackCat
  • Medusa
  • LockBit
  • RansomHub

2023 年以降、私たちは攻撃者が攻撃を通じて Poortry をくり返し使用するのを確認しています。ソフォスが以前の調査で観測した 1 つの特徴は、Poortry の製作者がパッカーを頻繁に変更し、オリジナルをベースにわずかに修正された亜種を大量に作り出していることです。ソフォスの調査では、異なる商用または非商用のパッカーで圧縮された、WHQL 署名付きの亜種を複数発見しました。

この抜け穴は現在閉ざされているため、Poortry の開発者は現在、Microsoft 以外のさまざまな証明書で署名されたドライバーを使用しています。

下図は、Poortry のペイロードドライバーが 15 か月の間に使用した署名者名を時系列順に示したものです。

BurntCigar driver signing certificates over time In the past 17 months, the threat actors swapped the signing certificates they used for their executables at least nine times

インシデント対応中に観測されたものもあれば、テレメトリとして収集されたものもあることに注意してください。1 つ確かなことは、使用された証明書の総数と種類は、私たちの観察だけでは判断できないほど多いということです。

さまざまな証明書の利用

ソフォスは時々、攻撃者が攻撃中に同一資産内の異なるマシンに Poortry の亜種を展開するのを確認しています。
これらの亜種には同じペイロードが含まれていますが、攻撃で最初に使用されたドライバーとは異なる証明書で署名されています。2023 年 8 月には、Sophos X-Ops の調査において、攻撃者が SplashTop という名前のリモートアクセスツールを介して初期アクセスを取得していることが判明しました。攻撃者はネットワークに侵入するとすぐに Poortry と Stonestop を展開しました。しかし、署名者名である「bopsoft」はすでに侵害された証明書として知られていたため、動作検知ルールによりブロックされました。

「Bopsoft」により署名されたコードを用いた最後の試みの 30 秒後、攻撃者は「Evangel Technology (HK) Limited」によって署名された別の Poortry ドライバーをロードしました。このホストはすぐに隔離され、攻撃は阻止されました。

Threat actor swaps signed binary mid-attack While laying the ground for a ransomware deployment, the threat actor repeatedly attempts to deploy the PoorTry driver. When Sophos endpoint protection halts the attack, they switch to a driver installer signed with a different signing certificate.

EDR キラーから EDR ワイパーへの移行

2024 年 7 月、攻撃者が RansomHub ランサムウェアの展開を試みるインシデントに対応していた際、Sophos CryptoGuard のアナリストは攻撃者のアクセスポイントを遮断することで、データ暗号化の試みを阻止しました。インシデント後の分析により、最終的なランサムウェア攻撃の前に、さらに 2 件の実行ファイルが複数のマシンに配信されていたことが判明しました。

<d>\Users\<u>\desktop\c7iy3d.exe
<d>\Users\<u>\appdata\local\temp\usnnr.sys

静的分析と動的分析の組み合わせにより、これらのファイルは Poortry と Stonestop であることが判明しました。以前のバージョンと今回のバージョンで確認された相違点として、Poortry は重要な EDR コンポーネントのプロセスを単に終了させるだけでなく、コンポーネントを完全に削除することもできるようになっていました。

Trend Micro は 2023 年、Poortry にディスクからファイルを削除する機能が追加されたことを報告していましたが、この機能が攻撃に使用されるのが確認されたのは今回が初めてでした。

最新の亜種の詳細

Stonestop の実行ファイルと Poortry ドライバーはどちらも厳重に圧縮され、難読化されていました。このローダーは、Github で利用可能な ASMGuard というクローズドソースのパッカーによって難読化されています。

PoorTry driver properties shown in CFF Explorer
CFF エクスプローラーに表示された PoorTry ドライバーのプロパティから、ファイルが 2024 年 8 月に作成されたことが確認できます

このドライバーは、「FEI XIAO」という名前で署名されています。Sophos X-Ops は、この署名のタイムスタンプはドライバーへの署名のために偽造されたものだと確信しています。注目すべきことに、このドライバーは市販のソフトウェアである Tonec Inc. の Internet Download Manager のドライバー (idmtdi.sys) と同じ情報をプロパティシートに使用することで正規のドライバーへの擬態を試みています。情報が丸写しされているだけで、このドライバーは実際には Internet Download Manager のドライバーではありません。

PoorTry driver property sheet
作成日より 10 年以上前の有効期限が記載された PoorTry ドライバーのプロパティシート

説明の都合上、実行の流れを 3 つの異なる段階に分けます。

初期アクセス段階

ソフォスが追跡したインシデントでは、攻撃者は Poortry と Stonestop を同じディレクトリに一緒に配信していました。実行されると、Stonestop はカレントディレクトリに対応するドライバーがあるかどうかをチェックします。

an error message will be displayed that the loader failed connecting to the kernel driver.
ローダーがカーネルドライバーへの接続に失敗したときに表示されるエラーメッセージ。

ドライバーのファイル名とデバイス名は、いずれもローダーにハードコードされています。起動時に、ローダーは悪意のあるカーネルドライバの制御権を取得し、DeviceIoControl API コールを介してハードコードされた文字列をドライバーに送信することでハンドシェイクを開始します。

全体として、コンポーネント間の通信はこの DeviceIoControl API を通じて行われます。カーネルモードコンポーネントが提供する各機能は、異なる IOCTL コードを送信することでトリガーされます。以前のバージョンでは、IRP_MJ_DEVICE_CONTROL ハンドラーを介して通信が行われていました。現在のバージョンは、I/O リクエストパケットを受け取るために IRP_MJ_MAXIMUM_FUNCTION ハンドラーを使用しています。

IOCTL コードと機能との対応関係が、前回の分析時から変更されていることは注目に値します。例えば、プロセス ID によって特定のプロセスを強制終了するコマンドは、以前はコード 0x222094 で I/O リクエストパケットを送信することでトリガーされていました。最新のサンプルでは、同じ機能に IOCTL コード 0x222144 が割り当てられています。

Trend Micro による 2023 年のレポート以降、Poortry の開発者は受信可能な IOCTL コードを 10 件から 22 件に増やしました。利用可能なすべての機能の分析は継続中です。

以前のバージョンと同様に、ハンドシェイクはハードコードされた文字列をドライバーに送信することで開始されます。ハンドシェイクの値を受信すると、悪意のあるドライバーの機能を有効にするフラグがバイナリにセットされます。

Handshake value sent to Poortry
Poortry に送られたハンドシェイクの値

侵害段階

第 2 段階は、カーネル通知ルーチンの削除や変更など、一連の異なる手法によって EDR 製品を無効にすることに重点を置いています。

セキュリティドライバーは、Windows システム上で特定のイベントが発生したときにコールバックを登録するため、Windows OS が提供するいくつかの異なる機能を利用します。
例えば、PsSetCreateProcessNotifyRoutine 関数は、新しいプロセスが作成された際にドライバーにより提供されるコールバックルーチンを追加します。

多くの場合、これらのコールバックルーチンを削除することが EDR 製品を無効化するのに重要です。2022 年には、BlackByte ランサムウェアが正規の脆弱なドライバを悪用し、重要なカーネル通知ルーチンを削除した同様の事例についても記事にしました。

第 2 段階では、合計 7 件の異なる IOCTL コードがカーネルモードコンポーネントに送信されるのが確認されました。0X222400 に割り当てられた機能のみが実行されます。他の機能は、バイナリに特定のフラグが設定されているため、早々に無効化されました。トリガーされない機能は、実験的なものか、特定のタイプのシステムでのみトリガーされるか、あるいは単に無効化されているものだと思われます。

IOCTL コードと対応する動作は以下の通りです。

0x2220C0 (無効)

受信すると、Poortry は追加の初期化ルーチンに入り、さまざまな主要構造や関数のアドレスを取得します。

0x222100 (無効)

受信すると、Poortry は PspNotifyEnableMask フラグを変更することで、カーネルコールバックを無効または有効にしようとします。
この活動は、本記事で説明されているように、カーネルルーチンコールバックを有効または無効にするためにルートキットが使用する一般的な手法です。

0x222104 (無効)

この IOCTL コードを受信すると、Poortry は PsProcess、PsThread、ExDesktopObj オブジェクトタイプのカーネルコールバックを変更します。これらは Windows カーネルにおいて特定のオブジェクトを表すカーネルモードのデータ構造です。PsProcess オブジェクトタイプはその名の通り、プロセスオブジェクトを表します。これらのオブジェクトタイプには、対応するオブジェクトに登録されているコールバックを指す変数も含まれています。

この機能は無効化されているため、攻撃者がこれらのコールバックリストをどのように改ざんするかについては不明です。考えられる 1 つの可能性は、コールバックをカスタム関数に設定することでコールバックを完全に無効にし、何の機能も持たせず即座に返答のみを行うことかもしれません。

Modifying the object type's callback lists
オブジェクトタイプのコールバックリストの変更

0x222108 (無効)

受信すると、Poortry は CmpCallbackCount 変数を変更してレジストリカーネルコールバックを有効または無効にします。この変数は、登録されたコールバックの数をカウントするのに使用されます。この値がゼロになるようにパッチを当てると、コールバックは役に立たなくなると考えられます。

0x22210C (無効)

受信すると、Poortry は DeviceIoDetachDevice 関数を使用して fltMgr.sys ドライバーを \\FileSystem\\FastFat および \\FileSystem\\Ntfs のデバイスから削除しようとします。この関数は通常、有効なドライバーがシャットダウン中にクリーンアップするのに用いられます。
しかし、ルートキットはこの関数を利用して、標的となるドライバがそれ以上の I/O 要求を受け取らないようにできます。

fltMgr.sys は Windows のフィルターマネージャーです。このドライバーは、Windows システム上の既存の機能を拡張または変更するために使用されます。また、このドライバーは EDR 製品でしばしば使用されます。

ソフォスは、IoDetachDevice を使用してこのドライバーを取り外すことで、インストールされているフィルターが標的のシステム上で役に立たなくなる可能性があると考えています。

 

0x2221C0 (無効)

受信すると、Poortry は ClassPnp.sys と ntfs.sys の主要な関数ハンドラー、例えば ntfs.sys の NtfsFsdClose や NtfsFsdRead のアドレスを取得するルーチンを開始します。したがって、このルーチンは他の機能で使用される重要な関数のアドレスを取得するための追加の初期化ルーチンとして使用できるものだと思われます。

0x222400 (有効)

受信すると、Poortry はインストールされたカーネルコールバックを一連の異なる手法で無効にします。ユーザーモードコンポーネントには、I/O リクエストパケットが送信される際に標的となるドライバーの名前が含まれています。

Overview of patching routines and handshake check
パッチルーチンとハンドシェイクチェックの概要

PsSetLoadImageNotifyRoutine、PsSetCreateThreadNotifyRoutine、PsSetCreateProcessNotifyRoutine を介してインストールされたカーネルコールバックにパッチを適用します。Poortry はコールバック関数の序盤で、入力を受けると即座にゼロを返すように最初の命令を修正します。

Comparison before and after prologue patching
コールバック関数にパッチを当てた前後の比較

これまでのところ、カーネルコールバックとセキュリティドライバーを無効化する手法として、以下の手法を確認しました。

  • 対応する関数 PsSetLoadImageNotifyRoutine、PsSetCreateThreadNotifyRoutine、 PsSetCreateProcessNotifyRoutine で使用される内部構造がくり返し処理されます。コールバックがタグ付きのセキュリティドライバーに属している場合、登録されたコールバック関数は最終的に意図された処理を実行することなく直ちに終了します。
  • Windows カーネルは、PsProcess、PsThread、ExDesktopObject など、Windows OS の基本要素を表す重要なデータ構造を実装しています。これらの構造体には、特定のオブジェクトに関連するすべてのコールバックルーチンを管理する CallbackList という変数が含まれています。Poortry はこのリストをくり返し処理し、コールバックがタグ付きのセキュリティドライバーに属している場合、登録されたコールバック関数は最終的に意図された処理を実行することなく直ちに終了します。
  • CmRegisterCallback と CmUnregisterCallback で使用される内部リンクリストがくり返し処理されます。このリンクリストは、登録されたレジストリとオブジェクトコールバックへの関数ポインタを含んでいます。コールバックがタグ付きのセキュリティドライバーに属している場合、コールバック関数の序盤にパッチが適用されます。
  • Poortry は fltMgr.sys からエクスポートされた関数 FltEnumerateFilters を使用して、適用されたフィルタをくり返し処理します。フィルタがタグ付きのセキュリティドライバーに属している場合、コールバック関数の序盤にパッチが適用されます。
  • この機能を直接トリガーすることはできませんでしたが、Poortry が IoDetachDevice 関数を悪用してシステムのデバイススタックからデバイスオブジェクトを取り外す機能を持つ証拠を発見しました。IOCTL コード 0x22210C が提供する機能とは逆に、この関数は柔軟性が低く、デバイス名が DeviceIoControl を介して送信された入力名と一致する場合にのみデバイスを取り外します。

クリーンアップ段階

侵害の発生後、EDR キラーは重要なファイルをディスクから消去することによってセキュリティ関連のプロセスを終了させ、EDR エージェントを使用不能にするのを試みます。

まず、ユーザーモードコンポーネントがカーネルモードコンポーネントに IOCTL コード 0x222144 でキルするプロセスのプロセス ID を含む複数の I/O リクエストを送信します。

ローダーには、EDR 製品がインストールされている場所を指すハードコードされたパスのリストが含まれています。ローダは、フォルダ内のすべてのサブフォルダとファイルをくり返し処理し、コード 0x222180 の IOCTL 要求をドライバに送信して、EXE ファイルや DLL ファイルなど、EDR エージェントにとって重要なファイルを削除します。送信される要求には、削除するファイルのパスが含まれています。

注目すべきは、ユーザーモードコンポーネントが 2 つのモードで動作できることです。

  • ファイルの種類にしたがってファイルを削除するモード
  • ファイル名にしたがってファイルを削除するモード

ソフォスは、EDR キラーの製作者が異なる標的を狙う際の柔軟性を確保するために、これらの操作モードを追加したのではないかと考えています。また、EDR 製品のインストールフォルダを指すハードコードされたパスのリストは標的によって異なると考えています。

Implementation of deleting files by type
ファイルの種類にしたがったファイル削除の実装

結論

Poortry とその関連ローダーである Stonestop は、ソフォスと Microsoft が EDR キラーによる WHQL 署名メカニズムの悪用に関する共同レポートを発表してから 20 か月の間に、深刻な機能強化が行われました。Pootry は、かつてはエンドポイント保護コンポーネントのフックを解除するために用いられる比較的単純かつ「厄介な」ツールに過ぎませんでした。しかし現在では Poortry 自体が悪意のある機能を満載した「スイス製のアーミーナイフ」と化しており、ドライバー署名の検証による保護を回避するため、事実上無限に供給される侵害された、あるいは不適切に使用されたコード署名証明書を悪用しています。

Poortry の開発者は、EDR やエンドポイント保護ソフトウェアの改ざん防止ドライバーの無効化以上の機能を持たせることで、自らのツールを差別化しています。Poortry は、低レベルの OS 機能を制御するために使用される多くの異なる API コールをある程度制御することもできるルートキットのようなものへと進化しました。また現在では、ランサムウェアの展開に際して障害となるセキュリティソフトウェアをディスクから完全に消去する能力も備えています。