サイバーリーズンのGlobal Security Operations Center(GSOC)では、影響力のある脅威に関する情報を提供するために、サイバーリーズン脅威レポートを発行しています。このレポートは、そのような脅威を調査した上で、脅威から企業や組織を守るための実践的な推奨事項を提供するものです。

この脅威分析レポートにおいて、GSOCはStealBitマルウェアについて調査しています。StealBitとは、LockBitという脅威グループが開発と保守を行っているデータ流出ツールです。LockBitグループは、同グループが運営しているランサムウェアアフィリエイトプログラムの一環として、StealBitをアフィリエイトに提供しています。ランサムウェアオペレーターは、二重脅迫を実行するために、StealBitを使用して、侵入先のシステムからデータを流出させます。

本レポートでは、StealBitの機能とアーキテクチャをはじめ、さまざまなサンプル間におけるStealBitの構成や実装面での進化について、詳細な洞察を提供します。StealBitの仕組みや進化に関する詳細な洞察は、悪意あるアクターがランサムウェアの導入前にStealBitを使ってデータを流出させるようなランサムウェア攻撃オペレーションを、タイムリーに検知するために役立ちます。

StealBitマルウェアに関する主なポイント

機能のアップデートと標的ベースの拡大:StealBitの古いサンプルと新しいサンプルを比較分析すると、StealBitでは新機能(特に回避および隠蔽機能)の改良が進んでいることが分かります。また、旧サンプルは、旧ソ連圏諸国(ロシア、ウクライナ、ベラルーシ、タジキスタン、アルメニア、アゼルバイジャン、ジョージア、カザフスタン、キルギスタン、トルクメニスタン、ウズベキスタン、モルドバ)にあるシステム上では実行できないように設計されていますが、新しいサンプルは、この制限を実装しておらず、あらゆるシステム上で実行できるようになっています。

データ流出の効率を最大限に高めるような設計:StealBitは、データ流出アクティビティの全体的な効率性を最大化するために、Microsoftの入出力(I/O)完了ポートが提供するスレッドモデルを実装しています。たとえば、StealBitは、複数のファイルの内容の流出を並列化することで、全体的な流出時間を短縮させます。これは、ランサムウェアオペレーターにとって重要となります。なぜなら、データ流出が高速であるほど、その処理中に発見される可能性が低くなるからからです。

使用上の利便性と拡張性を最大限に高めるような設計:SealBitは、拡張可能なやり方で多くのファイルを流出用に指定できるように、1つの侵入先のシステム上で実行される複数のStealBitプロセス間での「プロセス間通信(IPC)」を実装しています。また、StealBitは、StealBitオペレーターが感染先のシステムのグラフィカルユーザーインターフェイスにアクセスできる場合に、流出させるファイルやフォルダをStealBitウィンドウにドラッグ&ドロップすることをサポートします。この機能を使うと、StealBitオペレーターは、便利でかつスケーラブルなやり方で、多くのファイルを流出用に指定できるようになります。

やや不完全な実装:我々が分析したStealBitの機能のうちのいくつかは、実装が不完全でした。これには、LockBit脅威グループが、アンダーグラウンド市場における代替流出ツールにとって有利であると宣伝している機能(流出データの圧縮や操作の非表示モードなど)が含まれています。たとえば、我々が分析した最近のStealBitサンプルは、流出したデータを圧縮せず、StealBitが作成したウィンドウを適切に隠さないため、侵入先のシステムのグラフィカルユーザーインターフェイスで同マルウェアが見えるようになっていました。

StealBitマルウェアの検知と防御:Cybereason Platformは、StealBitマルウェアがデータを流出させる際に、同マルウェアを効果的に検知して防止するほか、LockBitランサムウェアの実行も検知して防御します。LockBitランサムウェアは、LockBitのアフィリエイトがStealBitを使用してデータを流出させた後、二重脅迫を行うために実行するプログラムです。

Cybereason Managed Detection and Response(MDR):Cybereason GSOCでは、StealBitのようなランサムウェアやデータ流出ツールを使った攻撃に対して断固とした措置を取っており、そのような攻撃を「クリティカルな高重大度インシデント」として分類しています。このようなインシデントが発生した場合、Cybereason GSOCのMDRチームは、顧客向けに包括的なレポートを発行します。このレポートは、当該インシデントに関する詳細情報を提供するものであり、侵害の範囲や顧客の環境への影響を把握するのに役立ちます。さらに、同レポートは、可能な限り帰属情報を提供するほか、脅威を軽減し隔離するための推奨事項も提供します。

StealBitマルウェアの概要

従来のランサムウェアによる脅迫手口は、悪意あるアクターがランサムウェアを使って暗号化したデータを復号化するのと引き換えに、被害者に身代金の支払いを要求するというものであり、これは常に上手くいくとは限りません。被害者は、何らかの理由で身代金を支払わない場合があるからです。たとえば、資金を持ち合わせていない、ランサムウェアオペレーターがデータを復号化できない場合があるという懸念、暗号化されたデータのバックアップが利用可能であるなどの理由が考えられます。

このため、モダンなランサムウェアオペレーターの多くは、二重脅迫の手口を利用するようになっています。この手口では、ランサムウェアオペレーターは、データを暗号化する前に、侵入先のシステムからデータを盗み出しておきます。そして、被害者がデータを復号化するための身代金の支払いを拒否するならば、悪意あるアクターは、この盗み出したデータをオンラインで流出させるか、または利益を得るためにデータを販売すると被害者を脅迫します。

