** 本記事は、A doubled “Dragon Breath” adds new air to DLL sideloading attacks の翻訳です。最新の情報は英語記事をご覧ください。**
ソフォスは最近、古典的なサイドローディングシナリオをベースに、いくつかのレイヤーを追加してさらに複雑化した悪意のある DLL サイドローディング攻撃を確認しました。さらに、ソフォスの調査により、実行犯はこの自前のシナリオを気に入っており、複数の亜種を使用し、DLL サイドローディングプロセスの検出を回避するために特定のコンポーネントを繰り返し入れ替えていたことが判明しました。
この攻撃の初期の形態は、主に Sinophone CTFIoT と Zhizu のブログで、以前にも取り上げられたことがあります。今回の攻撃は、正規のアプリケーション、悪意のあるローダー、暗号化されたペイロードからなる古典的なサイドローディング攻撃に基づいており、これらのコンポーネントにさまざまな変更が加えられ続けています。最新の攻撃では、第一段階の正規アプリケーションが第二段階の正規アプリケーションを「サイドロード」し、自動で実行するという工夫が施されています。さらに、第二段階の正規アプリケーションが、悪意のあるローダー DLL をサイドロードします。その後、悪意のあるローダー DLL が最終的なペイロードを実行します。
図 1:最近確認された新たな段階を含んだ DLL サイドローディングのイメージ図。正規のアプリケーションは青いボックスと青いアウトラインで、悪意のある攻撃段階はオレンジのボックスに赤色の文字、および赤で囲まれた部分で示されています。上図は、各亜種の詳細を紹介するときに再度表示されます。
この攻撃を実行する攻撃者は、「Operation Dragon Breath」、「APT-Q-27」、「Golden Eye Dog」などと呼ばれており、オンラインカジノとその参加者を主な標的としていると考えられています。この攻撃者は、2 種類の正規アプリケーションを用いた攻撃シナリオを気に入っており、2 段目のアプリケーションを他の正規アプリケーションに置き換えたシナリオを複数用意しています。
当初の攻撃は、オンラインカジノを利用している中国語圏の Windows ユーザーを標的としており、最初の感染経路は Telegram を通じて配信されました。現在までに、日本、フィリピン、台湾、シンガポール、香港、中国を標的にした攻撃が確認されています。ソフォス製品は通常、サイドローディングのプロセス中に攻撃をブロックするため、ペイロードは一切実行されず、ユーザーは保護されます。
図 2:Operation Double Dragon Breath による攻撃が確認された地点
今回の調査では、2 つの正規インストーラーを用いたアプローチにいくつかの亜種があることが確認されました。主な相違点は攻撃の第二段階で悪用されるプログラムの差し替えであり、この変更によって二次的な効果が生じるのも確認されています。以下では、各段階で最も多く確認されたコードを紹介し、それらの亜種にも触れていきます。
最初の侵害:感染経路
調査を初めてまもなく、Android、iOS、Windows 向けの中国語版 Telegram アプリケーションを配信しているとする Web サイト (telegramos[.]org) を発見しました。この Web サイト (ソフォス製品や他のセキュリティソフトでは悪意のあるサイトとしてフラグが立てられています) のダウンロードリンクをクリックすると、以下の画像の通り、Web サイト上での OS の選択を無視し、ブラウザの User-Agent 文字列に基づいたバージョンが配信されることがあります。
図 3:User-Agent 文字列を Android のものにした状態で「Windows」ボタンをクリックすると、Android アプリが配信されました
図 4:User-Agent 文字列を IE に変更した場合
感染したユーザーは、この Web サイトから感染の原因となったパッケージをダウンロードしたと考えられています。フィッシングや SEO ポイズニングなど、ユーザーがこの Web サイトまでたどり着いた経緯は複数考えられますが、今回の調査では対象外です。
第一段階のインストーラー:Telegram
上述の通り、これらの攻撃の初期段階には、悪意のある Telegram のインストーラーが関係していました。本記事の後半では、他の「おとり」アプリケーションがどのように使用されたかの事例をいくつか紹介しますが、Telegram が最も一般的であり、この事例を分析することで、今回の攻撃がどのように機能するのか、概要を理解できます。
悪意のある Telegram インストーラー (SHA256:097899B3acb3599944305b064667e959c707e519aef3d98be1741bbc69d56a17) は実行されると、サイドローディングパッケージをインストールし、実行します。
図 5:正規のセットアップ画面に扮した悪意のあるインストーラー
サイドロードされたパッケージは複数のコンポーネントをシステムにインストールし、ユーザーの AppData フォルダ内のディレクトリにドロップします。
図 6:悪意のあるインストーラーからの「贈り物」
同時に、デスクトップにショートカットも作成します。しかし、このショートカットをクリックしても Telegram のプログラムは実行されず、代わりに以下のような見慣れないコマンドが実行されます。
C:\Users\{ユーザー名}\AppData\Roaming\Tg_B518c1A0Ff8C\appR.exe /s /n /u /i:appR.dat appR.dll
上のコマンド内の appR.exe は regsvr32.exe という Windows コンポーネントをリネームしたものです。appR.exe は Windows コンポーネントのスクリプト実行エンジン scrobj.dll をリネームしたものである appR.dll ライブラリを実行します。さらに、appR.dat に格納された Javascript コードを実行します。
図 7:実行される「山賊」コード
ショートカットをクリックすると、JavaScript のコードが実行されます。ユーザーには、正規品の Telegram に似せたデスクトップ UI が表示されますが、その説明のほとんどは中国語です。
図 8:Telegram のデスクトップ UI をほぼ直訳した説明文
しかし、その裏ではさまざまなサイドローディングコンポーネントがディレクトリにドロップされています。
図 9:悪意のあるファイルが保存されたディレクトリ
また、インストーラーはユーザーのスタートアップディレクトリにショートカットファイルを作成します。マルウェアは上述のように常駐化し、システム起動後に自動で実行されます。
図 10:正規のアプリケーションに扮した、悪意のあるショートカット。「Application.exe」は攻撃の次の段階で再度登場します。
サイドローディングコンポーネントとスタートアップリンクは、デスクトップの Telegram リンクが実行されて初めて作成されます。動的解析のサンドボックスでは、ドロップされたサイドローダーファイルは確認できなかったため、解析対策の手法が使われている可能性があります。
第一段階の亜種その 1:LetsVPN インストーラー
Telegram インストーラーの他に、トロイの木馬化された LetsVPN インストーラー (SHA256: e414fc7bcd80a75d57ee4fdbb1c80a90a0993be8e8bbbe0decfc62870a2e1e86) も確認されました。悪意のあるパッケージは Telegram のインストーラーと同一ですが、紐づけられている正規のアプリケーションは LetsVPN です。
図 11:今回確認された LetsVPN の亜種は、初期画面は中国語に翻訳されている一方、インストール画面は英語でした
Telegram のインストーラーの場合と同様に、デスクトップにショートカットが作成されます。ショートカットに紐付けられたプログラムは、サイドロードパッケージの最終的なインストールを行う JavaScript コードを呼び出します。
図 12:アイコンは異なりますが、リンク先のアプリケーションは同一
第一段階の亜種その 2:WhatsApp インストーラー
今回の調査では、インストーラーファイルは直接確認できませんでした。一方、テレメトリでは、Whatsapp.msi というファイルが実行された後、上記の 2 つの例と同一の悪意のあるファイルがインストールされる事例が観測されています。
\roaming\whatsapp_ae2b02\appmain.exe : 91e4eb7517f55ac93b1da109539aa0011e9346be41704dc0da360ebad0f3f63d \roaming\whatsapp_ae2b02\appr.dll : e25289d44403a6f6132a470fdbe6b46eade466d08eca0ad44fca519592c54fdf \roaming\whatsapp_ae2b02\appr.exe : fffa7a97fba9dfb235f969ecce0e5c4a71a48a37c1bc79b77cd78f0ab72f993d \roaming\whatsapp_ae2b02\littleunzip.exe : 81046f943d26501561612a629d8be95af254bc161011ba8a62d25c34c16d6d2a \roaming\whatsapp_ae2b02\app-2.2232.8\whatsapp.exe : 8d92c7d7f301bc0e4965dbd9253933a4580883805119dd7c27788d04c17d595e c:\users\public\application2\application.exe : c936f1598721a9a92d7f31c6c13b55013b8a2a344e3df4156e5b033006336544 c:\users\public\application2\xlgameupdate.exe : 769d59d03036af86c7a9950f03ebc7b693a94d3e2f8ecd1d74cf5600ab948105 c:\users\public\application2\libexpat.dll : 31d2076066107bd04ab24ff7bbdf8271aa16dd1d04e70bd9cc492e9aa1e6c82b c:\users\public\application2\basicnetutils.dll : ae2e145b36ab2ed129a2d34de435b76a1f4e5a4820d9d623e7018b87f24d0648
第二段階:さらなるサイドロード
前述の通り、今回の調査で最も興味深かったのは、DLL サイドローディングの新しい亜種、つまり攻撃の第二段階として「正規の」アプリケーションが使用されるのが確認されたことです。攻撃のすべての亜種において最初 (第一段階のローダー) と最後 (実行されるペイロード) は共通であり、唯一異なるのがこの第二段階のサイドローディングでした。
上の図 8 では、インストーラーがデスクトップに残したショートカットのリンク先である「Application.exe」を紹介しました。Application.exe は図 11 にも再度登場しています。このファイルは、実際には Shenzhen Thunder Networking Technologies Ltd によって署名されたプログラム XLGame.exe ですが、攻撃者によって Application.exe にリネームされています。このファイルは、パッケージの一部である libexpat.dll と依存関係があります。
図 13:攻撃者が、特定の名前のファイルを発見すると自動更新を行う、正規だが脆弱なアプリケーション (Application.exe と名付けられていますが実際には XLGame.exe です) を利用する様子。悪意のあるファイル名は上図と同様に右側のオレンジ色のボックスに表示されており、攻撃者がファイル名を変更したものは引用符付きで示されています。
図 14:XLGame のデジタル署名は、Application.exe にリネームされた後も、特に異常は示しません
XLGame は、同じディレクトリに XLGameUpdate.exe という名前のプログラムを見つけると、自動的に更新を行います。悪意のあるパッケージは、この自動更新機能を利用して、XLGameUpdate.exe という名前の実行ファイルをドロップしますが、これは本物のファイルではありません。このファイルは、実際には Beijing Baidu Netcom Science and Technology Co.,Ltd によって署名された正規の .exe ファイルです。
図 15:XLGameUpdate.exe は実際には別の、無名のアプリケーションですが、「Application.exe」(本当は XLGames.exe) を騙して実行できるように名前が変更されています。
これ以降は、旧来の DLL サイドロードプロセスが実行されます。この第二段階のローダーは、BASICNETUTILS.dll に依存しており、攻撃者はこのファイルを悪意のあるローダー DLL に置き換えます。悪意のあるローダー DLL は、同じディレクトリにある templateX.txt を見つけて内容を読み込み、ペイロードローダーのシェルコードを復号化して実行します。(図 7 にあるように、これらのファイルはすべて同じディレクトリに配置されています。)
第二段階:さらなるサイドローディング (亜種その 1)
冒頭で述べたように、攻撃者はサイドロードの過程でさまざまな正規のアプリケーションを別のものに差し替える二重の DLL サイドロード戦略を非常に気に入っているようです。図 16 は、上述の攻撃方式とよく似たフローですが、第二段階のローダーに用いられる正規の実行ファイルが異なっています。そのため、悪意のあるローダー DLL は、置き換えられた正規アプリケーションの依存関係に対応するように名前を変更する必要があります。
図 16:攻撃者は図 13 と同じ攻撃手順を実行していますが、「XLGameUpdate.exe」の箇所を新しいプログラムに差し替えているため、右上の DLL も別のものに差し替えられています。上図と同様、悪意のあるファイル名は右側のオレンジ色のボックスに表示され、攻撃者によって名前が変更されたファイルは引用符付きで示されています。
また、「Application.exe」は実際には XLGames.exe です。第二段階のクリーンローダーは再度 XLGameUpdate.exe にリネームされていますが、本来の (本当の) 名称は KingdomTwoCrowns.exe です。このローダーはデジタル署名されていないため、Baidu によって署名された正規のローダーをこのローダーに置き換えるメリットは不明です。
図 17:この亜種でも実際に実行されるのは XLGameUpdate ではなく、正規の「KingdomTwoCrowns」
このファイルの PDB パスは以下の通りです。
C:\buildslave\unity\build\artifacts\WindowsPlayer\Win32_nondev_i_r\WindowsPlayer_Master_il2cpp_x86.pdb
この第二段階のローダーは通常のサイドローディングのシナリオに使用されます。依存する UNITYPLAYER.dll は、悪意のあるローダー DLL に置き換えられます。悪意のあるローダーは、同じディレクトリにある templateX.txt を見つけて内容を読み込み、ペイロードローダーのシェルコードを復号化して実行します。
このように、第二段階の正規ローダーは異なりますが、この亜種における二段階目の悪意のあるローダーとペイロードファイルは、前節で説明した亜種と(名前が変更されていることを除いて) 基本的に同じです。実際、両方のシナリオで暗号化されたペイロードファイルの 1 つ (3fc9405cfe9272323bd96aacfd082c16b392fea6e0f108545138026aa6f79137) が使用されていました。(ペイロードについては、最後のセクションで説明します。)
第二段階:さらなるサイドローディング (亜種その 2)
このシナリオでは、第二段階のローダーとして用いられる正規の実行ファイルを、HP がかつて提供していた、デジタル署名された正規のツールに差し替えます。 この方式は前述のものと非常に似ていますが、第二段階のローダーに用いられる正規の実行ファイルが異なるため、置き換えられた正規アプリケーションの依存関係に対応するように悪意のある DLL の名前を変更する必要があります。
図 18:中央上部の XLGameUpdate に HP のツール、右上のハイライト部分に別の DLL を配置した、二段階サイドローディングのもう一つの亜種上記の例と同様に、悪意のあるファイル名は右側のオレンジ色のボックス、攻撃者によって名前が変更されたファイルは引用符付きで示されています。
第二段階の正規ローダーは、再度 XLGameUpdate.exe にリネームされます。本来の名称は d3dim9.exe であり、HP Inc. によってデジタル署名されています。
図 19:今回の例では、XLGameUpdate にリネームされたアプリケーションは、実際には HP の署名入りの正規アプリケーションになっている
この第二段階のローダーは、通常のサイドローディングシナリオに使用されます。今回の依存先である d3dx9_43.dll は、悪意のあるローダー DLL に差し替えられます。この DLL は、同じディレクトリにある templateX.txt を見つけ、内容を読み込み、ペイロードローダーのシェルコードを解読し、実行します。
第三段階:悪意のある DLL
第二段階のローダーにはいくつかの興味深い亜種がありましたが、すべての亜種は暗号通貨ウォレットの盗難という同一の目的を持っています。そのため、今回調査したペイロードは、かなり共通の部分を持っています。
第二段階の最後に、用いられる正規ローダー (どの亜種かにかかわらず) は特定の DLL を呼び出し、攻撃者が同じディレクトリに置いた悪意のある、同じ名前のファイルを古典的な DLL サイドローディング方式で取得します。悪意のある DLL は、template.txt からペイロードをロードし、復号化します。
ペイロードの暗号化は、SUB と XOR をビット単位で単純に組み合わせたものです。
int __fastcall decrypt(int a1, int a2) { int result; // eax for ( result = 0; result < a2; ++result ) *(_BYTE *)(result + a1) = (*(_BYTE *)(result + a1) - 122) ^ 0x19; return result;
復号化されるのはローダーシェルコードであり、最終的なペイロードを解凍して実行します。以下の実行ログが、最終的なペイロードの解凍を示しています。
4010ae GetProcAddress(LoadLibraryA) 4010ae GetProcAddress(VirtualAlloc) 4010ae GetProcAddress(VirtualFree) 4010ae GetProcAddress(lstrcmpiA) 401153 LoadLibraryA(ntdll) 4010ae GetProcAddress(RtlZeroMemory) 4010ae GetProcAddress(RtlMoveMemory) 40148e VirtualAlloc(base=0 , sz=20a00) = 600000 401635 GetProcAddress(LoadLibraryA) 401697 LoadLibraryA(ntdll) 401635 GetProcAddress(RtlDecompressBuffer) 4016bd RtlDecompressBuffer(fmat=102,ubuf=600000, usz=20a00, cbuf=4016e3, csz=16789) (Outsz: 20a00) = 0 4011e2 VirtualAlloc(base=0 , sz=26000) = 621000 4011f9 RtlMoveMemory(dst=621000, src=600000, sz=400) 401235 RtlMoveMemory(dst=622000, src=600400, sz=17e00) 401235 RtlMoveMemory(dst=63a000, src=618200, sz=4c00) 401235 RtlMoveMemory(dst=63f000, src=61ce00, sz=1800) 401235 RtlMoveMemory(dst=643000, src=61e600, sz=200) 401235 RtlMoveMemory(dst=644000, src=61e800, sz=2200) 4012ed LoadLibraryA(KERNEL32.dll)
図 20:最終的なペイロードの解凍
この後、シェルコードは最終的なペイロード DLL をメモリにロードし、実行します。
第四段階:ペイロード
ペイロード DLL には、下品な名前のエクスポートが 1 つだけ含まれています。
dllname: ServerDll.dll 0 1 0x14780 0x15380 F■ck
このエクスポートにより、レジストリにフラグキーが作成されます。GetComputerName が値を返す場合は、HKCU\SOFTWARE\%COMPUTERNAME% というキー名が、それ以外の場合には UnkNow というキー名が使用されます。
図 21:フラグキーは、エクスプロイトが悪用されたマシンの名前を取得する
このキーの下に、以下のような複数の値が格納されます。
- Time:マルウェアのインストール日時を記録します
- CopyC:更新された C2 アドレス (XOR 5 + BASE 64 で、バイト単位でエンコードされたもの)
- ARPD: | で区切られた名前のリスト。それぞれに対して新しいリストを作成し、isARDll、PluginMe、getDllName、あるいはエクスポート名などの文字列を検索します
- ZU: Chrome 拡張機能のウォレットシードを読み込む手順でこの値が使用されます。高確率でウォレットコンテンツの流出先情報を提供します
- Remark:ホスト名を保存します
バックドアは、一連の数値コマンドコードに対応しています。
コード | アクション |
0 | シャットダウン/再起動/ログオフ |
1 | |
2 | レジストリキーを「Remark」に設定する |
3 | レジストリキーを「ZU」に設定する |
4 | イベントログを消去する |
5 | nkbihfbeogaeaoehlefnkodbefgpgknn 拡張のステータスを取得する |
6 | ファイルをダウンロードして実行する |
8 | ShellExecute ウィンドウを表示してコマンドを実行する |
9 | ShellExecute ウィンドウを非表示にしてコマンドを実行する |
112 | クリップボードのコンテンツを取得する |
113 | クリップボードのコンテンツを設定する |
125 | cmd ウィンドウを非表示にしてコマンドを実行する |
126 | ファイルにバッファーを記述して、実行する |
128 | レジストリキー CopyC を設定する |
35-37,101-111, 127 | エクスポート PluginMe、isARDL、getDllName、isCSDll などをチェックする |
また、MetaMask に関連する文字列も含まれています。MetaMask は、Chrome の拡張機能などで利用できる暗号通貨 (Ethereum) ウォレットです。過去には、暗号通貨ウォレットの盗難を狙う攻撃者が、この拡張機能をインストールしたユーザーを標的にしていました。今回の攻撃もその一例のようです。
C:\Users\%s\AppData\Local\Google\Chrome\User C:\Users\%s\AppData\Local\Google\Chrome\User Data\Default\Extensions\nkbihfbeogaeaoehlefnkodbefgpgknn\
C2 サーバー名である nsjdhmdjs[.]com は、Operation Dragon Breath (別名 「APT-Q-27」あるいは「Golden Eye Dog」) に関連しています。上述の DLL サイドローディングや、ServerDll.dll という名前も、この攻撃者による攻撃の特徴の一つです。
第四段階:ペイロードの亜種 – デバッグビルド版と gh0st RAT
また、VirusTotal において、通常よりも多くの内部情報を含む特定のバージョンのペイロード (SHA256: d86f1292d83948082197f0a29fcb69fdec9feb4bf3898d7b8e693c7d5a28099c) が発見されました。また、これは通常のペイロード (DLL) とは異なり、実行ファイルです。
PDB パスは通常通りです。
D:\Work\3远控\企业远程控制\Debug\ServerDll.pdb
しかし、このペイロードには、悪名高い gh0st RAT のソースコードが含まれています。ソースアーカイブは攻撃のいずれかの段階でドロップされますが、gh0st RAT のコードが実行されることはありません。
hFile = CreateFileA(lpFileName, 0x40000000u, 1u, 0, 2u, 0, 0); if ( hFile == (HANDLE)-1 ) v4 = 0; if ( WriteFile(hFile, &gh0st_rat_src, 0xE5B1Au, &NumberOfBytesWritten, 0) ) v4 = 1; CloseHandle(hFile); return v4;
この検体の C2 アドレスは 23[.]225[.]147[.]227 です。
また、VirusTotal では、gh0st RAT のソースコードを含む同様のサンプル (sha256: 64613eadd91a803fe103bef5349db04ddfc01b8d115ba7a24a694563123d38ad) を確認しましたが、デバッグ情報および PDB 情報は確認できませんでした。これらのデバッグ版は、いずれも被害が確認されている地域の 1 つである香港から VirusTotal に提出されており、実際に攻撃に使用された可能性が高いと考えられます。
セキュリティ侵害の痕跡 (IoC) の一覧は、ソフォスの GitHub で公開されています。
結論
2010 年に Windows 製品で初めて確認されて以降、複数のプラットフォームで流行している DLL サイドローディングは、攻撃者にとって効果的かつ魅力的な攻撃手法であり続けています。Dragon Breath グループが採用している、この二重の正規アプリを用いた手法は、従来のセキュリティ研究者があまり目を向けてこなかった分野 (オンラインカジノ) のユーザーを標的にしており、この手法が依然として有効であることを表しています。この技術の使用に対する将来の展望は本記事による調査の対象外ですが、防御者は、本記事で紹介した攻撃手順を一読しておく価値はあるでしょう。
謝辞
ソフォスは、本記事への貢献に対し、SophosLabs の Xinran Wu および X-Ops Comms の Andrew Brandt に謝意を表します。