Windowsを標的とするランサムウェア「NailaoLocker」に仕込まれた罠

文●フォーティネットジャパン 編集●ASCII

提供: フォーティネットジャパン

  • この記事をはてなブックマークに追加
  • 本文印刷

本記事はフォーティネットジャパンが提供する「FORTINETブログ」に掲載された「NailaoLockerランサムウェアの「罠」」を再編集したものです。

影響を受けるプラットフォーム:Microsoft Windows
影響を受けるユーザー    :Microsoft Windows
影響            :侵害を受けたマシンの大半のファイルが暗号化される
深刻度           :高

 FortiGuard Labsは最近、Microsoft Windowsシステムを標的とするランサムウェアであるNailaoLockerに遭遇しました。多くのランサムウェアファミリーと同様、ユーザーファイルを暗号化するためにAES-256-CBCを使用します。他と異なる点は、ハードコードされたSM2暗号化キーと組み込みの復号化機能が存在することで、これは一般的でない組み合わせであり、意図について即座に疑念を抱かせます。

 「Nailao」という名前は中国語で「チーズ」を意味し、これは単なるふざけた名前ではないのかもしれません。このランサムウェアは、ペイロードに復元機能が埋め込まれているという珍しい機能を持っていることが明らかになっています。あるいは、被害者やセキュリティ研究者を欺くために敷かれた罠である可能性もあります。この場合、被害者の解決策には、別の罠も敷かれている可能性があります。

図1:ASN.1 DER形式でハードコードされたSM2のキーペア

 本ブログでは、NailaoLockerの実行フロー、暗号化と復号化のルーチン、SM2暗号化の使用など、詳細な技術プロファイルについて分析します。また、この亜種が実際に脅威をもたらすのか、もしくは悪用可能な欠陥が露呈するのかについて評価します。

読み込みと実行

図2:NailaoLockerの復号化と読み込みに使用されるDLLサイドローディング

 NailaoLockerは、次の3つのファイルセットとして対象システムに配布されます。

・usysdiag.exe:DLLサイドローディングに使用される正規の実行ファイル
・sensapi.dll:悪意のあるDLLローダー(NailaoLoaderと呼ばれる)
・usysdiag.exe.dat:難読化されたNailaoLockerのペイロード
 
 攻撃者がusysdiag.exeをトリガーし、DLLサイドローディング技術を使用して悪意のあるsensapi.dllをロードすることで、実行が開始されます。このDLLは、実際のランサムウェアペイロード(usysdiag.exe.dat)を復号化し、メモリに直接ロードします。NailaoLoaderは、デジタル証拠の痕跡を最小限に抑えるため、実行後直ちにメモリから自身のライブラリを解放し、sensapi.dllを削除します。

 また、複数のインスタンスが同時に実行されないように、NailaoLockerは、lockv7という名前のミューテックス(相互排他)を作成します。

図3:NailaoLoaderはメモリを解放しDLLを削除

初期化

 ロード後、NailaoLockerは、ハードコードされた値と文字列「XXXX」を突き合わせて確認し、有効化するモード(暗号化または復号化)を判断します。この亜種は、コマンドライン引数によるモードの選択をサポートしておらず、スイッチが組み込まれており、内部使用またはテスト用に予約されていることが示唆されます。

 このランサムウェアは、実行を続行する前に、一連のセットアップタスクを実施します。コンソールウィンドウを起動してリアルタイムなステータス更新を表示することで、活動を隠す意図がないことを示します。また、ログファイルを%ProgramData%\lock.logに作成して、暗号化または復号化プロセス全体の進捗状況を記録します。

 このランサムウェアは暗号化モードでは、XOR変換による単純なデコードルーチンを使用して、自身のバイナリからランサムノートを取得します。ランサムノートはその後、対象ディレクトリにドロップされます。

図4:コンソールの起動および%ProgramData%\lock.logの作成