ランサムウェアの世界における二重脅迫の普及は、ランサムウェア脅威の進化における大きな転換点となるものであり、多くのランサムウェアアクターがこのトレンドに便乗しています。たとえば、2021年6月にTrendMicroは、二重脅迫を使用する35種類のランサムウェアファミリーを観測したと報告しており、この傾向はますます強まっています。

二重脅迫の手口は、流出させたデータを利用するため、この手口を使用するランサムウェアオペレーターにとって、データ流出ツールは非常に重要となります。ランサムウェアオペレーターは、Rcloneのような公的に入手可能なデータ流出用ツールや、ランサムウェア攻撃での利用を意図したカスタムデータ流出ツールを使用しています。

カスタムデータ流出ツールの例としては、Ryuk Stealerをはじめ、最近発見されたExmatterやStealBitなどが挙げられます。

StealBitマルウェアは、脅威グループLockBitが開発および保守を行っているデータ(ファイルコンテンツ)流出ツールです。StealBitは、二重脅迫を目的として、攻撃者が管理しているリモートエンドポイントにファイルコンテンツを流出させます。LockBitグループは、StealBitに加えて、LockBitランサムウェアの開発および保守も行っています。同グループは、ランサムウェアの世界において強い存在感を示しています。

2021年6月現在、LockBitグループは、ランサムウェアアフィリエイトプログラムであるLockBit 2.0を運営しており、LockBitランサムウェアとデータ流出ツールStealBitへのアクセスをアフィリエイト向けに提供しています。アフィリエイトの勧誘活動の一環として、LockBitグループは、LockBitランサムウェアとStealBitの機能を宣伝しており、それらを代替ソリューションと比較しています。LockBitグループは、特にデータ流出速度に関して、StealBitの方が優れていると主張しています。


▲LockBitグループによるStealBitの宣伝(出典:KELA、Twitter)

本レポートでは、StealBitの実装とその内部動作原理について解説します。また、本レポートでは、異なるStealBitのサンプル間におけるStealBitの構成や実装面での進化について概説します。過去の調査では、StealBitの実装面の一部について、関連するStealBit構成の難読化解除の自動化を中心に文書化が行われており、StealBitによるファイルコンテンツの流出先となる、攻撃者が管理しているエンドポイントのIPアドレスが紹介されています。

また、StealBitの機能、アーキテクチャ、および進化について、詳細で包括的な洞察を提供します。StealBitの仕組みや進化に関する詳細な洞察は、同マルウェアに対する適切な検知および保護戦略を構築するために役立ちます。また、このような洞察は、悪意あるアクターがランサムウェアの導入前にStealBitを使ってデータを流出させるようなランサムウェア攻撃オペレーションをタイムリーに検知するためにも役立ちます。

StealBitマルウェアの分析

下記の「詳細な分析」セクションでは、StealBitの実装とその内部動作原理について説明します。本セクションでは、次のようなSHA-256ハッシュ値を持つ、最近のStealBitサンプルを取り上げます:6c9a92955402c76ab380aa6927ad96515982a47c05d54f21d67603814d29e4a5

続く「比較分析」セクションでは、異なるStealBitサンプルを比較し、サンプル間でStealBitの関連する構成や実装面の進化について概説します。

StealBitマルウェアの詳細な分析

StealBitはまず、プロセス環境ブロック(PEB)のNtGlobalFlagフィールドの値を評価することにより、StealBitプロセスがデバッガのコンテキストで実行されているかどうかをチェックします。NtGlobalFlagの値が0x70である場合、StealBitは次のような空の無限ループを実行します。


▲StealBitはデバッガの存在を検知する

続いて、StealBitはダイナミックリンクライブラリ(DLL)のファイル名(Advapi32、gdi32、gdiplus、shell32、ntdll、ole32、user32、shlwapi、kernel32、ws2_32)の難読化を解除した後、LoadLibraryExA関数を実行してライブラリをロードします。StealBitは、これらのDLLのXORで難読化されたファイル名を当該マルウェアの実行ファイルに格納します。


▲StealBitは複数のDLLをロードする

続いて、StealBitは、同マルウェアがマルウェア実行ファイルに格納したRC4で暗号化された文字列を復号化します。StealBitは、同マルウェアの動作全体を通じて、これらの文字列をさまざまな目的で使用します。たとえば、ある文字列はStealBitが実行するWindowsコマンドを指定し、別の文字列はStealBitが作成する名前付きパイプファイルのパスを指定します。StealBitは、マルウェアオペレーターに対していくつかの文字列を表示します。StealBitの動作におけるこれらの側面については、本セクションの後半でより詳しく説明します。


▲StealBitはRC4で暗号化された文字列を復号化する

続いて、StealBitは、NtSetInformationProcess関数を呼び出して、特定のWindowsエラーメッセージを表示しないようにプロセスを設定し、StealBitオペレーターが指定したコマンドラインパラメータをパーシングします。下記の表は、StealBitがサポートしているコマンドラインパラメータの一覧です。これらのコマンドラインパラメータがStealBitの実行に与える正確な影響については、本セクションの後半でより詳しく説明します。

