マカフィーATR、RaaSであるSodinokibi、別名REvilを分析
目次
エピソード 1:コードが示すもの
マカフィーのAdvanced Threat Research Team(ATR)は、2019年4月末に広がったSodinokibi(別名REvil)と呼ばれる新しいランサムウェアファミリーを観察しました。それと同じ時期に、GandCrabランサムウェアの運用者が活動を終了すると発表しました。単なる偶然でしょうか? それとも何か裏があるのでしょうか?
この一連のブログでは、SodinokibiとGandCrabとの関係についての最新の分析を、McAfee ATRの詳細かつ広範な研究から独自に得た新しい洞察を用いて提供します。
・エピソード 1 コードが示すもの
・エピソード 2 オールスターズ
・エピソード 3 金の流れを追え
・エピソード 4 漸増
連載の1回目では、広範なマルウェアと感染後の分析を共有し、新たに追加されたブラックリスト掲載のスクリプト言語と、Sodinokibiによるサイバー攻撃の厳密な規模についての洞察を提供します。
背景
2019年4月に「Sodinokibi」、別名「REvil」が新たに出現して以来、その脅威の深刻さが明らかになりました。Sodinokibiの名は、ハッシュccfde149220e87e97198c23fb8115d5aで発見されました。内部ファイル名として「Sodinokibi.exe」で表示され、REvilの名前でも知られています。
最初に、Sodinokibiランサムウェアは、OracleのWebLogicサーバの脆弱性をエクスプロイトして、自己増殖することが観察されました。ただし、他のランサムウェアファミリーと同様にSodinokibiも、いわゆるRansomware-as-a-Service(RaaS)と呼ばれるもので、あるグループがコードを保有し、アフィリエイトと呼ばれる別のグループがランサムウェアを拡散します。
このモデルでは、アフィリエイトは好きな方法でランサムウェアをばらまくことができます。一部のアフィリエイトは、フィッシング攻撃とエクスプロイトキットを使用した大規模な攻撃を指向し、別のアフィリエイトは、RDPアクセスを総当たり攻撃したり、ツールとスクリプトをアップロードしたりする標的を絞り込んだアプローチを利用して被害者の内部ネットワークで多くの権限を取得し、ランサムウェアを実行します。Sodinokibiを広めるサイバー攻撃をいくつか調査しました。そのほとんどは異なる手口を使っていましたが、多くはRDPサーバの侵害から開始していることを確認しました。
だれが、どこでSodinokibiを仕掛けるのか?
MVISION Insightsの可視性に基づいて、2019年5月から8月23日までに観察された感染の画像を以下に作成しました。
だれを標的にしているのかというと、多くは組織です。とはいえ実際のところ、誰が、どの地域で運営しているか、さまざまなアフィリエイトグループのスキルや専門知識次第です。
コードを逆にする
この最初のエピソードでは、コードについて掘り下げるとともに、被害者のマシンを侵害した後のランサムウェアの内部動作を説明します。
全体として、コードの記述は出来が良く、ランサムウェアの構成で定義されたファイルを暗号化するために迅速に実行するように設計されています。組み込み構成ファイルには、興味深いいくつかのオプションがあることを、これからこの記事で明らかにしていきます。
GandCrabとSodinokibiの間で行ったコードの比較分析の結果、Sodinokibiランサムウェアの背後にいる人々は、GandCrabの一団と何らかの関係を持っている可能性が高いと考えられます。
コードの内部
Sodinokibiの概要
この記事では、次のハッシュ(パック)でサンプルを調査しました。
このマルウェアの主な目的は、他のランサムウェアファミリーと同様、ファイルを暗号化した後、作成者やアフィリエイトによるファイルの解読ツールと引き換えに金銭を要求することです。
調査したマルウェアのサンプルは32ビットのバイナリで、パックされたファイルにはアイコンがあり、アンパックされたファイルにはアイコンがありません。パッカーはVisual C ++でプログラムされており、マルウェア自体は純粋なアセンブリで記述されています。
技術面の詳細
パッカーの目標は、真のマルウェアパーツを解読し、メモリから実行するためにRunPE技術を使用することです。マルウェアをメモリから取得するために、解読が完了してメモリに読み込まれた後、アンパックされたバージョンを取得するためにダンプしました。
マルウェアの最初のアクションは、実行時に必要なすべての機能を取得し、静的分析でWindows呼び出しを難読化しようとする動的なIATを作成することです。
マルウェアの次のアクションは、ハードコーディングされた名前でミューテックスを作成しようとすることです。マルウェアには内部で暗号化された文字列の95%があると知っておくことが重要です。マルウェアの各サンプルには、多くの場所で異なる文字列があることに留意してください。キーまたはシードとしての値は常に変化し、企業として私たちがすること、すなわち文字列を解読するために特定のマルウェアサンプルから値を取得することなく、ワクチンを作成したり、1つの解読プログラムを作成したりすることを回避します。
ミューテックスが存在する場合、マルウェアは「ExitProcess」を呼び出して終了します。これはランサムウェアの再起動を回避するために行われます。
このミューテックス操作の後、マルウェアはサンプルごとに変化する特別なシードを使用して、データの一部のCRC32ハッシュの計算もします。このCRC32演算は、テーブルではなくCRC32多項式演算に基づいており、高速化し、コードサイズを小さくしています。
次のステップは、CRC32チェックが成功したら、このデータブロックを解読することです。チェックが失敗した場合、マルウェアはこのコードフローを無視し、このレポートで後述するように、エクスプロイトの使用を試みます。
マルウェアがCRC32のチェックに合格し、サンプルごとに変化するキーで正しく解読された場合、データのブロックは解析されるメモリにあるJSONファイルを取得します。この構成ファイルには、被害者のキーとマルウェアの動作を変更するさらなる情報を暗号化するためのキーを後で準備するフィールドがあります。
CRC32のチェックは、別の構成で暗号化されたデータを誰かが変更できる可能性を回避し、マルウェアのCRC32値を更新しません。
JSONファイルの解読後、マルウェアは完全なJSONパーサーのコードでそれを解析し、すべてのフィールドを抽出して、これらのフィールド値をメモリに保存します。
構成内のすべてのフィールドとその意味を説明しましょう。
・pk->base64でエンコードされたこの値は、暗号化プロセスで後に重要になる。攻撃者の公開鍵。
・pid->サンプルに属するアフィリエイト番号
・sub->アフィリエイトが支払いを追跡するために使用するサンプルのサブアカウントまたはサイバー攻撃ID
・dbg->デバッグオプション。最終バージョンで、実行されたこととされなかったことを確認するために使用されるもの。trueまたはfalseの開発オプションで拡散されたサンプルは、falseであった。設定されている場合、キーボードチェックは後から行われない。マルウェア開発者にとって、マルウェアがスクリプト言語に基づいて自分のマシンを検出することなく、重要な部分で正しく機能すると証明することは有用。
・fast->このオプションが有効で、デフォルトで多くのサンプルがそれを有効にさせる場合、マルウェアは各ターゲットファイルの最初の1 MB、またはこのサイズより小さい場合はすべてのファイルを暗号化する。このフィールドがfalseの場合、すべてのファイルを暗号化する。
・wipe->このオプションが”true”の場合、マルウェアはjsonフィールド「wfld」に記述されているフォルダー内のターゲットファイルを破棄する。論理ユニットとネットワーク共有でこの構成フィールドに表示される名前を持つすべてのフォルダーで、破棄が発生。ファイルの上書きは、サンプルに応じて、ごみ箱データまたはNullデータによって行われる可能性がある。
・wht->このフィールドにはいくつかのサブフィールドを持つ
・fld->暗号化すべきではないフォルダー。システムおよびプログラム内の重要なファイルの破棄を避けるため、ホワイトリストに登録されている。
・fls->名前ごとのファイルのホワイトリストの一覧。これらのファイルは暗号化されることはなく、システム内の重要なファイルの破棄を防ぐのに役立つ。
・ext->拡張子に基づく暗号化を避けるためのターゲット拡張子のリスト
・wfld->ワイプオプションが有効な場合にファイルが破棄されるフォルダーのリスト
・prc->「mysql.exe」などのプログラムによってロックされているファイルをロック解除するために強制終了するプロセスのリスト
・dmn-> netオプションが有効な場合にマルウェアに使用されるドメインのリスト。このリストはサンプルごとに変更でき、被害者の情報を送信できる。
・net->この値は、false または true。デフォルトでは通常trueですが、マルウェアは、構成の「dmn」フィールドのドメインリストにインターネットアクセスできる場合、被害者に関する情報を送信する。
nbody->base64でエンコードされた大きな文字列で、マルウェアが作成できる各フォルダーに表示される身代金メモのテンプレート。
・nname->身代金メモファイルのマルウェアの名前の文字列。これは、実行時にランダムになる部分を持つテンプレート。
・exp->このフィールドは構成の点で非常に重要。デフォルトでは通常「false」。「true」の場合、または構成のハッシュのチェックに失敗した場合は、エクスプロイトCVE-2018-8453を使用する。このエクスプロイトは常に機能するとは限らず、ファイルを暗号化して身代金を要求するというマルウェアの目的を回避する「死のブルースクリーン」を引き起こす可能性があるため。エクスプロイトが機能する場合、プロセスをSYSTEMユーザーに昇格させる。
・img-> base64でエンコードされた文字列。これは、このテキストを使用してデスクトップの壁紙を変更するために、マルウェアが実行時に作成する画像のテンプレート。
マルウェアの構成を解読した後、それを解析します。そして、マルウェアは「exp」フィールドをチェックし、値が「true」の場合、OSのメジャーバージョンとマイナーバージョンを報告するPEBフィールドを使用してOSのタイプを検出します。
通常、OSは1つしか見つかりませんが、マルウェアにとってはそれで十分です。マルウェアは、ファイル時間をチェックして、日付がエクスプロイトを修正するためのパッチがインストールされる前か後かを確認します。ファイル時間がパッチのファイル時間より前の場合、「GetSystemNativeInfoW」関数を使用してOSが64ビットか32ビットかを確認します。OSシステムが32ビットの場合、エクスプロイトであるマルウェアに組み込まれたシェルコードを使用します。64ビットOSの場合、「Heaven’s Gate(天国の門)」を使用できる別のシェルコードを使用して、32ビットのプロセスで64ビットのコードを実行します。
フィールドがfalseだった場合、またはエクスプロイトにパッチが適用された場合、マルウェアはPEBを使用してOSバージョンを再度チェックします。OSがWindows Vistaの場合、最低でも独自のプロセストークンから実行特権のレベルを取得します。検出された特権レベルが0x3000未満の場合(システムまたはSYSTEMで実際の管理者としてプロセスが実行されていることを意味します)、0x2000または0x1000の実行レベルから0x3000プロセスに昇格させるために「runas」コマンドを使用してプロセスを再起動します。「runas」コマンドで自分自身を再起動すると、マルウェアインスタンスは終了します。
マルウェアの次のアクションは、実行特権がSYSTEMかどうかを確認することです。SYSTEMの場合、マルウェアはプロセス「Explorer.exe」を取得し、プロセスを起動したユーザーのトークンを取得して、ユーザーになりすまします。それはSYSTEMから特権が低い別のユーザーへのダウングレードで、後にSYSTEMユーザーのデスクトップに影響を与えないようにします。
この後、構成を再度解析し、被害者のマシンの情報を取得します。この情報は、マシンのユーザー、マシンの名前などです。マルウェアは、被害者IDを準備して、16進数の1つの文字列で連結された2つの32ビット値に基づき、影響を受ける人を確認します。
これらの2つの値の最初の部分は Windowsメインロジックユニットのハードディスクの シリアル番号で、 2番目は サンプルごとに変化するハードコーディングされたシードを保有する Windowsロジックメインユニットの シリアル番号の CRC32ハッシュに由来する CRC32ハッシュ値です。
この後、マシンの取扱者の名前のCRC32ハッシュを作成するため、その結果はシードとして使用されます。ただし、取扱者のこの名前は、GandCrabがするようには、Windows APIを使用して抽出されません。この場合、マルウェア作成者は一段の難読化を試すためオペコードCPUIDを使用します。
最後に、これらの値を16進表記の文字列に変換して保存します。
その後実行中に、マルウェアはサブキー「SOFTWARE \ recfg」(このサブキーはサンプルによっては変更できますが、通常は変更されません)の次のエントリをWindowsレジストリに書き込みます。
主なエントリは次のとおりです。
・0_key->タイプバイナリ。これがマスターキー(マルウェア作成者のキーと共に後で暗号化するために被害者が生成したランダムキーを含む)。
・sk_key-> 0_keyエントリとして暗号化された被害者の秘密鍵。サンプルでハードコーディングされたアフィリエイトの公開鍵がある。アフィリエイトが解読で使うキーだが、これはマルウェア作成者がファイルを解読するための2次的リソースとして任意のサンプルで暗号化された任意のファイルを常に解読できることを示している。
・pk_key->秘密鍵から派生した被害者の公開鍵
・subkey->使用するアフィリエイト公開鍵
・stat->被害者のマシンから収集され、暗号化された身代金メモとドメインへのPOST送信に使用される情報
・rnd_ext->暗号化されたファイルのランダムな拡張子(5〜10文字の英数字)
マルウェアは、一見するとHKEY_LOCAL_MACHINEハイブにサブキーとエントリを書き込もうとしますが、失敗すると、HKEY_CURRENT_USERハイブに書き込みます。
マルウェアが被害者のマシンから取得する情報は、ユーザー名、マシン名、マシンが属するドメイン、もしくはワークグループ、製品名(OS名)などです。
このステップが完了すると、マルウェアは構成から収集された「dbg」オプションをチェックします。その値が「true」の場合、マシンのスクリプト言語のチェックを回避しますが、値が「false」の場合(デフォルトで)、マシン言語をチェックし、ハードコーディングされた値のリストと比較します。
マルウェアは、次のブラックリストに載っているスクリプト言語のリストと照合します(場合によっては、サンプルごとに変更できます)。
・0x818 – Romanian
・0x419 – Russian
・0x819 – Russian (Moldova)
・0x422 – Ukrainian
・0x423 – Belarusian
・0x425 – Estonian
・0x426 – Latvian
・0x427 – Lithuanian
・0x428 – Tajik
・0x429 – Persian
・0x42B – Armenian
・0x42C – Azeri
・0x437 – Georgian
・0x43F – Kazakh
・0x440 – Kyrgyz
・0x442 -Turkmen
・0x443 – Uzbek
・0x444 – Tatar
・0x45A – Syrian
・0x2801 – Arabic (Syria)
GandCrabやAnatovaと同様に、Sodinokibiも通常のシリア語とアラビア語シリア方言をブラックリストに載せていることがわかりました。さらに、ルーマニア語とペルシャ語が、このリストに新しく追加されています。これらの言語のいずれかがシステムに含まれている場合、アクションを実行せずに終了します。別の言語が検出された場合、通常のフローで続行されます。
これは興味深く、このいずれかの言語を習得しているアフィリエイトが関与していることを示唆しています。この洞察は、調査の後半で特に興味深いものになりました。
マルウェアが継続する場合、構成内のフィールド「prc」のリスト内のすべてのプロセスを検索し、プロセスを通じてロックされたファイルのロック解除のため、ループで終了させます。
この後、被害者のマシンのすべてのシャドウボリュームを破棄し、このコマンドでリカバリブートの保護を無効にします。
・exe / c vssadmin.exe Delete Shadows / All / Quiet&bcdedit / set {default} recoveryenabled No&bcdedit / set {default} bootstatuspolicy ignoreallfailures
Windows関数「ShellExecuteW」で実行されます。
次に、構成「wipe」のフィールドをチェックし、真の場合は、ランダムなゴミまたはNULL値ですべてのファイルを破棄して削除します。マルウェアがファイルを破棄すると、すべての論理ユニットの列挙が始まり、最終的にネットワークは構成フィールド「wfld」に表示される名前を持つフォルダーを共有します。
アフィリエイトがこのフィールドに多数のフォルダーを定義したサンプルを作成する場合、ランサムウェアはマシン全体の堅牢なワイパーになります。
マルウェアの次のアクションは、すべてのロジックユニットとネットワーク共有のファイルを暗号化し、ホワイトリストのフォルダーとファイルと拡張子の名前を回避し、各フォルダーのテンプレートから準備された身代金メモを残すという中心的な機能です。
この手順を完了すると、マシンに影響するランダムな拡張子で作成された構成ファイルに含まれるテキストを使用して、実行時のデスクトップのイメージを作成します。
次のステップでは、構成から「net」フィールドを確認し、真の場合、「dmn」フィールドの構成ファイルにあるドメインリストにPOSTメッセージの送信を開始します。
コードのこの部分は、この記事の後で説明するGandCrabのコードと類似しています。
このステップの後、マルウェアは変数と文字列内の自身のメモリを消去しますが、マルウェアコードは削除しません。ただし、RAMから情報を収集できるダンプまたはフォレンジックツールを回避するために重要なコンテンツを削除します。
エクスプロイトの後にマルウェアがSYSTEMとして実行されていた場合、マルウェアはその権限を取り消し、最終的に実行を終了します。
GandCrabとのコード比較
展開されたSodinokibiサンプルとGandCrabのv5.03バージョンを使用して、なんらかの類似点がないかを観察するためにIDAとBinDiffを使い始めました。コールグラフに基づけば、2つの間に全体で40%のコードのオーバーラップがあるようです。
ほとんどのオーバーラップは、両方のファミリーの機能にあるようです。コードを調べると、値は変わりますが、同様のパターンとフローが明らかになりました。
いくつかの違いがありますが、構造は似ています。
ランダムなURL生成の原因となるコード部がGandCrabマルウェアでの生成方法に関する類似性があることについては前述しました。Sodinokibiはこの部分を実行するために1つの関数を使用しており、そこではGandCrabが3つの関数を使用してランダムURLを生成しています。似たような構造は、両方のマルウェアコードで生成されるURL向けのパーツで見られます。比較をわかりやすく説明するために画像を作成しました。
両方のランサムウェアファミリーがURLを生成する方法がどれだけ違っても、使用されるURLディレクトリとファイル拡張子は、偶然以上の類似性を持っていることがわかります。この観察は、Tesorionのブログでも指摘されています。
全般的に、構造と偶然の観点から見れば、GandCrabコードの開発者がそれを新しいファミリーを作成するためのベースとして使用したか、もしくは別の仮説としては、リークされたGandCrabソースコードを入手した者が新しいRaaS Sodinokibiを立ち上げたと考えられます。
結論
Sodinokibiは、世界中に多くの被害者を生んだ深刻な新型のランサムウェアの脅威です。私たちの調査では、ルーマニア語とペルシャ語の2つの新しい言語がコードの構成で確認されました。GandCrabや他のランサムウェアファミリーではこれまで確認されなかったもので、キーボードにこの言語がインストールされていれば影響を受けないということです。
GandCrabとSodinokibiを比較する詳細な分析を実行し、多くの類似点を発見しました。これは、Sodinokibiの開発者がGandCrabのソースコードと改善点にアクセスしていたことを示しています。Sodinokibiのサイバー攻撃は現在進行中であり、このサイバー攻撃を仕掛けるさまざまなアフィリエイトによってスキルとツールが異なるので、答えを出すべき問題は膨らむばかりです。どのように動作するのか?アフィリエイトモデルは機能しているのか?McAfee ATRにはその答えがあります。
エピソード2「オールスターズ」をお楽しみに。
Coverage
マカフィーはこのファミリーを次のシグネチャーで検出しています。
・“Ransom-Sodinokibi”
・“Ransom-REvil!”.
MITRE ATT&CK Techniques
マルウェアサンプルでは、次のMITER ATT&CK™テクニックを使用しています。
・File and Directory Discovery
・File Deletion
・Modify Registry
・Query Registry
・Registry modification
・Query information of the user
・Crypt Files
・Destroy Files
・Make C2 connections to send information of the victim
・Modify system configuration
・Elevate privileges
YARAルール
rule Sodinokobi
{
/*
This rule detects Sodinokobi Ransomware in memory in old samples and perhaps future.
*/
meta:
author = “McAfee ATR team”
version = “1.0”
description = “This rule detect Sodinokobi Ransomware in memory in old samples and perhaps future.”
strings:
$a = { 40 0F B6 C8 89 4D FC 8A 94 0D FC FE FF FF 0F B6 C2 03 C6 0F B6 F0 8A 84 35 FC FE FF FF 88 84 0D FC FE FF FF 88 94 35 FC FE FF FF 0F B6 8C 0D FC FE FF FF }
$b = { 0F B6 C2 03 C8 8B 45 14 0F B6 C9 8A 8C 0D FC FE FF FF 32 0C 07 88 08 40 89 45 14 8B 45 FC 83 EB 01 75 AA }
condition:
all of them
}
※本ページの内容は、2019年9月25日(US時間)更新の以下のMcAfee Blogの内容に一部日本の情報を追記しています。
原文:McAfee ATR Analyzes Sodinokibi aka REvil Ransomware-as-a-Service – What The Code Tells Us
著者:McAfee Labs