マルチスレッド実行

 NailaoLockerはパフォーマンスを最適化するために、WindowsのIOCP(I/O Completion Port)を介して調整されたマルチスレッドアーキテクチャを使用します。このような設計により、マルチプロセッサコアを通じて、高スループットな暗号化または復号化を実現します。

 IOCPは、CreateIoCompletionPort()を呼び出して初期化されます。メインスレッドは、ファイルシステムの走査を実施し、対象のファイルハンドルをIOCPキューに送ります。その間、各ワーカースレッドは、ハンドルがキューに表示されるのを待ちます。ファイルを受け取ると、スレッドは必要に応じて、暗号化または復号化を実行します。

 このモデルによりファイルの検出と処理を切り離すことで、ランサムウェアは、利用可能なCPUリソース全体を使用して効率的に規模を拡大することができます。

 システムで利用可能な論理プロセッサの数は、GetSystemInfo()関数を呼び出して判断します。ランサムウェアは、この情報を使用して8つ以上のワーカースレッドを作成することで、ファイル操作を同時に処理することができます。これにより、コア数が少ないシステムであっても、並列処理のベースラインレベルが保証されます。

図5:CreateIoCompletionPort()を使用してIOCPをセットアップし、マルチスレッドを作成

 次のセクションでは、暗号化と復号化という異なる2つの実行モデルを調べ、機能について詳細な分析を行います。

キーペアの準備

 このNailaoLocker亜種の独特の特徴は、ハードコードされたSM2のキーペアがASN.1 DER形式で埋め込まれていることです。これらのキーは、暗号化と復号化の両方で使用されます。

 図1に示すように、埋め込まれているキーは、公開鍵と秘密鍵を含む構造になっています。公開鍵は、楕円曲線暗号に基づいており、SM2曲線上のポイントを定義するX座標とY座標を含みます。秘密鍵はランサムウェアのサンプルで見られることは稀ですが、秘密鍵も存在しており、テスト用のビルドまたは別のユースケースの可能性が示唆されます。

図6:埋め込まれたSM2キーペアを復号化モードで抽出

 抽出後、両キーは、OpenSSLのEVP_PKEY_CTX_new()関数を使用して初期化されます。ハードコードされた文字列「SM2」からのマッピングにより、数字識別子が0x494に設定され、暗号化関数に渡されます。このことは、ASN.1構造内に、予測される曲線OID「06 08 2A 81 1C CF 55 01 82 2D」が存在することからも裏付けられます。

図7:SM2がID 0x494にマッピングされ、曲線IDと一致

暗号化モード

 NailaoLockerは、暗号化モードで実行する場合、対象ファイルを特定し、それらをAES-256-CBCを使用して暗号化するという2つの主要なタスクを実行します。また、各対象ディレクトリにランサムノートが付加されます

ファイルの走査

 NailaoLockerはまず、システム上のすべての論理ドライブを列挙します。アクセス可能なディレクトリで、暗号化するファイルを再帰的に検索しながら、特定のシステムパスを意図的にスキップすることで、感染したホストの不安定化を回避します。

除外されるファイル拡張子:
・.exe
・.dll
・.sys

除外されるディレクトリおよびファイル:
・\Boot
・\Windows
・\Program Files
・\Program Files (x86)
・\ProgramData
・\AppData
・\Application Data
・boot.ini
・unlock_please_view_this_file.html
 
 対象ファイルを特定した後、ワーカースレッドで処理するために、ファイルハンドルがIOCPキューにプッシュされます。また、列挙された各ディレクトリにはランサムノートもドロップされます。

図8:ファイルの暗号化に合わせて配布されるNailaoLockerのランサムノート

ファイルの暗号化、AESキーの生成、キーの保護

 IOCPに送られた各ファイルはワーカースレッドで処理され、ユニークなAESキーとIV(初期化ベクトル)を使用して暗号化ルーチンが実行されます。

 各スレッドの開始時に、NailaoLockerは38個の_OWORD(16バイト)要素に対してメモリを割り当てます。このスペースを使用して、AESキー、IV、SM2暗号化バージョン、および関係するメタデータを格納します。

 このランサムウェアは、BCryptGenRandom()を使用することで、各ファイルに対して32バイトのAESキーおよび16バイトのIVを生成します。

図9:スレッド単位でAESキーとメタデータ用のメモリを割り当て

 これらの値は、AES-256-CBCアルゴリズムを使ったファイル暗号化に使用されます。通常、ランサムウェアでは、RSAを使ってAESキーとIVを保護しますが、NailaoLockerは、楕円曲線暗号アルゴリズムのSM2を使用します。これは、ランサムウェアで、対称鍵暗号のファイル暗号化キーを保護するためにSM2が使用された初めて記録された事例だと思われます。