コマンドラインパラメータ 説明 必須 / オプション デフォルト値
path to file or folder このパラメータは、StealBitがそのコンテンツを流出させるファイルまたはフォルダへのファイルシステムパスを指定します。このパラメータを設定すると、StealBitは、指定されたファイルのコンテンツ、またはフォルダに配置されたファイルのコンテンツを読み取った後、それを流出させます。 必須 なし
-hide/-h yes/y | no/n このパラメータは、StealBitのグラフィカルユーザーインターフェイスの可視性を制御します。つまり、このパラメータはStealBitが作成するウィンドウを非表示(yes/y)にするか、または表示(no/n)します。 オプション no/n: StealBitはウィンドウを表示する
-delete/-d yes/y | no/n このパラメータは、StealBitが自己削除を行う (yes/y) ように設定します。つまり、StealBitの実行が終了したときに、感染したファイルシステムからStealBitを実装した実行可能ファイルを削除するように設定するか、または自己削除しない (no/n) ように設定します。 オプション no/n: StealBitは自己削除を行わない
-net/-n <転送レート>

-once/-o <転送レート>
このパラメータは、指定されたレートでファイルコンテンツを流出させるようにStealBitを設定します。レートは、15秒間に流出させたファイルコンテンツの量を、KB、MB、GBのいずれかで表します。 オプション unlim:ファイルコンテンツの流出レートはない
-skipfiles yes/y | no/n このパラメータは、特定のファイル名拡張子を持つファイルのコンテンツを流出させないようにStealBitを設定します(no/n)。 オプション yes/y: StealBitは、ファイル拡張子をファイルコンテンツ流出の基準とは見なさない
-skipfolders yes/y | no/n このパラメータは、特定のフォルダに置かれたファイルの内容を流出させないようにStealBitを設定します(no/n)。 オプション yes/y: StealBitは、フォルダをファイルコンテンツ流出の基準とは見なさない
-file/-f このパラメータは、指定されたファイルサイズ(KB、MB、またはGB)と同じか、それより小さいサイズのファイルコンテンツのみを流出させるようにStealBitを設定します。 オプション unlim: ファイルコンテンツ流出のための最大ファイルサイズはない
stealbit.exe C:\Users\user\Desktop\file.db -hide y -skipfiles n
stealbit.exe C:\Users\user\Desktop\ -net 5MB -delete y -h y -skipfolders n -file 2GB

▲StealBitがサポートするコマンドラインパラメータ

コマンドラインパラメータをパーシングした後、StealBitは名前付きパイプファイル「 \??\pipe\STEALBIT-MASTER-PIPE」を作成するか、またはオープンします。名前付きパイプファイルのパスは、StealBitが事前にRC4アルゴリズムを使って復号化した文字列の1つになります。

現在のStealBitインスタンスが、マルウェアオペレーターが侵入先のシステム上で実行した最初のものである場合、StealBitはNtCreateNamedPipeFile関数を呼び出して名前付きパイプファイルSTEALBIT-MASTER-PIPEを作成した後、名前付きパイプサーバーとしての役割を担います。

このようなStealBitインスタンスを「StealBit名前付きパイプサーバー」と呼びます。現在のStealBitインスタンスが、マルウェアオペレーターが侵入先のシステム上で実行した最初のものではない場合、StealBitはNtCreateFile関数を呼び出して名前付きパイプファイルSTEALBIT-MASTER-PIPEをオープンした後、名前付きパイプクライアントの役割を担います。このようなStealBitインスタンスを「StealBit名前付きパイプクライアント」と呼びます。

要するに、StealBitは、1つの侵入先のシステム上で実行される複数のStealBitプロセス間で、名前付きパイプベースのIPCを実装することになります。本セクションの後半で示すように、これにより、StealBitオペレーターは、ファイルへのパスを設定したコマンドラインパラメータを使ってStealBit名前付きパイプクライアントを実行することで、スケーラブルな方法で多数のファイルを流出用に指定できるようになります。これにより、複数のファイルのコンテンツを流出させるための全体的なプロセスが、StealBitオペレーターにとって簡便にかつ効率的なものになります。


▲StealBitは名前付きパイプファイルSTEALBIT-MASTER-PIPEを作成するか、またはオープンする

StealBitの実行フローにおけるこの時点で、名前付きパイプサーバーの役割を担うStealBitインスタンスの実行が、名前付きパイプクライアントの役割を担うStealBitインスタンスの実行から分岐することになります。前者についてはStealBit名前付きパイプサーバーのセクションで、後者についてはStealBit名前付きパイプ クライアントのセクションでそれぞれ説明します。

StealBit名前付きパイプサーバー

名前付きパイプファイルSTEALBIT-MASTER-PIPEを作成した後、StealBit名前付きパイプサーバーは2つのスレッドを作成して起動します。1つは2つのウィンドウを作成するスレッドであり、もう1つは流出の進捗状況に関するメッセージを表示するスレッドです。

1つ目のスレッドは、CreateWindowExW関数を呼び出して、2つのウィンドウを作成します。

1つ目のウィンドウはトップレベルの親ウィンドウであり、タイトルは「StealBit 1.1」になります。2つ目のウィンドウはトップレベルウィンドウの子ウィンドウであり、したがってこのウィンドウは親ウィンドウの領域内に制限されます。子ウィンドウはフォーマットされたテキストを表示することができるため、このウィンドウはマルウェアオペレーター向けにStealBitの出力を表示します。

ここで強調しておきたいのが、-hide/-h コマンドラインパラメータをyes/yに設定すると、子ウィンドウだけが非表示となり、親ウィンドウは表示されたままになるということです。これは、StealBitのウィンドウ隠蔽機能(すなわち-hide/-hコマンドラインパラメータの実装)が完全ではないことを示しています。なぜなら、StealBitが作成したすべてのウィンドウを隠すことでは、WindowsグラフィカルユーザーインターフェイスでStealBitを見えなくすることができないからです。これは、StealBitは侵入先のシステム上でその存在を隠すというLockBitグループの主張と矛盾しています。


▲LockBitグループは、StealBitが侵入先のシステム上でその存在を隠すと主張している(出典:KELA、Twitter)


▲マルウェアオペレーターがコマンドラインパラメータ -hide/-hをno/nに設定した場合 (上の画像)でも、yes/yに設定した場合 (下の画像)でも、StealBitはウィンドウを表示する

親であるStealBitウィンドウは、ファイルまたはフォルダのドラッグ&ドロップや、F2またはShift+F2のホットキーをサポートしています。F2キーを押すと、実行を終了せずに親と子のウィンドウが閉じられるため、WindowsのグラフィカルユーザーインターフェイスでStealBitを事実上見えなくすることができます。

Shift+F2を同時に押しても効果はありません。ファイルまたはフォルダを親ウィンドウのStealBitにドラッグ&ドロップすることは、コマンドラインパラメータを指定することと同等の操作になります。このようなドラッグ&ドロップ操作を実行すると、StealBitは、ドロップされたファイルのコンテンツ、またはドロップされたフォルダに置かれたファイルのコンテンツを、後述する方法で読み取って流出させるようになります。

ドラッグ&ドロップ機能を使うと、悪意あるアクターは、リモートデスクトッププロトコル(RDP)セッションを経由するなどして、StealBitオペレーターが侵入先のシステムのグラフィカルユーザーインターフェイスにアクセスできる場合に、ファイルコンテンツを流出に利用できる多くのファイルパスやフォルダパスを、StealBitに対して簡便に提供できるようになります。これにより、多くのファイルのコンテンツを流出させるための全体的なプロセスを、StealBitオペレーターにとって簡便でかつスケーラブルなものにすることができます。

2番目のスレッドは、StealBitの全体的な動作中にアクティブになり、ファイルコンテンツの流出が実施されると、流出の進行状況を知らせるメッセージをStealBitウィンドウに表示します。フォーマット文字列を含む形式で、メッセージは「Stats: %I64d files (size %S), read speed %S/sec (compression ratio %I64d%%), upload %S/sec.」のようになります。このフォーマット文字列は、StealBitが以前にRC4アルゴリズムを使って復号化した文字列の1つになります。

2つのスレッドを作成し起動した後、StealBitは、StealBitオペレーターがStealBitのコマンドラインパラメータの値を指定することで設定可能となる設定値を表示します。さらに、StealBitは、侵入先のシステムのコンピューター名と、そのシステムが属しているドメイン名(存在する場合、上図を参照)を表示します。

続いて、StealBitは、Windows Socketネットワーキングライブラリを初期化します。StealBitは、このライブラリを使用して、StealBitによるファイルコンテンツの流出先となる「攻撃者が管理するエンドポイント」との通信を行います。StealBitは、そのような5つのエンドポイントのIPアドレスの難読化を解除します。これらのアドレスは、同マルウェアにより、StealBit実行ファイル内にXOR難読化形式で保存されます。また、StealBitは、DI0ANのような、StealBitサンプル全体のエンドポイントIPアドレスの集合を一意に識別する文字列も保存します。このような文字列を「StealBit構成ID」と呼びます。



▲StealBitは、StealBitによるファイルコンテンツの流出先となる「攻撃者が管理するエンドポイント」のIPアドレスを難読化解除する

StealBitマルウェアのスレッド化:I/O完了ポート
Windows Socketライブラリを初期化した後、StealBitはそのコア機能を確立します。その機能とは、複数の非同期I/Oリクエストを並行して処理するための、MicrosoftのI/O完了ポートスレッドモデルです。StealBitは、侵入先のシステム上のファイルコンテンツ流出アクティビティの全体的な効率性を最大化するために、I/O完了ポートスレッドモデルを実装しています。たとえば、本セクションで後述するように、StealBitは、複数のファイルのコンテンツの流出を並列化することで、全体の流出時間を短縮します。これは、ランサムウェアオペレーターにとって重要となります。なぜなら、データ流出が高速であるほど、その処理中に発見される可能性が低くなるからです。

I/O完了ポートスレッドモデルは、I/O完了ポートを作成し、そのポートに1つまたは複数のファイルハンドルを関連付けることで動作するようになります。これらのファイルハンドルの1つで非同期I/O操作が完了すると、Windowsオペレーティングシステムは、当該ポートにI/O完了パケットをキューイングします。

I/O完了パケットは、I/O操作に関する情報を運びます。この結果、アプリケーションは、I/O完了パケットを先入れ先出し(FIFO)方式でキューから取り出して処理できるようになります。アプリケーションは、ファイルハンドルに加えて、ハンドル固有のI/O完了キーをI/O完了ポートに関連付けることができます。I/O完了キーは任意のデータを運ぶことができますが、それは通常、ハンドルに関連するデータとなります。下記の図は、StealBitが実装しているI/O完了ポートスレッドモデルを表しています。