図10:SM2暗号化を使用してAESキーとIVを保護

 SM2が生成する出力は固定長でないため、このランサムウェアは、暗号化されたAESキーとIVのサイズを、2つの_WORDフィールドに格納します。完全なメモリレイアウトを以下に示します。

・v17[2]+8:AESキー(32バイト) – 緑
・v17[4]+8:AES IV(16バイト) – オレンジ
・v17[5]+8:暗号化されたAESキー(可変サイズ) – 青
・v17[21]+8:暗号化されたAES IV(可変サイズ) – ピンク
・v17[37]+8:暗号化されたAESキーのサイズ(4バイト) – 灰色
・v17[37]+C:暗号化されたAES IVのサイズ(4バイト) – 茶色

図11:AESキー、IV、およびSM2暗号化バージョンのメモリダンプ

暗号化プロセス

 NailaoLockerは各対象ファイルに対して拡張子.lockedを付加し、ファイル属性をFILE_ATTRIBUTE_HIDDENに設定します。次に、操作ごとに最大0x10000バイト(64KB)のデータを読み取ります。

 このランサムウェアは、OpenSSLのEVPインタフェースを介して、AES-256-CBCアルゴリズムを使用して暗号化を実行します。含まれるプロセスを以下に示します。

1. EVP_EncryptInit_ex() :AES暗号、AESキー、およびIV(どちらもBCryptGenRandom()を介して生成、図9を参照)を使用して暗号化コンテキストを初期化します。
2. EVP_EncryptUpdate() :ファイルの内容をブロック単位で暗号化し、ファイルストリームをサポートします。
3. EVP_EncryptFinal_ex() :残りのバイトを処理し、PKCS#7パディングを適用します。

 元の内容は、暗号化されたデータに置き換えられます。

図12:OpenSSL AES-256-CBCを使用したファイル暗号化ルーチン

 このランサムウェアは復号化を容易に行うために、LARGE_INTEGER(8バイト)を割り当てることで、元のファイルサイズを保持します。この値は、暗号化されたファイルの先頭の8バイトに格納されるため、復号化ツールは、キー情報を含むフッターに移動できます。

図13:先頭の8バイトに元のファイルサイズを格納

 ランサムウェアにより、暗号化されたペイロードの後に構造化されたフッターが付加されます。このフッターは4バイトのマーカー4C 56 37 00(「LV7」)で始まり、暗号化キーセクションの開始を示します。

図14:暗号化されたファイルの最後に、保護されたファイル暗号化キーを格納

 元ファイルの内容は、ファイルサイズを格納するためにシフト処理(移動)されます。また、暗号化のパディングにより、ファイルサイズが拡張されます。これらのバイトは、「LV7」フラグの前のスペースには収めることはできず、暗号化されたAESキーとIVの後に配置されます。NailaoLockerは、「LV7」マーカーの後に、残りのすべての暗号化データとオーバーフローデータを順序を固定して格納します。図15は、このレイアウトを色分けしたものです:

・4バイト:暗号化されたAESキーのサイズ – オレンジの枠線
・可変:暗号化されたAESキー – 白の枠線
・4バイト:暗号化されたAES IVのサイズ – 緑の枠線
・可変:暗号化されたAES IV – ピンクの枠線
・4バイト:AESで暗号化された残りのデータサイズ - 黄色の枠線
・可変:暗号化された残りのデータ – 灰色の枠線

図15:SM2で保護されたキーとオーバーフローデータを含む暗号化されたファイルのフッター

 暗号化が完了すると、NailaoLockerは、ファイルの元の最終編集時のタイムスタンプを復元し、拡張子.lockedを付けて名前を変更します(まだ適用されていない場合)。次に、暗号化の合計時間を、done [time]の形式でコンソールに出力します。ここで、[time]は、暗号化の処理時間を示します。

復号化モード

 このランサムウェアは復号化モードでは、SM2の秘密鍵を使用して、暗号化された各ファイルの最後に格納されているAESキーとIVを再構築する必要があります。次に、各ディレクトリを走査して、暗号化されたファイルを検索し、復号化プロセスを実行して、元の状態にファイルを復元します。

 このセクションでは、復号化プロセスについて詳しく説明し、ASN.1 DER形式で埋め込まれているSM2秘密鍵の正確性を検証します。復号化モードを開始するために、ハードコードされた値を「XXXX」と同じになるように変更し、ランサムウェアにモードの切り替えを促します。

 復号化モードに切り替えると、ファイル走査関数が調整され、拡張子「.locked」を持つファイルを検索し、それらを処理するためにIOCPキューに追加されます。

 復号化プロセスを高速化するために、再度、8つ以上のスレッドが作成されます。