▲StealBitはI/O完了ポートスレッドモデルを実装する

StealBitは、ZwCreateIoCompletion関数を呼び出してI/O完了ポートを作成します。また、StealBitは、WindowsがポートにキューイングするI/O完了パケットを処理するためのスレッドを作成します。このスレッドを「StealBitワーカースレッド」と呼びます。StealBitは、侵入先のシステム上で利用可能となるプロセッサの数だけワーカースレッドを作成します。続いてStealBitは、ZwSetInformationFile関数を呼び出して、下記に示す3つのファイルハンドル(およびI/O完了キー)をI/O完了ポートに関連付けます。

  • StealBitによるファイルコンテンツの流出先となる「攻撃者が管理するエンドポイント」へのソケットに対するハンドル:これは、「攻撃者が管理するエンドポイント」との通信を処理するために、利用可能なワーカースレッドを割り当てます。StealBitは、同マルウェアが難読化を解除した5つのIPアドレスのそれぞれへの接続を試みます。StealBitがこれらのIPアドレスのいずれに対しても接続を確立できない場合、マルウェアは接続の確立を無期限に試みます。これらのIPアドレスの1つへの接続が成功すると、StealBitは「攻撃者が管理するエンドポイント」へのソケットをオープンし、ソケットハンドルとI/O完了キーをI/O完了ポートに関連付けます。

    また、スタティックな分析を困難にするために、StealBitは実行時にWSAIoctl 関数を呼び出して、TransmitPackets関数へのアドレスを取得します。TransmitPackets関数はStealBitにとって極めて重要です。なぜなら、同マルウェアは、この関数を使用してファイルコンテンツを流出させるからです。アプリケーションがTransmitPackets関数のグローバル一意識別子(GUID)である{0D689DA0-1F90-11D3-9971-00C04F68C876}をWSAIoctlへのパラメータとして提供する場合、WSAIoctl はTransmitPacketsへのアドレスを返します。


  • ▲StealBitは、実行時にTransmitPackets関数へのアドレスを取得する

  • 名前付きパイプSTEALBIT-MASTER-PIPEへのハンドル:これは、StealBit名前付きパイプクライアントとの通信を処理するために、利用可能なワーカースレッドを割り当てます。「StealBit名前付きパイプクライアント」セクションでは、StealBit名前付きパイプクライアントがStealBit名前付きパイプサーバーにデータを送る際に、ワーカースレッドが実行するアクティビティについて説明します。
  • StealBitがそのコンテンツを流出させるファイルへのハンドル:これは、ファイルの読み込みに成功した時点で、ファイルコンテンツの流出を処理するために利用可能なワーカースレッドを割り当てます。これにより、ファイルコンテンツ流出が並列化され、ファイルコンテンツ流出アクティビティの全体的なタイムスパンが短縮されます。読み込まれたファイルコンテンツの流出に加えて、流出目的でファイルコンテンツを読み取るのは、StealBit名前付きパイプサーバーであり、StealBit名前付きパイプクライアントではありません。

StealBitマルウェアによるファイルコンテンツの流出
StealBit名前付きパイプサーバーは、StealBit名前付きパイプクライアントから提供されるか、またはStealBitオペレーターによってコマンドラインパラメータの値として指定されたファイルやフォルダのコンテンツを読み取り、それを流出させます。「StealBit名前付きパイプクライアント」セクションでは、StealBit名前付きパイプサーバーとクライアント間の通信について詳しく説明しています。

StealBitオペレーターがコマンドラインパラメータの値としてファイルパスを指定した場合、StealBit名前付きパイプサーバーは、まずそのパスがファイルまたはフォルダのどちらを指しているかを評価します。同パスがファイルを指している場合、StealBitは、そのファイルが下記の要件の1つ以上を満たしている場合にのみ、同ファイルのコンテンツを読み取ります。

  • ファイル名の長さが4文字以下である。
  • ファイル名拡張子が、StealBitがマルウェアの実行ファイル内にハッシュ化された形式で保存している拡張子リストに存在していないこと。StealBitは、StealBitオペレーターが-skipfilesコマンドラインパラメータをno/nに設定した場合のみ、この基準を適用します。

また、ファイルサイズは0.53GB以下である必要があります。コマンドラインパラメータ-file/-fは、今回我々が分析したStealBitサンプルの実行には影響を与えません。これは、-file/-fコマンドラインパラメータの実装が不完全であることを示しています。

パスがフォルダを指している場合、StealBitは同フォルダを再帰的に反復することで、同フォルダとそのサブフォルダ内に置かれているファイルを列挙します。StealBitオペレーターが-skipfoldersコマンドラインパラメータをno/nに設定した場合、StealBitは、フォルダのリストには存在していないフォルダに含まれているファイルのみを列挙し、StealBitはそれらのファイルをマルウェアの実行ファイルにハッシュ形式で保存します。

フォルダ内のファイルを列挙した後、StealBitは、上記の条件を満たす場合に、各ファイルのコンテンツを読み取ります。ただし、システムファイル(FILE_ATTRIBUTE_SYSTEM)のコンテンツは除きます。

ファイルからコンテンツを読み取る前に、StealBitは同ファイルをオープンした後、StealBitが作成したI/O完了ポートに、ファイルへのハンドルとI/O完了キーを関連付けます。StealBitは、ZwReadFile関数を呼び出して、ファイルのコンテンツを等しいサイズのブロックに分割して読み込みます。StealBitは、このブロックサイズを、合計ファイルサイズの関数として計算します(ファイルが大きければ大きいほど、ブロックサイズも大きくなります)。

ファイルコンテンツの読み取り操作が成功するたびに、I/O完了パケットがI/O完了ポートに対して発行されます。利用可能なワーカースレッドは、このパケットを処理し、TransmitPackets関数(そのアドレスはStealBitが事前に取得済みである)を使用して、「攻撃者が管理するエンドポイント」にファイルコンテンツを流出させます。

リモートエンドポイントへの送信データ量を経時的に監視する流出検知メカニズムを回避するために、StealBitオペレーターは、-net/-nまたは-once/-oコマンドラインパラメータを設定することで、与えられたレート(15秒間に流出したファイルコンテンツの量)でファイルコンテンツを流出させるようにStealBitを設定できます。これらのパラメータは、StealBitによるファイルコンテンツの読み取り速度を制御することにより、ファイルコンテンツの流出速度を制御します。

先述したように、ファイルの読み取りアクティビティは、StealBitのI/O完了ポートに対してI/O完了パケットを発行した後、利用可能なワーカースレッドに対して、読み取ったコンテンツを流出するよう指示します。StealBitは、ZwReadFile関数の呼び出しを連続的に調整した時間だけ遅らせることで、ファイルコンテンツの読み取り速度を制御します。これにより、15秒間に読み込まれたファイルコンテンツの総量が、StealBitオペレーターの指定した流出レートを超えないように設定できます。

StealBitがZwReadFile関数を使用してファイルコンテンツを読み取るたびに、利用可能なStealBitワーカースレッドは、「攻撃者が管理するエンドポイント」に対してHTTP 1.1のPUTリクエストを発行することで、読み取ったファイルコンテンツを流出させます。StealBitは、流出したファイルコンテンツを、ランダムな名前を持つリソースとして、「攻撃者が管理するエンドポイント」上に保存します。この名前は、同マルウェアそのコンテンツを流出させたファイルごとにStealBitが生成するものとなります(たとえば、下図では03E76A538…)。StealBitが「攻撃者が管理するエンドポイント」に送信するデータとしては、次のものが挙げられます。

  • Distributed Authoring and Versioning 2 (DAV2)のヘッダー(下図ではDAV2…)。
  • StealBit構成ID(例:下図のDI0AN)
  • 侵入先のシステムのコンピューター名と、そのシステムが属しているドメイン名(存在する場合)(例:下図のNODOMAINとDESKTOP-PUK8BTP)。
  • StealBitがそのコンテンツを流出させるファイルの絶対パス(例:下図の C:\Users\\Desktop\SB_6c9a\testfile.txt)
  • StealBitが流出させるファイルコンテンツ(例:下図のHello. This is test file.)。

ファイルコンテンツは圧縮されません。この事実は、StealBitが流出したファイルコンテンツを圧縮するというLockBit脅威グループの主張と矛盾します。


▲LockBitグループは、StealBitは流出したファイルコンテンツを圧縮すると主張している(出典:KELA、Twitter)


▲StealBitは、圧縮されていないファイルコンテンツを流出させている

今回我々が分析したStealBitのサンプルは、一般的なサーバー方式でI/O完了パケットを処理するStealBitワーカースレッドをアクティブな状態に保つために、無限に実行を続けるものではありませんでした。我々が分析したStealBitは、ワーカースレッドを作成し、I/O完了ポートのスレッドモデルを確立した後、コマンドラインパラメータを処理した上で、StealBitオペレーターが有効なパラメータ値を指定しているならば、ファイルコンテンツを流出させます。

その後、StealBitは、ワーカースレッドがすべてのI/O完了パケットを処理するまで待機し、名前付きパイプファイルSTEALBIT-MASTER-PIPEをクローズします。次に、-delete/-dコマンドラインパラメータの値に応じて、StealBitは、その実行ファイルの中身を空にした上で、同ファイルを削除します。StealBitは、ShellExecuteExW関数を呼び出してこれらのコマンドを実行することで、これらのアクティビティを行います。ここで、 はStealBit実行可能ファイルのサイズ(バイト)であり、はStealBit実行可能ファイルへのパスです。

  • ping 127.0.0.7 -n 7 > Nul
  • fsutil file setZeroData offset=0 length=
  • del /f /q

最後に、StealBitはその実行を終了します。


▲StealBitはその実行ファイルを削除する

StealBit名前付きパイプクライアント

StealBit名前付きパイプクライアントは、名前付きパイプファイルSTEALBIT-MASTER-PIPEをオープンした後、ファイルの内容の読み取りと流出をStealBit名前付きパイプサーバーに委任します。これを実現するために、StealBit名前付きパイプクライアントは、通信プロトコルに従ってStealBit名前付きパイプサーバーとの通信を行います。