キーの取得

 各スレッドはまず、暗号化されたファイルのフッターを解析します。ランサムウェアは「LV7」マーカーを検索し、後に続く以下のデータを読み取ります。

・暗号化されたAESキーのサイズ
・暗号化されたAESキー
・暗号化されたAES IVのサイズ
・暗号化されたAES IV

 AESキーとIVの両方の復号化には、埋め込まれたASN.1 DERブロックから先ほど抽出したSM2秘密鍵が使用されます。

図16:復号化ルーチンでAESキーとIVを検索して抽出

ファイルの復号化

 AESキーとIVが復元されたら、OpenSSLのEVPインタフェースの以下の関数を介して、AES-256-CBCを使用してファイルの内容が復元されます。

1. EVP_DecryptInit_ex()は、コンテキストを初期化します。
2. EVP_DecryptUpdate()は、内容をブロック単位で復号化します。
3. EVP_DecryptFinal_ex()は、パディングを削除し、出力を確定します。

図17:SM2を使用して復号化され、OpenSSL EVP介して適用されたAESキーとIV

 残念ながら、テストでは埋め込まれたSM2秘密鍵を使用して、AESキーを正常に復号化することができず、キー情報が不完全か意図的に機能していない可能性が示唆されます。一方で、暗号化時に捕捉された正しいAESキーとIVを手動で指定すると、復号化機能が期待どおり実行され、元のファイルの内容が正常に復元されることが、FortiGuardのアナリストによって確認されました。

結論

 本分析では、埋め込まれたSM2のキーペアと復号化のビルトイン機能を特徴とするランサムウェアの亜種であるNailaoLockerの詳細な技術プロファイルについて説明しました。埋め込まれたSM2の秘密鍵は実際には機能しませんが、テストの中で有効なAESキー情報を指定すると、復号化ロジックが正常に動作することが確認され、開発中の系統か内部テスト用のビルトの可能性が示唆されます。

 特に、AESファイル暗号化キーを保護するために、中国のSM2暗号化標準を使用しており、従来のランサムウェアの手法とは顕著な相違が見られます。FortiGuard Labsは引き続き、地域固有のアルゴリズムのさらなる利用、およびNailaoLockerの積極的なデプロイメントに向けた進展の兆候について監視する予定です。

フォーティネットのソリューション

 FortiGuard Labsは、以下のアンチウイルスシグネチャを使用して、NailaoLockerランサムウェアのサンプルを検知します。

・W64/Shadowpad.U!tr
・W64/Filecoder.SZ!tr
・W64/Filecoder.SZ!tr.ransom

 FortiEDRFortiXDR、およびFortiDeceptorには追加的な保護が備わっており、異常な振る舞いを検知し、悪意のある暗号化の試みをリアルタイムに阻止し、ランサムウェアを本番環境から遠ざけることができます。

 すべての保護は、フォーティネットのグローバルセンサーネットワーク、パートナーCERT、および信頼できる脅威インテリジェンスアライアンス全体で共有されるリアルタイムインテリジェンスに基づいて継続的に更新されます。

 フォーティネットは、すべての組織で、以下を含む強力なランサムウェア防御態勢を維持することを推奨しています。
外部公開されているシステムに対する定期的なパッチの適用

・ネットワークのセグメント化
・振る舞いベースの検知を利用したエンドポイント保護
・オフラインストレージを使用したバックアップの暗号化手法
・従業員の意識向上、およびフィッシングに耐性があるEメールセキュリティ

 お客様の組織で、NailaoLockerやその他のランサムウェアの影響を受けていると思われる場合は、当社のグローバルインシデントレスポンスチームが、検知、封じ込め、修正、および復旧をサポートします。

IOC(Indicators of Compromise:侵害指標)

NailaoLockerランサムウェア(sha256)
1248c4b352b9b1325ef97435bd38b2f02d21e2c6d494a2218ee363d9874b7607
46f3029fcc7e2a12253c0cc65e5c58b5f1296df1e364878b178027ab26562d68
60133376a7c8e051da787187761e596ce9b3d0cfcea21ed8f434992aa7cb8605

■関連サイト