下図は、このプロトコルを表したものです。StealBit名前付きパイプクライアントがStealBit名前付きパイプサーバーにデータを送信すると、StealBit名前付きパイプサーバーが作成するI/O完了ポートに対して、I/O完了パケットが発行されます(StealBit名前付きパイプサーバーのセクションを参照のこと)。その後、StealBit名前付きパイプサーバーのワーカースレッドが、このパケットを処理します。StealBit名前付きパイプサーバーは、StealBit名前付きパイプクライアントとの通信を処理するワーカースレッドを使用して、下図に示すようなサーバーアクティビティを実施します。


▲StealBit名前付きパイプクライアントは、StealBit名前付きパイプサーバーと通信する

STEALBIT-MASTER-PIPEをオープンし、StealBit named pipeサーバーに接続した後、StealBit名前付きパイプクライアントは、サーバーに「00 00 00 00」という4バイトを送信することで、クライアントの存在をアナウンスします。StealBit名前付きパイプサーバーは、接続の状態を追跡します。StealBit名前付きパイプクライアントが自分自身をアナウンスすると、サーバーは、接続の状態を更新してクライアントの接続が成功したことを示すことにより、クライアントの存在を確認します。

続いて、StealBit名前付きパイプクライアントは、StealBit名前付きパイプサーバーと同じ方法でコマンドラインパラメータの値を処理します(「StealBit名前付きパイプサーバー」のセクションを参照のこと)。ただし、StealBit名前付きパイプサーバーとは対照的に、StealBit名前付きパイプクライアントは、ファイルの内容を読み取って流出させるのではなく、次の手順に従って、このタスクをサーバーに委任します。

  • クライアントは「01 00 00 00」の4バイトをサーバーに送信し、クライアントがサーバーにファイルパスを送信しようとしていることを示します。このファイルパスは、サーバーがその内容を読み取って流出させるファイルのパスです。StealBit名前付きパイプサーバーは、接続の状態を更新して受信したファイルパスを示すことにより、通信を確認します。
  • クライアントは、ファイルパスの長さを指定する4バイトを、ヌル終端のUnicode文字列形式でサーバーに送信します。たとえば、クライアントがファイルパスC:\Users\user\Desktop\file.txt をサーバーに送信しようとする場合、クライアントは「3E 00 00 00」という4バイトをサーバーに送信します(16進数の0x3Eは10進数で62になります)。StealBit名前付きパイプサーバーは、接続状態を更新した後、クライアントが送信したファイルパスの長さと同じサイズの仮想メモリ領域を確保します。
  • クライアントは、このファイルパスをサーバーに送信します。StealBit名前付きパイプサーバーは、接続状態を更新した後、このファイルパスを事前に割り当てられたメモリ領域に格納した上で、同ファイルパスが指しているファイルの内容を読み取って流出させます(「StealBit名前付きパイプサーバー」のセクションを参照のこと)。
  • ファイルコンテンツの読み取りと流出をStealBit名前付きパイプサーバーに委任することで、悪意あるアクターは、複数のファイルパスをコマンドラインパラメータに設定したStealBit名前付きパイプクライアントを実行することにより、スケーラブルな方法で多数のファイルを流出用に指定できるようになります。

その後、StealBit名前付きパイプクライアントはサーバーとの接続をクローズし、-delete/-dコマンドラインパラメータの値に応じて、StealBit名前付きパイプサーバーと同じ方法で、その実行ファイルを削除します。続いて、StealBit名前付きパイプクライアントは、その実行を終了します。コマンドラインパラメータ「-hide/-h、-net/-n、-once/-o」は、StealBit名前付きパイプクライアントの実行には影響しません。

StealBitマルウェアの比較分析

下記の表には、本レポート執筆時点でセキュリティコミュニティが観測したStealBitのサンプルのうち、本レポートの記述範囲に含まれているStealBitの構成面および実装面を考慮して選んだものが掲載されています。なお、参照のために、各サンプルには、接頭辞SB_と、サンプル SHA-256ハッシュの最初の4つの16進数を表す接尾辞から構成されるコードネームが付けられています。

SB_3407
SHA-256ハッシュ 3407f26b3d69f1dfce76782fee1256274cf92f744c65aa1ff2d3eaaaf61b0b1d
VirusTotalへの初回投稿日付 2021-08-06
SB_107d
SHA-256ハッシュ 107d9fce05ff8296d0417a5a830d180cd46aa120ced8360df3ebfd15cb550636
VirusTotalへの初回投稿日付 2021-09-09
SB_6c9a
SHA-256ハッシュ 6c9a92955402c76ab380aa6927ad96515982a47c05d54f21d67603814d29e4a5
VirusTotalへの初回投稿日付 2021-11-08
SB_6b9a
SHA-256ハッシュ 6b9aa479a5f9c6bfee52046c1afa579977dfcde868fdad3f18fdcd1779535068
VirusTotalへの初回投稿日付 2021-11-26

▲代表的なStealBitのサンプル

下記の表は、選択されたStealBitサンプル(列「サンプル」)を、次のような構成面および実装面に関して比較したものです。

  • StealBitによるデータの流出先となる「攻撃者が管理するエンドポイント」のIPアドレスと、それが置かれている地理的場所(列「IPアドレス」と「場所」)。
  • StealBitが解析対策として実装しているデバッガ検出方法(列「デバッガ検出」)。
  • コマンドラインパラメータと、それぞれが持つマルウェア機能(列「コマンドラインパラメータ」)。
  • 複数のファイルのコンテンツの流出をStealBitオペレーターにとって簡便にかつ効率的にする、名前付きパイプIPCインフラストラクチャ(列「IPC」)。
  • データ流出アクティビティの全体的な効率性を最大限に高めるI/O完了ポートスレッドモデル(列「I/O完了」)。
  • 実行およびファイルコンテンツの流出に関する条件(コラム「実行条件」)。
サンプル IPアドレス 場所
SB_3407 88.80.147[.]102

168.100.11[.]72

139.60.160[.]200

193.38.235[.]234

174.138.62[.]35
ブルガリア

オランダ

米国

ロシア

米国
SB_107d 93.190.139[.]223

168.100.11[.]72

139.60.160[.]200

193.38.235[.]234

174.138.62[.]35
オランダ

オランダ

米国

ロシア

米国
SB_6c9a 185.182.193[.]120 オランダ
SB_6b9a 185.182.193[.]120 オランダ

▲StealBitサンプルの比較:攻撃者が管理するエンドポイント

サンプル デバッガ検出 コマンドラインパラメータ IPC I/O完了 実行条件
SB_3407 NtGlobalFlag path to file or folder あり あり ロケーション
SB_107d path to file or folder ロケーション
SB_6c9a path to file or folder, -hide/-h, -delete/d, -net/-n, -once/-o, -skipfiles, -skipfolders, -file/-f なし
SB_6b9a path to file or folder, -hide/-h, -delete/-d, -net/-n, -once/-o, -skipfiles, -skipfolders, -file/-f なし

▲異なるStealBitサンプル間の比較

今回我々が分析したStealBitサンプルのデータ流出先である「攻撃者が管理するエンドポイント」の大部分は、オランダや米国を筆頭として欧米諸国に配置されています。すべてのStealBitサンプルは、最大限の流出効率性、使用上の利便性、およびスケーラビリティを実現するために、名前付きパイプベースのIPCとI/O完了ポートスレッドモデルを実装しています。また、すべてのStealBitサンプルは、PEBのNtGlobalFlagフィールドの値を評価することにより、StealBitプロセスにアタッチされているデバッガの存在を検出し、デバッガが存在する場合は空の無限ループを実行します。

StealBitマルウェアの新旧バージョン比較

今回我々が分析したStealBitのサンプル間の大きな違いとして、コマンドラインパラメータと各サンプルがサポートするマルウェアの機能が挙げられます。比較的古いStealBitサンプルは、コマンドラインパラメータである「-hide/-h、-delete/-d、-net/-n、-once/-o、-skipfiles、-skipfolders、-file/-」をサポートしておらず、これらのパラメータが設定する自己削除やデータ流出レートなどの機能もサポートしていません。

これは、StealBitが新機能(特に回避および隠蔽機能)に関して改良を続けてきたことを示しています。また、比較的古いサンプルは、旧ソ連圏諸国(ロシア、ウクライナ、ベラルーシ、タジキスタン、アルメニア、アゼルバイジャン、ジョージア、カザフスタン、キルギスタン、トルクメニスタン、ウズベキスタン、モルドバ)にあるシステム上では実行されないことも大きな違いと言えます。StealBitは、システムのデフォルト言語に基づいて、侵入先のシステムが置かれている場所を決定します。比較的新しいサンプルは、このような制限を実装していないため、あらゆるシステム上で実行されます。

StealBitマルウェアの検知と防止

Cybereason GSOC MDR

Cybereason GSOCでは、下記のことを推奨しています。

  • NGAV(次世代アンチウイルス)製品Cybereason NGAVのアンチランサムウェア機能を検知(Detect)および防止(Prevent)モード に設定して有効にすること。
  • 発信ネットワークトラフィックを定期的に監視することで、データ流出アクティビティの有無をチェックすること。
  • Cybereasonによる脅威ハンティング:Cybereason MDRチームは、MDRサービスを提供しています。

IOC(Indicators Of Compromise:痕跡情報)

実行ファイル SHA-256 hash: 3407f26b3d69f1dfce76782fee1256274cf92f744c65aa1ff2d3eaaaf61b0b1d

SHA-256 hash: 107d9fce05ff8296d0417a5a830d180cd46aa120ced8360df3ebfd15cb550636

SHA-256 hash: 6c9a92955402c76ab380aa6927ad96515982a47c05d54f21d67603814d29e4a5

SHA-256 hash: 6b9aa479a5f9c6bfee52046c1afa579977dfcde868fdad3f18fdcd1779535068
名前付きパイプ STEALBIT-MASTER-PIPE
IP アドレス 88.80.147[.]102

168.100.11[.]72

139.60.160[.]200

193.38.235[.]234

174.138.62[.]35

93.190.139[.]223

185.182.193[.]120

MITRE ATT&CKとの対応

実行

権限昇格

防御回避

検出

流出

【ホワイトペーパー】ランサムウェア対策ガイド~二重脅迫型など進化するランサムウェアから情報資産を守るために~

近年、世界中で深刻な問題となっているランサムウェア

このガイドは、日本における深刻な問題やランサムウェアの歴史を踏まえ、最新のランサムウェア攻撃にはどのような特徴や脅威があるのかについて解説するとともに、巧妙化するランサムウェアに対し私たちはどのような対策を講じれば良いのか。最新のランサムウェア攻撃への5つの対策ポイントをご紹介します。
https://www.cybereason.co.jp/product-documents/white-paper/6525/